比较项 | 进程 | 线程 | 协程 |
---|---|---|---|
占用资源 | 随程序运行所需内存而变化 | 初始单位为1MB,固定不可变 | 初始一般为 2KB,可随需要而增大 |
调度所属 | 资源分配由OS完成 | 由 OS 的内核完成 | 由用户完成 |
切换开销 | 进程切换开销很大 | 涉及模式切换(从用户态切换到内核态)、16个寄存器、PC、SP...等寄存器的刷新等 | 只有三个寄存器的值修改 - PC / SP / DX. |
性能问题 | 进程独立运行 稳健 |
资源占用太高,频繁创建销毁会带来严重的性能问题, |
资源占用小,不会带来严重的性能问题, 在线程内部切换 |
数据同步 | 可通过进程间通信进行数据交换 | 需要用锁等机制确保数据的一直性和可见性 | 不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。 |
进程:是系统调度和分配资源的最小单位,拥有自己独立的堆和栈,进程由操作系统调度进程。进程维护的是程序所包含的资源(静态资源), 如:地址空间,打开的文件句柄集,文件系统状态,信号处理handler等;
线程:是CPU调度和分配任务的最小单位,拥有自己独立的栈,与同一个进程下的其他线程共享所属进程的堆,标准线程由操作系统调度。线程维护的运行相关的资源(动态资源),如:运行栈,调度相关的控制信息,待处理的信号集等;
协程:拥有自己独立的栈,与同一个进程下的其他线程共享所属进程的堆,协程由程序员在协程的代码里显式调度;