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

您所在的位置:网站首页 协程线程进程 C++程序员应了解的那些事(117)~进程、线程、协程

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

#C++程序员应了解的那些事(117)~进程、线程、协程| 来源: 网络整理| 查看: 265

相关博文:

程序员应了解的那些事(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)。 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3