协程,线程,进程
协程 | 线程 | 进程 | |
---|---|---|---|
原理 | 协程有自己的寄存器上下文和栈。协程切换时,将寄存器和栈保存到其他地方,等切回来的时候,恢复之前保存到寄存器上下文和栈。 | 分配CPU资源。多个线程共享堆和方法区资源,每个线程有自己的程序计数器、虚拟机栈和本地方法栈 | 分配系统资源,标识任务。进程占有的资源有:①地址空间②全局变量③文件描述符④各种硬件资源。 |
优点 | 1、无需协程上下文切换的开销 2、无需原子操作锁定及同步的开销(不会被线程调度机制打断的操作)通过判断返回状态 3、高并发+高扩展+低成本 注意:python中实现协程通过generater的yield实现 | 1、有独立的运行栈和程序计数器,线程之间切换开销小 2、共享进程的系统资源 | 1、有独立的上下文 2、进程之间的系统资源相互独立 3、一个进程崩溃不会影响其他的进程。 |
缺点 | 1、无法利用多核资源:协程的本质是单线程,需要线程配合才可以在多CPU上运行 2、进行阻塞操作(如IO操作)会阻塞掉整个程序 | 1、一个线程的崩溃,会影响本进程的所有线程。 2、有锁机制,可能会死锁 | 1、进程切换开销大,不利于资源的有效利用 |
进程和线程的区别:
- 一个线程只能属于一个进程,一个进程可以有多个线程,但至少有一个线程
- 资源分配给进程,统一进程的所有线程共享所有资源
- cpu分配给线程,真正在cpu上运行的是线程
- 线程是最小的执行单位,进程是最小的资源管理单位
进程,线程,协程的选择
CPU核数 | 类型 | 选择 | 原因 |
多核CPU | CPU密集型 | 多线程 | 充分利用全部的CPU,又避免了协程切换的性能消耗 |
IO密集型 | 多线程多协程 | 充分利用全部的CPU,一个线程多个协程可以提高CPU利用率 | |
单核CPU | CPU密集型 | 单进程 | 单进程就已经CPU满载了 |
IO密集型 | 多协程 | 一个进程多个协程提高CPU利用率 |
僵尸进程,孤儿进程,守护进程
- 僵尸进程:在父进程还没有调用wait或者waitpid的方法获取子进程状态的时候,子进程的已经退出。那么子进程的状态描述继续保存在系统中。会导致资源浪费,占用着进程号无法释放,进程号的数量是有限的。
- 孤儿进程:父进程已经结束了,但是子进程还在继续,那么子进程就变成了孤儿进程,并且被init收养,这些进程结束后的状态将返回给init
- 守护进程:守护进程指一些系统启动的时候就开始允许的进程。他们的原本的父进程都已经结束了,都是孤儿进程,后被init收养,并且作为守护进程一直运行。