C++程序员应了解的那些事(117)~进程、线程、协程

2023-10-26

相关博文:

程序员应了解的那些事(111)~进程、线程及堆栈关系_线程堆栈_so~what的博客-CSDN博客

概念与区分

1、进程

  • 进程是程序一次动态执行的过程,是程序运行的基本单位。
  • 每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。
  • 进程占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、页表、文件句柄等)比较大,但相对比较稳定安全。

        是一个正在运行的程序。
        是一个动态的过程:有它自身的产生、存在、和消亡的过程——生命周期。
        是操作系统(OS)进行资源(CPU、内存、GPU等)分配的最小单位。有自己独立的地址空间,其内部的各个线程共享该地址空间。
        每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成。

        直观理解:打开的任何一个程序是一个进程,比如游戏,浏览器等。


2、线程

  • 线程又叫做轻量级进程,是CPU调度的最小单位。
  • 线程从属于进程,是程序的实际执行者。一个进程至少包含一个主线程,也可以有更多的子线程。
  • 多个线程共享所属进程的资源,同时线程也拥有自己的专属资源
  • 线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。
     

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Oj31EdX6-1630165452376)(D:\tec-note\photos\image-20210824185105401.png)]

        是CPU调度和分配的基本单位。
        一个进程可由多个线程的执行单元组成,每个线程都运行在同一进程的上下文中,共享同样的代码和全局数据。

        直观理解:使用一个程序的某个功能是一个线程,比如新打开一个网页,使用杀毒软件清理垃圾等。

        进程和线程的关系
  • 地址空间:线程是进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间。
  • 资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源。
  • 线程是处理器调度的基本单位,但进程不是。
  • 二者均可并发执行。

3、协程

  • 协程是一种用户态的轻量级线程,协程的调度完全由用户控制。
  • 一个线程可以拥有多个协程,协程不是被操作系统内核所管理,而完全是由程序所控制。
  • 与其让操作系统调度,不如我自己来,这就是协程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E5Gnb3rp-1630165452378)(D:\tec-note\photos\image-20210824191000831.png)]

        协程(Coroutine)和进程(Process)是计算机编程中常用的两种并发执行的概念。
        进程是操作系统分配资源和执行任务的基本单位。每个进程都有自己的地址空间、代码、数据和文件等资源。多进程可以同时执行不同的任务,它们之间相互独立,通过进程间通信(IPC)来进行数据交换和协作
        而协程是一种轻量级的线程,也被称为用户级线程。它在单个线程内部实现了非抢占式的多任务处理,能够在一个线程内切换执行不同的任务,并且在任务之间保存状态与进程不同,协程之间的切换是由程序员手动控制或由特定的调度器控制,而不是由操作系统管理。
        协程的优势在于减少了上下文切换的开销以及降低了内存使用量,使得并发编程更加高效。它通常用于异步编程、事件驱动的程序设计、生成器等场景。
        总结起来,进程是操作系统的基本执行单位,而协程是在单个线程内实现并发执行的一种机制。进程之间相互独立,而协程可以通过切换来实现任务的并行执行。

通信方式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KUVSPFez-1630165542249)(D:\tec-note\photos\image-20210824193404782.png)]

线程的生命周期

  • 创建:线程从创建到被cpu执行之前的这个阶段。
  • 就绪:指线程已具备各种执行条件,一旦获取cpu便可执行。
  • 运行:表示线程正获得cpu在运行。
  • 阻塞:指线程在执行中因某件事而受阻,处于暂停执行的状态,阻塞的线程不会去竞争cpu。
  • 终止:线程执行完毕,接下来会释放线程占用的资源。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yulgz1q3-1630165452382)(D:\tec-note\photos\image-20210824193704443.png)]

进程调度算法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0KNa5v8x-1630165452383)(D:\tec-note\photos\image-20210824193905266.png)]

1、先到先服务

        先来先去服务调度算法是一种最简单的调度算法,也称为先进先出或严格排队方案。当每个进程就绪后,它加入就绪队列。当前正运行的进程停止执行,选择在就绪队列中存在时间最长的进程运行。该算法既可以用于作业调度,也可以用于进程调度。

