进程、线程以及协程的定义和区别

1 进程

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。

2 线程

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。

3 协程

协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

4 区别

1、多进程与线程的区别

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

  1)地址空间:线程是进程内的一个执行单元,进程内至少有一个线程,它们共享进程的地址空间,而进程有自己独立的地址空间;

  2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源;

  3)线程是处理器调度的基本单位,但进程不是;

  4)二者均可并发执行;

  5)每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口,但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

2、多协程与线程的区别

  1)一个线程可以多个协程,一个进程也可以单独拥有多个协程,这样程序中则能使用多核CPU;

  2)线程进程都是同步机制,而协程则是异步;

  3)协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态。

3、多进程和多线程的区别

多进程优点:

  1)每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系;

  2)通过增加CPU,就可以容易扩充性能;

  3)可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系;

  4)每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大。

多进程缺点:

  1)逻辑控制复杂,需要和主程序交互;

  2)需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算,多进程调度开销比较大;

  3)最好是多进程和多线程结合,即根据实际的需要,每个CPU开启一个子进程,这个子进程开启多线程可以为若干同类型的数据进行处理。当然你也可以利用多线程+多CPU+轮询方式来解决问题;

  4)方法和手段是多样的,关键是自己看起来实现方便有能够满足要求,代价也合适。

多线程的优点:

  1)无需跨进程边界;

  2)程序逻辑和控制方式简单;

  3)所有线程可以直接共享内存和变量等;

  4)线程方式消耗的总资源比进程方式好。

多线程缺点:

  1)每个线程与主程序共用地址空间,受限于2GB地址空间;

  2)线程之间的同步和加锁控制比较麻烦;

  3)一个线程的崩溃可能影响到整个程序的稳定性;

  4)到达一定的线程数程度后,即使再增加CPU也无法提高性能,例如Windows Server 2003,大约是1500个左右的线程数就快到极限了(线程堆栈设定为1M),如果设定线程堆栈为2M,还达不到1500个线程总数;

  5)线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU。

posted @ 2021-09-03 19:55  Jcpeng_std  阅读(418)  评论(0编辑  收藏  举报