进程,线程,协程的概念以及比较

目录

一.进程和协程,线程的概念

(1)进程:

(2)线程:

(3)协程:

(#)进程,线程,协程包含关系图:

二.进程,线程 ,协程的比较

(1)进程和线程的比较:

(2)线程和协程的比较:

(3)进程,线程,协程的比较:

三.上下文切换进程,线程,协程的区别

四.CPU时间切片

五.进程,线程,协程的理解demo


一.进程和协程,线程的概念

(1)进程:

是程序动态运行的一个过程,是操作系统资源分配和独立运行的基本单位。其有自己独立的内存空间,不同的进程之间通过各种相对应的通信方式进行通信。但又因为进程拥有独立的内存空间,所以它的上下文切换(栈,寄存器,页表,文件句柄等)开销就比较大,但是相对来说进程的运行就比较安全稳定。

总结来说:保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体拥有独立的内存地址,堆。上级挂靠单位是操作系统,而操作系统会以进程为单位,分配系统资源(CPU时间片,内存等资源),进程是CPU资源分配的最小单位

(2)线程:

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

总结来说:线程可以被称为轻量级进程,是程序的实际执行者,并且一个进程至少包含一个主线程,但一个线程只能从属于一个进程。线程通信主要是通过共享内存。资源开销,上下文切换比进程小而快。但不比进程稳定安全。

(3)协程:

是一种用户态的轻量级线程,协程的调度完全由用户控制。一个线程可以拥有多个协程,而协程不是被操作系统内核所管理的,而是完全由编程的程序所控制的,也就是程序员所控

制。

总结来说:协程可以被称为轻量级的线程,其最主要的作用是在单线程的情况下实现并发的效果。但实际上还是串行的,一个线程可以拥有多个协程,协程不是被操作系统内核所管理,而是由编程者所控制

(#)进程,线程,协程包含关系图:

操作系统,进程和线程之间的包含关系图

操作系统,进程,线程和协程之间的包含关系图

二.进程,线程 ,协程的比较

(1)进程和线程的比较:

线程是指进程内的一个执行单元,也是进程内的可调度实体。

1、根本区别: 进程是操作系统资源分配和独立运行的最小单位;线程是任务调度和系统执行的最小单位。
2、地址空间区别: 每个进程都有独立的地址空间,一个进程崩溃不影响其它进程;一个进程中的多个线程共享该 进程的地址空间,一个线程的非法操作会使整个进程崩溃。
3、上下文切换开销区别: 每个进程有独立的代码和数据空间,进程之间上下文切换开销较大;线程组共享代码和数据空间,线程之间切换的开销较小。


(2)线程和协程的比较:

(1) 一个线程可以多个协程,一个进程也可以单独拥有多个协程。
(2) 线程进程都是同步机制,而协程则是异步。
(3) 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态。
(4)线程是抢占式,而协程是非抢占式的,所以需要用户自己释放使用权来切换到其他协程,因           此同一时间其实只有一个协程拥有运行权,相当于单线程的能力。
(5)协程并不是取代线程, 而且抽象于线程之上, 线程是被分割的CPU资源, 协程是组织好的代码            流程, 协程需要线程来承载运行, 线程是协程的资源, 但协程不会直接使用线程, 协程直接利              用 的是 执行器(Interceptor), 执行器可以关联任意线程或线程池, 可以使当前线程, UI线程,                或 新建新程.。
(6)线程是协程的资源。协程通过Interceptor来间接使用线程这个资源。

注:协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。协程,在执行过程中可中断去执行其他任务,执行完毕后再回来继续原先的操作——可以理解为两个或多个程序协同工作。

(3)进程,线程,协程的比较:

协程既不是进程也不是线程,协程仅仅是一个特殊的函数,协程与进程和线程不是一个维度的。

一个进程可以包含多个线程,一个线程可以包含多个协程。

一个线程内的多个协程虽然可以切换,但是多个协程是串行执行的,只能在一个线程内运行,没法利用CPU多核能力。

协程与进程一样,切换是存在上下文切换问题的。

三.上下文切换进程,线程,协程的区别

(1)进程的切换者是操作系统,切换时机是根据操作系统自己的切换策略,用户是无感知的。进程的切换内容包括页全局目录、内核栈、硬件上下文,切换内容保存在内存中。进程切换过程是由“用户态到内核态到用户态”的方式,切换效率低。

(2)线程的切换者是操作系统,切换时机是根据操作系统自己的切换策略,用户无感知。线程的切换内容包括内核栈和硬件上下文。线程切换内容保存在内核栈中。线程切换过程是由“用户态到内核态到用户态”, 切换效率中等。协程的切换者是用户(编程者或应用程序),切换时机是用户自己的程序所决定的。

(3)协程的切换内容是硬件上下文,切换内存保存在用户自己的变量(用户栈或堆)中。协程的切换过程只有用户态,即没有陷入内核态,因此切换效率高。

四.CPU时间切片

时间切片即CPU分配给各个程序的时间,每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间,使各个程序从表面上看是同时进行的。

如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。而不会造成CPU资源浪费。

在宏观上:我们可以同时打开多个应用程序,每个程序并行不悖,同时运行。

但在微观上:由于只有一个CPU,一次只能处理程序要求的一部分,如何处理公平,一种方法就是引入时间片,每个程序轮流执行。
 

五.进程,线程,协程的理解demo

有一个老板想要开个工厂进行生产某件商品(例如剪子)
他需要花一些财力物力制作一条生产线,这个生产线上有很多的器件以及材料这些所有的 为了能够生产剪子而准备的资源称之为:进程

只有生产线是不能够进行生产的,所以老板的找个工人来进行生产,这个工人能够利用这些材料最终一步步的将剪子做出来,这个来做事情的工人称之为:线程

这个老板为了提高生产率,想到3种办法:

方式 1
在这条生产线上多招些工人,一起来做剪子,这样效率是成倍増长,即单进程 多线程

方式 2
老板发现这条生产线上的工人不是越多越好,因为一条生产线的资源以及材料毕竟有限,所以老板又花了些财力物力购置了另外一条生产线,然后再招些工人这样效率又再一步提高了,即多进程 多线程

方式 3
老板发现,现在已经有了很多条生产线,并且每条生产线上已经有很多工人了(即程序是多进程的,每个进程中又有多个线程),为了再次提高效率,老板想了个损招,
规定:如果某个员工在上班时临时没事或者再等待某些条件(比如等待另一个工人生产完谋道工序 之后他才能再次工作) ,那么这个员工就利用这个时间去做其它的事情, 那么也就是说:如果一个线程等待某些条件,可以充分利用这个时间去做其它事情,这就是:协程
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值