2、最短进程优先

        最短进程优先是一个非抢占策略,他的原则是下一次选择预计处理时间最短的进程,因此短进程将会越过长作业,跳至队列头。该算法即可用于作业调度,也可用于进程调度。但是他对长作业不利,不能保证紧迫性作业(进程)被及时处理,作业的长短只是被估算出来的。

3、时间片轮转法

        轮转法是基于适中的抢占策略的,以一个周期性间隔产生时钟中断,当中断发生后,当前正在运行的进程被置于就绪队列中,然后基于先来先去服务策略选择下一个就绪作业的运行。这种技术也称为时间片,因为每个进程再被抢占之前都给定一片时间。

4、优先级调度

        在进程等待队列中选择优先级最高的来执行

5、多级反馈队列调度算法

        多级反馈队列算法,不必事先知道各种进程所需要执行的时间,他是当前被公认的一种较好的进程调度算法。其实施过程如下:

1)设置多个就绪队列,并为各个队列赋予不同的优先级。在优先权越高的队列中,为每个进程所规定的执行时间片就越小。

2)当一个新进程进入内存后,首先放入第一队列的末尾,按照先到先服务原则排队等候调度。如果他能在一个时间片中完成,便可撤离;如果未完成,就转入第二队列的末尾,同样等待调度…如此下去,当一个长作业(进程)从第一队列依次将到第n队列(最后队列)后,便按第n队列时间片轮转运行。

3)仅当第一队列空闲的时候,调度程序才调度第二队列中的进程运行;仅当第1到(i-1)队列空时,才会调度第i队列中的进程运行,并执行相应的时间片轮转。

4)如果处理机正在处理第i队列中某进程,又有新进程进入优先权较高的队列,则此新队列抢占正在运行的处理机,并把正在运行的进程放在第i队列的队尾。
 

 并行和并发

  • 并发是指一个处理器同时处理多个任务。 
  • 并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。 
  • 并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生。 来个比喻:并发是一个人同时吃三个馒头,而并行是三个人同时吃三个馒头。 

 
        并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。就好像两个人各拿一把铁锨在挖坑,一小时后,每人一个大坑。所以无论从微观还是从宏观来看,二者都是一起执行的。 

        并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。这就好像两个人用同一把铁锨,轮流挖坑,一小时后,两个人各挖一个小一点的坑,要想挖两个大一点得坑,一定会用两个小时。 

        并行在多处理器系统中存在,而并发可以在单处理器和多处理器系统中都存在,并发能够在单处理器系统中存在是因为并发是并行的假象,并行要求程序能够同时执行多个操作,而并发只是要求程序假装同时执行多个操作(每个小时间片执行一个操作,多个操作快速切换执行)。 

        当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状态。这种方式我们称之为并发(Concurrent)。

        当系统有一个以上CPU时,则线程的操作有可能非并发.当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。 

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

