boost.fcontext 为何快?
💡
原文中文,约900字,阅读约需3分钟。
📝
内容提要
在批评libco的上下文切换代码时,我认为协程只需恢复非易失性寄存器,而用户协程调度无需恢复易失性寄存器。为验证这一点,我编写了zcontext,发现其与boost.context的fcontext实现相似,均只恢复非易失性寄存器,从而显示出更快的上下文切换性能。
🎯
关键要点
- 协程的上下文切换只需恢复非易失性寄存器,无需恢复易失性寄存器。
- 操作系统的抢占式调度需要恢复所有寄存器,以防止寄存器值的意外改变。
- 用户协程调度是主动调用控制权转移接口,不会在任意时刻中断。
- 在协程上下文切换中,只需恢复非易失性寄存器的内容。
- 作者编写了 zcontext 进行验证,发现其与 boost.context 的 fcontext 实现相似。
- zcontext 只恢复了8个非易失性通用寄存器,未恢复16个 MMX 和 AVX 寄存器。
- boost.context 的 fcontext 也只恢复非易失性寄存器,使用 mov 指令而非 push/pop。
- boost.context 的上下文切换性能被认为是最快的。
- libco 的上下文切换代码被批评为性能低下。
❓
延伸问答
为什么协程的上下文切换只需恢复非易失性寄存器?
因为用户协程调度是主动调用控制权转移接口,不会在任意时刻中断,因此只需恢复非易失性寄存器的内容。
boost.context 的 fcontext 实现有什么特点?
boost.context 的 fcontext 只恢复非易失性寄存器,使用 mov 指令进行上下文切换,性能被认为是最快的。
libco 的上下文切换代码为何被批评?
libco 的上下文切换代码被批评为性能低下,因为它需要恢复所有寄存器,而不是仅恢复非易失性寄存器。
zcontext 是什么,它的作用是什么?
zcontext 是作者为验证协程上下文切换性能而编写的代码,主要用于只恢复非易失性寄存器的上下文切换。
上下文切换中恢复易失性寄存器有什么问题?
恢复易失性寄存器在协程上下文切换中是不必要的,因为调用者假定这些寄存器的值会改变。
作者对 boost.context 的看法是什么?
作者认为 boost.context 的上下文切换性能是无敌的,因为它只恢复非易失性寄存器,效率极高。
➡️