协程
最早是进程的工作机制,后来被现在抢占式的进程工作机制替代。
目前含义是在线程范围的。
协:是协作的意思。协程:coroutine 是在线程范围内相互协作以进一步提高 CPU 利用率的更细粒度的线程(可以叫作:纤程 fiber) 。
先看看线程和进程的关系
线程的出现是为了在进程的基础上提高 CPU 利用率。
拥有独立资源(CPU 时间和内存地址空间) 的进程如果遇到阻塞(如 IO) 则白白浪费 CPU 时间,什么事也没做。
在进程范围内定义若干线程(共享进程的 CPU 时间和内存空间) ,把进程要做的事情分配给线程去做。一个线程阻塞,就切到其他线程做其他事情。
开销
进程切换开销:
- 程序计数器
- 寄存器
- 变量
- 页表
线程切换也是有开销的,频繁的切换,开销就比较可观,CPU 被浪费在线程切换上。
线程切换开销:
- 程序计数器
- 寄存器
- 变量
省去开销最大的 页表 切换这一块,开销大大降低。
不过,线程切换与进程切换一样,都需要进行用户态与内核态的转换过程(具体指什么?)。
协程就是在线程内部,几个协程协作,把分配给当前线程的 CPU 时间充分利用起来,不轻易让出 CPU 时间给其他线程,减少线程切换开销,提高工作效率。
一般是 IO 密集型的应用适合协程的使用。
Java
参考
https://www.cnblogs.com/yjf512/p/5593181.html
https://www.zhihu.com/question/20511233