【问题标题】:What is the overhead associated with context switching?与上下文切换相关的开销是多少?
【发布时间】:2013-11-07 02:38:26
【问题描述】:
在课堂上,我们学习了调度中使用的不同算法,例如抢占。有人问切换上下文的开销是否是一个问题,教授说它总是可以忽略不计。这是真的?根据wikipedia,当上下文切换发生时,“进程的状态包括进程可能正在使用的所有寄存器,......加上可能需要的任何其他操作系统特定数据”所以基本上所有内容都需要保存到我不认为是微不足道的记忆?
是否有任何算法/实现会考虑上下文切换所需的时间?例如,一个 10 毫秒的任务正在运行,但一个需要 8 毫秒的新任务进入队列,调度程序会不会说“忘记它”,因为额外的上下文切换回 10 毫秒不值得?
【问题讨论】:
标签:
assembly
operating-system
scheduler
【解决方案1】:
不是可以忽略不计,但也不多。当然,如果进程更改和线程更改发生,用户寄存器可能会更多的段/保护寄存器。线程堆栈已经在内存中,不需要保存。如果线程在 I/O 上准备就绪,实际的上下文更改可能会被驱动程序代码的运行淹没。
10/8 毫秒...
进程中的大多数上下文切换都比这快得多!在进程中的线程的情况下,我们经常谈论低 uS,一旦新线程运行,如果需要完成一些缓存刷新,可能会有更多的开销。如果新运行的线程属于不同的进程,则会有更多的开销 - 更多的寄存器要保存,更有可能缓存等。还有更多的开销是上下文切换涉及停止另一个内核上的线程而不是运行调度程序/dispatcher 因为需要中断其他核心。
最坏的情况 - 以上所有情况加上立即页面错误,因为新线程没有运行太久以至于它的代码/堆栈/任何内容都已被分页。幸运的是,几乎不会发生。
如果那个 8ms 线程是您的视频流应用程序中的高优先级渲染线程,您不希望它延迟,从而导致抖动,因为操作系统调度算法会为了一些可能的额外开销而搞砸了您:)