什么是协程?
协程是由线程创建的执行体,因为用户程序不能操作内核空间,所以只能给协程分配用户栈,操作系统对协程一无所知,所以协程被称为”用户级“线程。
每个协程拥有自己的执行栈,可以保存自己的执行现场,所以可以由用户程序按需创建协程,协程”主动让出“执行权时,会保存执行现场,然后切换到其他协程,协程恢复执行时,会根据之前保存的执行现场恢复到中断前的状态继续执行。实现了由用户态进行调度的多任务模型。
协程的本质是函数
和函数运行状态
的组合。(是可以在某个地方挂起的特殊函数,并且可以重新在挂起处继续执行)
协程、进程、线程的区别在那里?
进程是资源分配的最小单位,线程是处理机调度的最小单位。协程是用户级的线程,操作系统对协程一无所知。
操作系统01-20 | 阿秀的学习笔记 (interviewguide.cn)
同样是单线程环境下,协程的yield和resume一定是同步进行的,一个协程的yield,必然对应另一个协程的resume,因为线程不可能没有执行主体。并且,协程的yield和resume是完全由应用程序来控制的。与线程不同,线程创建之后,线程的运行和调度也是由操作系统自动完成的,但协程创建后,协程的运行和调度都要由应用程序来完成,就和调用函数一样,所以协程也被称为用户态线程。
并发性:
进程:不同进程之间切换实现并发,各自占有CPU实现并行;
线程:一个进程内部多个线程并发执行;
协程:同一时间内只能执行一个协程,而其他协程处于休眠状态,适合对任务进行分时处理(一个线程内的线程必须串行)
通信方面:
进程:进程间的通信需要借助操作系统;
线程:直接读写进程的数据段,例如全局变量;
协程:共享内存,消息队列;
协程的切换不需要锁机制。因为用户可以创建大量的协程,这些协程是按顺序执行的,不存在临界资源竞争的现象。
既然有了线程,为什么还要引入协程?
有线程的时候,如果线程阻塞了,需要释放处理机,保存现场,涉及用户态到内核态的切换,这样比较耗费资源,所以引入协程,在用户态进行调度,不需要进行切换到内核态。
协程是轻量化的进程。
协程是怎么实现的?
具体看完代码才能理解
引入协程后又有哪些缺点?
总结后自己想想
不能利用多核CPU,只能在某一核CPU上面执行,各个协程之间还是串行的。
什么是对称协程和非对称协程?
非对称协程:子协程只能和线程主协程(调度器)切换,而不能和另一个子协程切换,并且在程序结束时,一定要再回到主协程,以保证程序正常运行。可以有两个操作,就是resume和yield,从哪里resume的,yield就会回到那里;
对称协程:子协程可以直接和子协程切换,相当与每个协程都要充当调度器的角色,进入到协程之后只能由yield操作,将CPU让给调度器。
什么时候比较适合使用协程?
高并发,处理海量请求。对于多线程而言,内核态用户态两头忙,需要来回切换。I/O多路复用中的应用(回头学明白总结总结)。
目前存在哪些开源的协程库?
开源协程库libco,libco是微信后台大规模使用的C++协程库,属于非对称协程库。
参考
https://www.midlane.top/wiki/pages/viewpage.action?pageId=10060957
【协程第二话】协程和IO多路复用更配哦~_哔哩哔哩_bilibili