进程、线程、协程、并发、并行、IO多路复用

2023-05-16

目录

一、什么是IO操作

二、进程、线程、协程

1、进程是资源分配的基本单位

2、线程是任务调度的基本单位

3、协程—由线程创建并全权负责的小弟

三、并行、并发及其与CPU内核数的关系

1、理解并行与并发的区别

2、进程、线程与CPU核数之间的关系

3、同一个进程里的线程可以并行执行吗(满足条件时可以)

四、IO多路复用

五、参考文(zi)献(liao)


我竟然妄想在小小的篇幅下把这四件事讲明白,离谱,但又不太离谱~

在多线程、多进程、并行、并发这几个概念中,有很多知识点容易让人第一次看完后还是模棱两可的,这里主要是对概念细节的记录,因为我原来学的时候多少也是似懂非懂的,最近又系统地过了一遍,发现了原来很多认知上的小误解,在这里统一做下梳理与记录。 

一、什么是IO操作

IOInput 与 Output 首字母的组合,就是表示对数据的输入输出操作。

第一次接触 IO 是学习单片机的时候,把单片机的引脚叫做 IO 口,单片机的 IO 口操作就是对高低电平的读写操作,但本质上还是对字节流的读写。网络编程中的IO其实也是一样的,都是对字节流的读写操作:读写文件是IO操作、socket/TCP/UDP这些都是IO操作,只要有数据交换的地方都有IO操作。

二、进程、线程、协程

三者间的关系:没有线程的进程是没有灵魂的,协程是线程养的一帮小弟,完全由线程统一调控。

1、进程资源分配的基本单位

何谓资源分配?资源分配就是系统分配给这个进程的内存空间、CPU、磁盘IO等等。进程本身不能执行任何任务。可以这么理解:进程只是为线程抢了一块肥沃的土地,并配备了一系列齐全的农具,除此之外基本啥也不干了,而对这块地什么时候种什么植物的操作(CPU任务调度)就需要进程通过创建线程来执行了。

2、线程任务调度的基本单位

何谓任务调度?任务调度就是CPU执行具体的任务(一般是调用函数)。线程是由进程创建的,一个进程至少有一个线程,没有线程的进程就是 si 的,啥也干不了!所以说线程是进程的灵魂,同时,只要有线程存在,其就必须依附于一个进程上,也就是说没有肉体依附的灵魂卵用没有~

对于打开一个APP来说,这个APP就是一个进程,而在这个APP上播放音乐、即时聊天等就是由这个进程创建的一个个线程实现的。

3、协程—由线程创建并全权负责的小弟

协程是由线程创建的执行体,可以理解为线程创建的“小线程”。协程的切换同样需要现场保护、恢复现场等操作,但协程比线程更轻量,由于不需要操作系统交互,其切换开销要比线程切换开销小;而线程的切换除了寄存器上下文的切换,还需要进行优先级、内核态进出等等更多与操作系统间的交互。

用户程序不能操作内核空间,只能给协程分配用户栈,而操作系统对协程一无所知,所以协程又被称为用户态线程。

协程多用于IO多路复用的场景。

三、并行、并发及其与CPU内核数的关系

多线程、高并发,对于初学者来说确实是云里雾里的。多线程就一定是并行执行的吗?并行和并发有什么区别?为什么是高并发,咋不叫高并行呢?并行执行的条件是啥呢?这些都是需要搞明白的。

1、理解并行与并发的区别

并发使用了CPU时间片轮转机制,并不是真正的同时执行,只是轮转很快让人感觉是在“同时执行”所以才叫“并发”。并行才是真正的同时执行。

2、进程、线程与CPU核数之间的关系

拥有2个运算设备的CPU称作双核CPU,拥有4个运算器的CPU称作4核CPU,以此类推。也就是说,一个CPU中可能包含多个运算设备(核)。核的个数与可同时运行的线程数(并行)相同。相反,若线程数超过核数,线程将分时使用CPU资源(并发)。但因为CPU运转速度极快,我们会感到所有进程同时运行。当然,核数越多这种感觉越明显。

3、同一个进程里的线程可以并行执行吗(满足条件时可以)