C++程序员应了解的那些事(117)~进程、线程、协程 的相关文章

  • Qt 中开启线程的五种方式

    作者 billy 版权声明 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 简介 在开发过程中 使用线程是经常会遇到的场景 本篇文章就来整理一下 Qt 中使用线程的五种方式 方便后期回顾 前面两种比较简单 一笔带过了 主
  • Window10文件在另一个程序中打开无法删除

    1 打开任务管理 点详细信息 2 打开性能 gt 3 打开下方的 资源监视器 4 句柄中输入文件名 5 鼠标右键结束进程 就可以删除文件啦
  • 进程、线程和协程的理解

    进程 线程和协程的理解 进程 线程和协程之间的关系和区别也困扰我一阵子了 最近有一些心得 写一下 进程拥有自己独立的堆和栈 既不共享堆 亦不共享栈 进程由操作系统调度 线程拥有自己独立的栈和共享的堆 共享堆 不共享栈 线程亦由操作系统调度
  • Java异步注解@Async详解

    一 Async注解 Async的作用就是异步处理任务 在方法上添加 Async 表示此方法是异步方法 在类上添加 Async 表示类中的所有方法都是异步方法 使用此注解的类 必须是Spring管理的类 需要在启动类或配置类中加入 Enabl
  • C#--使用Process类kill进程

    1 背景 static变量 static变量也称作静态变量 静态变量和非静态变量的区别是 静态变量被所有的对象所共享 在内存中只有一个副本 它当且仅当在类初次加载时会被初始化 而非静态变量是对象所拥有的 在创建对象的时候被初始化 存在多个副
  • 线程-Linux下的轻量级进程

    首先我们知道 每个进程都是在各自独立的地址空间上运行 如果要同时完成好几个任务 比如你一边在下载软件 另一边在进行着其他的操作 那么试想一下 可不可以在一个进程里面把这几个事件同时进行呢 这里就要提到线程的概念了 但其实Linux中 并没有
  • C#学习笔记 异步操作

    同步操作 默认情况下我们的代码都是同步操作 这种情况下 所有的操作都在同一个线程中 如果遇到需要长时间执行的操作或者是一个IO操作 那么代码可能会阻塞比较长的时间 在阻塞的这段时间里 无法进行其他工作 这是很不好的 这里是一个同步操作的例子
  • 进程调度的控制—文件锁

    前言 在进程之间 我们不能决定应该先去调度哪一个进程 这时候我们就需要对一个文件加锁 来要求那个先来执行 整体文件锁 int flock int fd int operation fd 文件描述符 operation 定义的宏 也就是选项
  • 开发中遇到的线程不安全问题小结

    1 SimpleDateFormat 是线程不安全的 推荐使用如下 1 声明SimpleDateFormat变量时 加synchronized修饰 2 使用DateUtils 工具类 3 使用ThreadLocal 如下 private s
  • Linux的进程管理

    目录 1 概述 2 进程描述符 2 1 进程描述符的分配 2 2 进程描述符的存放 2 3 进程状态 2 4 进程上下文 2 5 进程家族树 3 进程的创建 4 进程的终结 5 线程的实现 1 概述 进程是执行期的代码 但是进程不止包括这样
  • 多线程下事务控制

    我篇文章 大数据批量新增or修改太慢太Low 线程池 CountDownLatch CompletableFuture完美解决 弊端就是无法实现事务控制 那么今天他就来啦 需求 大数据平台去获取数据 gt 通过对象组装 gt 插入到对应的表
  • C#中的线程(一)入门

    文章系参考转载 英文原文网址请参考 http www albahari com threading 作者 Joseph Albahari 翻译 Swanky Wu 中文翻译作者把原文放在了 google 协作 上面 GFW屏蔽 不能访问和查
  • QT 如何打印QThread线程id号

    qDebug lt lt DealTimeoutObject1 lt
  • 线程——一个计数器计数到100,在每个数字之间暂停1秒,每隔10个数字输出一个字符串

    16 一个计数器计数到100 在每个数字之间暂停1秒 每隔10个数字输出一个字符串 public class MyThread extends Thread public void run for int i 0 i lt 100 i if
  • 深入理解计算机系统-笔记

    计算机系统漫游 程序 程序的生命周期从一个源程序 源文件 开始 即程序员利用编辑器创建并保存的文本文件 如文件名为hello c的c语言程序 源程序是由0和1组成的位序列 8个位被组织成一组 称为字节 每个字节表示程序中的某个文本字符 这种
  • Java的线程同步 & 并发操作

    并发 CUP在同一时间或同一时段内只能执行一件事情 而不同时件执行时 切换得十分快速 因为CUP的频率非常高 切换的速度人根本感受不出来 同步 同步是多个任务进行时 按照一定的规律进行着 线程并发 同一时间间隔中 有多个线程在同时执行 就是
  • 进程和线程的详解和区别

    1 进程和线程概述 我们都知道计算机的核心是CPU 它承担了所有的计算任务 而操作系统是计算机的管理者 它负责任务的调度 资源的分配和管理 统领整个计算机硬件 应用程序是具有某种功能的程序 程序是运行于操作系统之上的 2 进程 我们编写的代
  • 线程连接池

    第一种 Executors newCacheThreadPool 可缓存线程池 先查看池中有没有以前建立的线程 如果有 就直接使用 如果没有 就建一个新的线程加入池中 缓存型池子通常用于执行一些生存期很短的异步型任务 package tes
  • SimpleDateFormat线程不安全及解决办法

    以前没有注意到SimpleDateFormat线程不安全的问题 写时间工具类 一般写成静态的成员变量 不知 此种写法的危险性 在此讨论一下SimpleDateFormat线程不安全问题 以及解决方法 为什么SimpleDateFormat不
  • 什么是SSL协议?

    转自 微点阅读 https www weidianyuedu com 什么是SSL协议 SSL协议是一种安全传输协议 SSL是SecureSocketLayer的缩写 即安全套接层协议 该协议最初由Netscape企业发展而来 目前已经成为

