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 的上下文切换性能是无敌的,因为它只恢复非易失性寄存器,效率极高。

➡️

继续阅读