当系统有一个以上核心时,则同一个进程里的两个线程的操作有可能并行执行。当一个核心执行一个线程时,另一个核心可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行。

这里得再明确一个问题:进程只管资源分配,线程才是任务调度的基本单位,因此最终程序的执行,无论是并行还是并发都是体现在线程上的!CPU看到的也只是线程!

但是说进程可以并行执行也没问题,因为有进程存在就一定会有线程存在,如果两个进程里面的线程是并行执行的话就越等于这两个进程在并行执行了。但是你得清楚,实际在运行的是线程。

总结就是:

单核CPU,线程只能并发执行;多核CPU,线程和进程以及同一个进程中的线程都可以并行执行,当线程或进程数量多余核心数时,一般是并行并发同时存在的

但是在 Python 中,无论是单核还是多核,一个进程同时只能由一个线程在执行。其根源是 GIL 的存在。GIL 的全称是 Global Interpreter Lock(全局解释器锁),来源是 Python 设计之初的考虑,为了数据安全所做的决定。某个线程想要执行,必须先拿到 GIL,并且在一个 Python 进程中,GIL 只有一个。拿不到GIL的线程,就不允许进入 CPU 执行。因此python中想要实现并行执行,只能用多进程实现。

对于计算复杂型的运算(如矩阵运算),我们要尽可能多地让代码并行执行.对于IO密集型的操作,尽可能多地使用并发,提高CPU的使用率,从而提高CPU的运行效率 

  • 创建和销毁较频繁使用线程,因为创建进程花销大。
  • 需要大量数据传送使用线程,因为多线程切换速度快,不需要跨越进程边界。
  • 安全稳定选进程;快速频繁选线程。

四、IO多路复用

(建议搭配结尾的视频食用,以下内容多少借鉴了这些链接中的视频)

socket 接受客户端连接,并返回给应用程序一个文件描述符fd,每个文件描述符就是一个数,代表文件描述符的编号,用于识别不用的socket(返回给应用程序的只有一个socket描述符)。每个TCP在操作时操作系统都会为其在内核空间分配一个读缓冲区和一个写缓冲区,要获得相应数据就要从都缓冲区拷贝到用户空间中,同样的要通过socket发送数据,也要先把数据拷贝到写缓冲区才行。

(图片来源: 【协程第二话】协程和IO多路复用更配哦~_哔哩哔哩_bilibili)

对于大量IO请求有以下几种处理方式:

  • 阻塞等待+多线程/多进程:需要开辟线程浪费资源

阻塞式IO(没有数据来时就让出CPU)在高并发情况下会增加调度开销。

  • 非阻塞+忙轮询:占用CPU(while和for),CPU利用率不高

非阻塞式IO(不让出CPU)用忙轮询方式,挨个尝试访问,但是需要频繁检查SOCKET是否就绪,很难把握轮询的间隔时间,容易造成空耗CPU,加剧响应延迟。

  • 多路IO复用

IO多路复用,由操作系统提供支持,把需要等待的socket加入到监听集合,这样就可以通过一次系统调用同时监听多个socket,有socket就绪了就可以逐个处理了,既不用为等待某个socket而阻塞,也不会陷入忙等待之中。

Linux实现了三种IO复用实现方式:select / poll / epoll,这属于拓展内容了,有兴趣可以查看后面的链接。

五、参考文(zi)献(liao)

进程、线程、并行、并发参考资料:

一个视频告诉你“并发、并行、异步、同步”的区别_哔哩哔哩_bilibili

cpu的核数和进程_多线程,多进程,多核总结_玉漏迟的博客-CSDN博客

多CPU,多核,多进程,多线程 - 苏铭枫 - 博客园 (cnblogs.com)

进程、线程和CPU 之间的关系(一)_nandao158的博客-CSDN博客_线程和cpu

协程:

【协程第一话】协程到底是怎样的存在?_哔哩哔哩_bilibili

IO多路复用参考资料:

深入理解Linux中网络I/O复用并发模型_哔哩哔哩_bilibili

【协程第二话】协程和IO多路复用更配哦~_哔哩哔哩_bilibili

【并发】IO多路复用select/poll/epoll介绍_哔哩哔哩_bilibili

协程与IO多路复用