随机推荐

  • quickjs集成mfc的实现

    QuickJS是一个轻量级的JavaScript解释器 可以在各种平台上运行 如果你想在MFC应用程序中使用QuickJS 你可以使用以下方法来实现 下载QuickJS源代码 然后在MFC应用程序中包含QuickJS文件 在MFC应用程序中
  • 操作系统笔记整理 ——目录索引页

    操作系统笔记整理 目录索引页 笔记整理参考书籍 计算机操作系统 第四版 汤小丹等编著 以下笔记整理主要包含了前八章的内容 具体包含的内容会在下面详细说明 笔记尚有许多不足之处 如果大家发现错误还请私信我修改 感谢 目录即链接 点击目录即可跳
  • XML:你真的有必要了解一下我

    对XML的深入浅出 一 概念 二 功能 三 基本语法 四 快速入门 五 组成部分 5 1文档声明 六 约束 6 1 DTD 6 2 Schema 七 解析 7 1 解析XML的方式 7 2常见解析器 八 Jsoup详解 8 1 快速入门 8
  • 第一届全国技能大赛(世赛项目)河北省选拔赛 网络安全项目任务书

    第一届全国技能大赛 世赛项目 河北省选拔赛 网络安全项目任务书 模块A 网络基础构建 网络基础服务搭建 1 第一部分 网络基础构建 2 第二部分 网络基础服务搭建 模块B 网络安全事件响应 数字取证调查和应用程序安全 1 第一部分 网络安全
  • 流程制造行业MES系统的四大应用特点

    MES制造执行系统就是生产加工过程执行系统 该系统可以融合生产规划信息内容及物料 供应 采购和库存等生产现场管理信息内容 根据数据采集系统 然后融合加工过程中的物料 工时 机器设备 人员等信息内容 让生产管理人员对加工过程及进度 建立一个及
  • 如何利用int型变量存放ip值(c语言)

    IP地址 ip地址是一个32位的二进制数 实际上是4个字节 点分十进制表示为 a b c d a b c d的值都是 0 255 例如ip地址 192 168 0 1 就是一个合格ip地址 可以知道a b c d这些字段都是一个无符号字节表
  • 关于前端文件上传后将文件保存至服务器路径存储在数据库并在相应页面展示的总结

    前期准备 1 开发环境及框架的搭建 基于SSH开发框架 2 数据库建表 表应该有一个字段用来存储文件在服务区上的存储路径 3 map xml文件 4 Action xml文件 5 写好实体类及get set 方法 6 DAO层 7 Acti
  • 线性代数(3)—— 逆矩阵、伴随矩阵、初等矩阵

    参考 张宇高等数学基础30讲 文章目录 1 矩阵的逆 1 1 逆矩阵的定义 1 2 逆矩阵性质与重要公式 1 3 用定义求逆矩阵 1 4 例题 2 伴随矩阵 2 1 伴随矩阵的定义 2 2 伴随矩阵的定义与重要公式 2 3 用伴随矩阵求逆矩
  • 每日一题 LCP 06. 拿硬币

    难度 简单 简单题 不多说 class Solution def minCount self coins List int gt int res 0 for coin in coins res ceil coin 2 return res
  • 国内主要大数据平台比较

    在当前信息时代 大数据处理和分析变得越来越重要 国内涌现了许多主流的大数据平台 它们提供各种功能和工具 帮助企业和组织处理和分析海量数据 本文将比较几个主要的国内大数据平台 并提供相应的源代码示例 阿里云大数据平台 阿里云大数据平台是国内领
  • [JSP暑假实训] 四.MyEclipse+Servlet+JSP实现火车票网站查询、修改、删除操作

    本系列文章是作者暑假给学生进行实训分享的笔记 主要介绍MyEclipse环境下JSP网站开发 包括JAVA基础 网页布局 数据库基础 Servlet 前端后台数据库交互 DAO等知识 前一篇文章讲解了通过Servlet获取所提交的数据 这篇
  • OSB:Rest、Soap、SoapDB接口开发学习

    OSB Rest Soap DBSoap接口开发 开发配置 1 开启服务 2 登录WebLogic Server管理控制台 3 启动osb服务 4 登录ServiceBus控制台 Rest接口的开发 1 测试接口是否可以调通 2 开发接口
  • python opencv 调用摄像头失败问题的解决 Windows

    省流 内含 Python Opencv 双目相机拍照代码 手动 or 自动 可自取 如果你的 cv2 VideoCapture 函数卡住但不报错 打开 Windows 相机 应用可以正常看到摄像头画面 且能够正常用 cv2 imshow 打
  • python flask api接口开发编程

    使用 Python 和 Flask 设计 RESTful API 近些年来 REST REpresentational State Transfer 已经变成了 web services 和 web APIs 的标配 在本文中我将向你展示如
  • 简述同步和异步的区别

    同步是阻塞模式 异步是非阻塞模式 同步就是指一个进程在执行某个请求的时候 若该请求需要一段时间才能返 回信息 那么这个进程将会一直等待下去 直到收到返回信息才继续执行下去 异步是指进程不需要一直等下去 而是继续执行下面的操作 不管其他进程的
  • do-while(0)语句到底有什么用?

    前言 在一个群里面看到一个人问 do while 0 语句有什么用 do while 0 这个程序最终结果不应该就是程序只跑一次 那么写和不写有什么区别呢 do while 0 在复杂宏定义上的优点 为什么需要复杂宏 1 在讲解do whi
  • 反射的补充

    反射可以绕过编译阶段为集合添加数据 反射是作用在运行时的技术 此时集合的泛型将不能产生约束了 此时可以为集合存入其他任意类型的元素 泛型只是在编译阶段可以约束集合只能操作某种数据类型 在编译成Class文件进入运行阶段时 其真实类型都是Ar
  • 数据结构与算法笔记:计算思维之经典农夫过河问题C++实现

    农夫 羊 狼 菜的过河问题 问题描述 角色 农夫 羊 狼 菜 条件1 船很小 只能装下农夫和其他一个角色 条件2 无人看管 羊吃菜 狼吃羊 问 如何让其他三种角色被农夫平安带着过河 相关分析 我们可以先用人脑尝试一下相关渡河策略 1 先渡狼
  • 基于 itemCF (item collaborative filtering) 推荐(基于物品的协同过滤算法)的理解

    推荐系统 一般是用于电商 广告 内容 信息流等推荐平台 以挖掘数据的最大价值 可以提升用户粘性和转化率 而本文提及到的基于内容的协同过滤算法就是一个经典的算法 基本思想 首先 什么是协同呢 协同在这里指的就是 用集体的智慧来为个体过滤出他需
  • C++程序员应了解的那些事(117)~进程、线程、协程

    相关博文 程序员应了解的那些事 111 进程 线程及堆栈关系 线程堆栈 so what的博客 CSDN博客 概念与区分 1 进程 进程是程序一次动态执行的过程 是程序运行的基本单位 每个进程都有自己的独立内存空间 不同进程通过进程间通信来通