一、为什么要有协程
对于操作系统来说,线程是 CPU 调度的最小单元,进程是资源管理的最小单元。
在多核场景下,如果是 IO 密集型场景,就算开多个线程来处理,也未必能提升 CPU 的利用率,反而会增加线程切换的开销。另外,多线程之间假如存在临界区或者共享数据,那么同步的开销也可能比较大。
那么协程可以解决如上的问题。
协程是一种比线程更加轻量化的存在,一个线程中可以拥有多个协程。协程的调度由用户实现的调度器来控制。协程拥有自己的寄存器上下文和栈。协程在做调度切换时,一般会将寄存器上下文和栈保存到某个指定地方,在切回来时,恢复先前保存的寄存器上下文和栈,这个过程都是在用户空间完成的,不需要内核的参与。所以切换过程是非常快的。
对于 CPU 密集型场景,使用协程可能还会增加调度切换的开销。
二、实现
在线程的时间片中进行调度。在线程的栈中保存协程的上下文,采用轮询的方式调度协程的执行。
利用 Linux 的信号机制模拟时钟中断。每当模拟的信号来临时,进行协程切换。