协程和IO多路复用_稚与的博客-CSDN博客_协程在io多路复用中的应用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

进程、线程、协程、并发、并行、IO多路复用 的相关文章

  • vscode的下载速度会特别慢问题处理

    1 xff0c 下载太慢大部分是因为VSCODE官网服务器跟我们国内的链接速度有关 xff0c 当我们去官网下载会出现下面的情况 2 xff0c 复制下载的链接 xff0c 并且修改红框中的内容为 span style background
  • Dockerfile

    Dockerfile Dockerfile基本结构指令FROMMAINTAINERRUNCMDEXPOSEENVADDCOPYENTRYPOINTVOLUMEUSERWORKDIRONBUILD 创建镜像 Dockerfile 基本结构 D
  • 使用git时本地代码被覆盖怎么办

    1 遇事不要慌 xff0c 看本地历史记录 右键要想要恢复的代码或文件夹 61 右键 61 Local History 61 gt Show History 2 我一下就找到了本地历史记录 看右边有了不同时间的代码 xff0c 去点一下试试
  • Ubuntu截图工具flameshot的安装与快捷键设置

    https blog csdn net sexyluna article details 105884224
  • moveit配置过后gazebo加载不出来机械臂模型的问题

    我使用moveit setup assistant对dubot magician机械臂的urdf进行配置 xff0c 配置完成后发现运行gazebo launch可以打开gazebo xff0c 但是却什么也没有 xff0c 机械臂模型加载
  • 上传本地项目代码到GitHub的方法

    预备知识 xff1a 有一个GitHub账号 xff0c 然后知道怎么进GitHub网页 之前往GitHub上传代码都是现场百度找指令操作的 xff0c 从来不记 xff0c 这次干脆做个记录当个笔记吧 Git是一个版本控制软件 xff0c
  • 单片机之蜂鸣器

    蜂鸣器简介 无源蜂鸣器 xff1a 有绿色电路板的一种 有源蜂鸣器 xff1a 没有电路板用黑胶封闭的一种 其实蜂鸣器的种类有很多 例如 xff1a 电磁式蜂鸣器 xff1a 由振荡器 电磁线圈 磁铁 振动膜片及外壳组成 同时电磁式蜂鸣器也
  • Centos Stream 9 安装 Docker 23.0.2 社区版 官方安装教程

    目录 一 内核的版本必须大于3 10使用下面的命令来检查是否满足docker的要求 xff0c 进行依赖性检查 二 安装docker容器引擎 xff0c 需要一个具有sudo权限的账户登录进行操作 1 更新现有yum包 2 遇到提示请输入y
  • AttributeError: module numpy has no attribute int .报错解决方案

    在训练YOLO模型时突然发现这个报错 xff0c 后来发现是numpy版本问题 xff0c yolo官方给的是大于等于1 18 5 xff0c 当你执行pip install r requirements txt命令时 xff0c 他默认安
  • 单片机(嵌入式)程序分层架构

    目录 前言 嵌入式3层软件架构 嵌入式4层软件架构 1 驱动层 操作系统层 中间件层 应用层 嵌入式4层软件架构 2 硬件层 嵌入式微处理芯片 嵌入式存储器系统 嵌入式I O接口 中间层 系统软件层 RTOS 文件系统 GUI 应用层 嵌入
  • FreeRTOS笔记—第一章 FreeRTOS概述

    1 1 认识FreeRTOS 1 1 1 什么是操作系统 操作系统 xff08 Operating System xff0c 简称OS xff09 是管理计算机硬件与软件资源的计算机程序 简单说就是一种管理计算机资源的软件 目的是为了高效
  • 嵌入式工程师 面试题 集-C语言

    预编译 1 什么是预编译 xff0c 何时需要预编译 答 xff1a 预编译又称预处理 就是做些代码文本的替换工作 开头的指令 xff0c 比如拷贝 include 包含的文件代码 xff0c define 宏定义的替换 xff0c 条件编
  • 嵌入式工程师面试题集-MCU_STM32

    一 选择题 1 Cortex M处理器采用的架构是 xff08 D xff09 xff08 A xff09 v4T xff08 B xff09 v5TE xff08 C xff09 v6 xff08 D xff09 v7 2 NVIC可用来
  • 嵌入式工程师面试题集汇总

    主观问题 主观问题 介绍类 请自我介绍 xff1f 为什么不留在xx公司 xff08 为啥离职 xff09 xff1f 你5 10年职业规划是怎样的 xff1f 你还写代码吗 xff1f 从工程师到管理再到工程师你是怎样想的或能承受吗 把你
  • C++解决实际问题 ——a的三次方(accode)

    hello大家好 xff0c 在下 小侠雨落 xff0c 几天不见 xff0c 甚是想念啊 xff01 不说了 xff0c 上标题 a的三次方 咳咳 xff0c 题目描述输入一个整数 a xff0c 输出 a 的三次方 输入格式 一行 xf
  • [CVPR2018]Bottom-Up and Top-Down Attention for Image Captioning and Visual Question Answering

    Bottom Up and Top Down Attention 附 xff1a 论文下载地址 主要贡献 提出了一个新的LSTM组合模型 xff0c 包括了attention LSTM和language LSTM 两个组件 在这个组合模型的
  • python matplotlib绘图总结

    目录 1 画线 a 常规画线 xff1a matplotlib pyplot plot 1 xff09 线的颜色 风格 标记点形状 2 xff09 一图多线 xff0c 并加图例 b 非均匀画线 semilogy c 给特定的点打标签 2
  • mysql now的时间问题

    mysql now 函数调用系统时间不对修正方法 进入mysql命令行 查看时区设置 xff1a show variables like 39 zone 39 select 64 64 time zone 两者保持与系统时间一致 xff0c
  • 【谷粒学院】微信扫码支付(224~238)

    224 项目第十五天内容介绍 225 课程评论实现过程分析 226 课程支付功能需求分析 1 课程支付说明 xff08 1 xff09 课程分为免费课程和付费课程 xff0c 如果是免费课程可以直接观看 xff0c 如果是付费观看的课程 x
  • 故障转移集群搭建高可用文件共享服务器

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言 一 故障转移集群是什么 xff1f 二 什么是仲裁盘 xff1f 三 添加故障转移集群功能 四 故障转移集群的建立 五 配

