协程又称微线程,英文名Coroutine。
简而言之,协程就是可中断的函数,协程如何实现:保存上下文和恢复上下文。
一个线程执行一个子程序例如一个函数,调用子程序总是一个入口,一次返回,顺序明确,而协程看上去也是子程序,但执行过程中,在子程序内部可中断,转而执行别的子程序,在适当的时候再返回来执行,有点类似cpu的中断。特点在于是在一个线程执行的。
协程与多线程的优势?
- 协程执行效率极高,没有线程切换的开销,和多线程相比线程数量越多时协程的性能越明显。
- 不需要多线程的锁机制,因为只有一个线程。而非线程的抢占式多任务。
协程是一个线程,那如何利用多核cpu?
最简单的方法是多进程+协程,能充分利用多核又充分发挥协程效率。
协程的两个原语:
- yeild 让出
- resume 恢复
三种实现协程的方式:
- setjmp/longjmp:libmill-基于 setjump/longjump 的协程切换
- ucontext :phxrpc-基于 ucontext/Boost.context 的上下文切换
- 汇编的代码:libco、Boost.context-基于汇编代码的上下文切换
基于汇编的上下文切换要比采用系统调用的切换更加高效。
调度器
调度器就是处理好协程之间的调用,知道所有协程调用的时机,通过调度器可以实现更多的功能,如定时协程,io协程。
调度器简单理解为一个队列,将一个协程扔进调度器,调度器根据来执行所有的协程,那么调度器如何执行呢,简单来说就是使用一个循环,从队列中取出协程,然后“复苏”这个协程。