清晰的理解进程、线程和协程的关系,对深入理解计算机调度有很大的帮助。
在开始聊进程前,我们先要知道什么是程序,程序是一组计算机能够执行的指令的有序集合,是计算机硬盘上的数据文件。
进程
具有一定的独立功能的程序关于某个数据集合的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
线程
是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行必不可缺的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他线程共享进程拥有的全部资源。
协程
又称微线程,在单线程上执行多个任务,用函数切换,开销极小。不通过操作系统调度,没有进程、线程的切换开销。
三者关系
线程可以创建和撤销另外的线程。同一个进程中的多个线程之间可以并行执行(轮流获取CPU的时间片,在总体上给人的感觉是同时在执行,这是并发,还有一个名词叫并行,就是多核多CPU,真正的同时在执行)。
相对与进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。
三者区别
进程有别于线程和协程,进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其他进程产生影响,而线程和协程只是进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一旦其他一个线程崩溃就等于整个进程崩溃,所以多进程的程序要比多线程的程序健壮,但在进程切换时,消耗资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
多进程优缺点
缺点
1.逻辑控制复杂,需要和主程序交互;
2.需要跨进程边界,如果有大数据量传送,就不太适合,适合小数据量转送、密集运算,多进程调度开销比较大;
3.最好是多进程和多线程结合,即根据实际的需要,每个CPU开启一个子进程,这个子进程开启多个线程可以为若干同类型的数据进行处理。当然可以利用多线程+多CPU+轮询方式来解决问题...
4.占用内存多,切换复杂,CPU利用率低;
优点
1.每个进程相互独立,不影响主进程的稳定性,子进程崩溃没关系,开启守护模式,可以将崩溃的子进程拉起来;
2.通过增加CPU,就可以容易扩充性能;
3.可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是多线程的模块算法效率低也没关系;
4.每个进程都有地址空间和相关资源,总体能够达到性能上限非常大;
5.编程简单,调度简单;
6.适用于多核、多机分布;如果一台机器不够,扩展到多台机器比较简单;
多线程优缺点
缺点
1.每个线程与主进程共用地址空间,受限于进程的地址空间;
2.线程之间的同步和加锁控制比较麻烦,同步复杂;
3.一个线程的崩溃会导致整个进程的崩溃;
4.编程复杂,调度复杂;
优点
1.无需跨进程边界;
2.程序逻辑和控制方式简单;
3.所有线程可以直接共享内存和变量等;
4.线程方式消耗的总资源比进程方式少;
5.创建销毁、线程切换简单,CPU利用率高;
协程优缺点
缺点
1.协程的资源在用户态,需要用户自己管理协程,涉及的调度模型比较复杂;
2.如果出现出现系统调用阻塞的话,可能导致大量线程的创建,从而因为资源泄漏。
优点
1.比线程更小占用、更小的执行单元;
2.它是一个执行单元,因为自带CPU上下文切换。