与上下文切换相关的开销是多少?

时间:2013-11-07 02:38:27

标签: assembly operating-system scheduler

在课堂上,我们学习了调度中使用的不同算法,例如抢占。有人问到转换环境中的头脑是否是一个问题而且教授说它总是可以忽略不计。这是真的?根据{{​​3}}当上下文切换发生时,“进程的状态包括进程可能正在使用的所有寄存器,......以及可能需要的任何其他操作系统特定数据”,所以基本上所有内容都需要保存到记忆中我不认为是微不足道的?

是否有任何算法/实现会考虑上下文切换所需的时间?例如,一个10ms的任务正在运行,但是一个需要8ms的新任务进入队列,调度程序是否会说“忘记它”,因为额外的上下文切换回10ms是不值得的?

1 个答案:

答案 0 :(得分:1)

不可忽视,但也不多。用户注册,当然,如果进程变化和线程更改,可能会有更多的段/保护寄存器。线程堆栈已经在内存中,不需要保存。如果线程在I / O上准备就绪,则实际的上下文更改可能会被驱动程序代码的运行所淹没。

10 / 8ms的...

流程中的大多数上下文切换比这快得多!在进程中的线程的情况下,我们通常说低uS,如果有新的线程运行,如果有一些缓存刷新,可能会有更多的开销。如果新运行的线程属于不同的进程,将会有更多的开销 - 更多的寄存器要保存,更有可能是缓存等。上下文切换涉及在另一个核心上停止线程而不是运行sheduler的线程会有更多的开销/调度员,因为其他核心需要被打断。

最坏的情况 - 所有上述内容加上一个立即页面错误,因为新线程已经运行了很长时间以至于它的代码/堆栈/已被分页的内容。幸运的是,几乎没有发生过。

如果那8ms线程是你的视频流应用程序中的高优先级渲染线程,你不会希望它延迟,导致抖动,因为操作系统调度算法为了一些可能的额外开销而搞砸了你:)