操作系统 - 协程

我们常说的协程是在用户态实现的一种编程范式,严格意义上来说,协程并不属于操作系统的范畴。本质上来说,协程是被协程调度器处理的一段内存数据,他包含协程本身的 Context 信息及我们任务代码的地址信息。

协程和线程的区别

直观上,可以把协程和线程做对比。都有任务调度机制,不过线程是内核级别(抢占式),而协程是用户级别(协作式),所以基于协程的任务切换开销要由于线程。都可以被执行、挂起、恢复,在 IO 密集型的任务中,通常伴随大量的挂起和恢复操作,如果使用协程来实现,可以节省大量内核/用户态切换、线程上下文切换开销。

但是需要注意的是,线程是完全并行的,而协程则不一定,要看协程调度器的实现是如何和线程绑定的,可以做到并发,但不一定能做到并行。对于计算密集型行任务,要充分考虑使用协程是否符合预期。

协程切换同样需要保存协程的运行时上下文信息(栈和寄存器信息)。

协程和函数的区别

  • 协程有自己的上下文(状态、运行指令位置、寄存器信息等)
  • 协程可以被打断,可以主动暂停
  • 协程具备更好的并行、协作能力
  • 协程可以实现 lazy 计算

协程切换过程

参考