boost的协程切换分析
主要有两个接口,一个make_fcontext(),一个jump_fcontext()
相比ucontext,boost的切换模式,少了单独对context进行保存(getcontext)和切换(setcontext)过程,而是把两者合并到一起,通过jump_fcontext接口实现直接切换
这样做有个好处,就是更加容易进行优化,使得整个切换过程更加的紧凑
boost的context和stack是一起的,栈底指针就是context,设计非常巧妙,切换context就是切换stack,一举两得,但是这样每次切换就必须更新context
因为每次切换context后,context地址都会变掉。
现在可以和ucontext对比下,就可以看出,这种切换方式的一些优势:
- 保存和恢复寄存器数据,在一个切换接口中,更加容易进行优化
- 通过stack基栈作为context,切换栈相当于切换了context,一举两得,指令数更少
- 对参数、可变寄存器没去保存,仅保存部分必须的寄存器,进一步减少指令数