随机推荐

  • HTTP的报文(详解)

    摘要 我们对于http的了解 xff0c 应该在于 xff0c 我们如果想请求一个资源或者访问一个页面 xff0c 客户端 xff08 我们 xff09 应该向服务器发送一个http请求 xff0c 然后得到响应 xff0c 才能出现我们想
  • Kubernetes部署

    文章目录 1 Kubernetes快速部署1 1 Kubernetes安装要求1 2 安装步骤1 3 准备环境1 4 所有节点安装Docker kubeadm kubelet1 4 1 安装Docker1 4 2 添加kubernetes阿
  • 如何从GitHub克隆带有子模块的仓库,比如FreeRTOS

    情形一 xff1a 首次克隆 git clone recurse submodules git 64 github com FreeRTOS FreeRTOS git 该命令会递归克隆该仓库及所有的子模块 工程目录下的 gitmodules
  • grpc生成go文件命令

    标题 xff1a grpc生成go文件命令 类型 xff1a Golang 内容 xff1a 一 生成tag bp go文件命令 1 protoc go out 61 plugins 61 grpc modules course info
  • Prometheus+grafana监控 k8s集群

    在k8s集群中使用node exporter prometheus grafana对集群进行监控 node exporter组件负责收集节点上的metrics监控数据 xff0c 并将数据推送给prometheus prometheus负责
  • 用IAR给MSP430烧录时出现“Only one MSP-FET ez-FET debugger can be connected to your system during recovery”

    一 问题说明 当安装上IAR软件后 xff0c 新建工程配置好后 xff0c 烧录进MSP430 xff08 我的是MSP430F5529 xff09 中时出现 34 Only one MSP FET ez FET debugger can
  • ConstOS防火墙端口操作

    添加端口 permanent 是永久生效的意思 如果不添加则默认重启后失效 firewall cmd zone 61 public add port 61 3490 tcp permanent 重载端口 firewall cmd reloa
  • 分享学习12864心得

    分享12864显示中文 一 12864基本参数二 代码部分1 得到控制时序2 指令集3 对显示屏写入数据 总结 一 12864基本参数 1 电气参数 电源电压 xff1a VDD xff1a 43 3 0 43 5 5V 显示分辨率 xff
  • pandas 处理excel表格数据的常用方法(python)

    最近助教改作业导出的成绩表格跟老师给的名单顺序不一致 xff0c 脑壳一亮就用pandas写了个脚本自动吧原始导出的成绩誊写到老师给的名单中了哈哈哈 xff0c 这里就记录下用到的pandas处理excel的常用方式 xff08 注意 xf
  • STM32单片机课程自学知识点整理 - 指南版

    课程目录 前言网络课程推荐一 基础知识题外话 xff1a 什么是RISC V xff0c RISC V芯片的发展现状1 原码 补码和反码2 为什么1Byte 61 8bit3 什么是I 2 C4 什么是ICode DCode 系统总线 DM
  • ros与STM32通讯报错:Unable to open port

    设备名称 dev mick 记录学习中遇到的问题 xff0c 以及对应的解决办法 xff0c 免得忘了又要查资料 ros与STM32通讯报错 xff1a Unable to open port ros与STM32通讯报错 xff1a Una
  • Clustering Effect of (Linearized) Adversarial Robust Models

    2021 12 6 第三篇 xff08 NeurIPS 2021 xff09 半精读 原文链接 xff1a Clustering Effect of Linearized Adversarial Robust Models 代码链接 xff
  • Hadoop伪分布式搭建实验的详细操作步骤

    一 建立帐号及更新终端命令 1 1 创建hadoop用户 进入ubuntu系统 打开命令行终端 输入以下语句 创建一个名为hadoop的用户 useradd命令的 m用来指定用户名 s用来指定用户登录时所需的shell文件 sudo use
  • 阿里大佬推荐 Spring源码+Redis+Nginx+MySQL等七篇实战技术文档,

    JVM JVM是Java Virtual Machine xff08 Java虚拟机 xff09 的缩写 xff0c JVM是一种用于计算设备的规范 xff0c 它是一个虚构出来的计算机 xff0c 是通过在实际的计算机上仿真模拟各种计算机
  • 数据库实体关系图(ERD)及其画法

    文章目录 1 什么是ER图 2 什么时候画ER图 2 1 数据库设计2 2 数据库调试2 3 数据库创建和补丁2 4 帮助收集需求 3 ERD符号指南4 概念 逻辑和物理数据模型5 如何绘制ER图 数据库绝对是软件系统不可分割的一部分 在数
  • 基于Ubuntu 20.04 安装 Kalibr 踩坑记录

    小师妹要做相机视觉标定 xff0c 需要制作棋盘格 xff0c 无奈其电脑有些卡 xff0c 对此毫无经验的博主从头开始安装 xff08 此前博主已经安装了ROS环境 xff09 xff0c 如果没有安装ROS环境 xff0c 请参照以下链
  • xavier nx的sd卡系统镜像备份及恢复(非sd卡全盘拷贝,只拷贝实际系统大小)

    1 在主机ubuntu上下载安装gparted xff1a sudo apt install gparted 2 将需要备份的 SD 卡插入读卡器然后插入电脑 xff0c 等待 Linux 读取成功 3 输入sudo gparted启动 g
  • 手把手教你安装ubantu22(详细图文)

    安装平台 xff1a VMware Workstation 16 Pro iso镜像 xff1a ubuntu 22 04 1 desktop amd64 iso 下载连接 xff1a Ubuntu 22 04 1 LTS Jammy Je
  • DataX使用之MongoDB2HDFS

    序 xff1a 本文首先介绍DataX使用 编写配置文件的方式 之MongoDB中的数据导出到HDFS上的一些注意事项 xff0c datax安装没有什么坑 xff0c 所以本文不对此进行详细介绍 xff0c 详细安装过程请自行查看官网 一
  • 进程、线程、协程、并发、并行、IO多路复用

    目录 一 什么是IO操作 二 进程 线程 协程 1 进程是资源分配的基本单位 2 线程是任务调度的基本单位 3 协程 由线程创建并全权负责的小弟 三 并行 并发及其与CPU内核数的关系 1 理解并行与并发的区别 2 进程 线程与CPU核数之