操作系统学习之---进程、线程、协程之间的区别和联系

进程、线程和协程的区别

  • 进程:充分利用多CPU

  • 线程:充分利用多核(达到真正的多任务并行)

  • 协程:充分利用单核(充分挖掘不断提高性能的单核CPU的潜力。类比事件驱动和异步程序)。既可以利用异步优势,又可以避免反复系统调用,还有进程切换造成的开销

    • 协程存在的意义
      对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。协程能保留上一次调用时的状态,不需要像线程一样用回调函数,所以性能上会有提升。
    • 缺点:本质是个单线程,不能利用到单个CPU的多个核。

协程,是一种比线程更加轻量级的存在,协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源。

线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员。

切换开销(即调度和切换的时间):进程 > 线程 > 协程

进程和线程的区别:

关键词:cpu,io密集型计算概念

概要
计算密集型 (CPU-bound)(适合多进程,而多线程是鸡肋)和I/O密集型 (CPU-bound) (适合配置多线程,充分利用CPU资源)

内容
CPU密集型(根据实际的发生场景,也可以叫它计算密集型)的程序,如涉及到大量的计算(如计算圆周率、对视频进行高清解码),这种任务主要消耗CPU资源,本身不太需要访问I/O设备,所以多线程是鸡肋,因为线程切换也是要耗时的。
PS:Python这样的脚本语言运行效率很低,完全不适合计算密集型任务。对于计算密集型任务,最好用C语言编写。)

I/O 密集型的的程序(如网络、磁盘IO)一般在达到性能极限时,CPU占用率仍然较低。
它的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)
因为任务本身需要大量I/O操作,此时用多线程,能充分利用CPU资源。因为I/O操作时,程序会有很多等待的机会,此时系统会切换到其他线程,把等待的时间利用上。
对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。
PS:对于IO密集型任务,最合适的语言就是开发效率最高(代码量最少)的语言,脚本语言是首选,C语言最差。)

常见的大部分任务都是IO密集型任务,比如Web应用。

应用区别(上面PS中具体提到的):
计算密集型程序适合C语言多线程,
I/O密集型适合脚本语言开发的多线程。

 

最后附上图来表示:

操作系统学习之---进程、线程、协程之间的区别和联系

 

操作系统学习之---进程、线程、协程之间的区别和联系

 

操作系统学习之---进程、线程、协程之间的区别和联系