我的意思是如果线程的量子时间是 20 毫秒,那么 20 的一些时间(15 毫秒)用于上下文切换,而其他时间(5 毫秒)用于执行?
4 回答
这是一个实现细节。
Linux 上发生的情况是,当进程/线程调度程序将 CPU 分配给线程时,该线程被视为正在运行。它执行的从内核模式切换回用户模式的代码被认为是代表该进程/线程执行的内核代码,因此上下文切换时间被视为线程/进程运行时间。
我会转储任何平均花费 75% 时间进行上下文切换的操作系统。当许多优先线程通过 I/O 中断/信号以不幸的、快速的顺序准备好并因此导致准备好的线程集发生“顺序”变化时,我只会期望这种基于传递的负载。
最好是开发人员/海报在提及抢占式内核时不再经常使用“量子”和“时间片”等术语。除了在严重超载的盒子上,滴答中断仅对超时其他阻塞调用和睡眠间隔有用。
无论如何,谁想出了“量子”这个术语?“量子”是不可分割的,而 99.9% 的家庭线程大部分时间都在等待 I/O 或彼此等待,运行时间少于滴答周期,立即分配一个内核并在它们准备好时运行并且几乎没有经历过仅仅因为他们的“时间片”结束而被窥视。
“时间片”听起来像是 60 年代的东西,而不是在 2012 年,抢占式内核快速响应驱动程序中断/信号并立即使那些等待准备/运行的线程/s。
没有“.NET 中的上下文切换”之类的东西,因为 .NET 不是操作系统,所有那些与线程相关的 CLR 库只是围绕操作系统 API 的包装器。
所以问题应该是这样的:“Windows 上的上下文切换需要多长时间?”
我想这取决于实现细节。
第十版“操作系统概念”(Silberschartz,Gagne,Galvin)在解释循环调度(第 210 页)时说:
“CPU 调度程序从就绪队列中选择第一个进程,设置一个计时器在 1 个时间段后中断,然后调度该进程。”
第 203 页定义的调度流程包括:
- 上下文切换
- 切换到用户模式
- 跳到电脑
还有一些语句表明上下文切换包含在时间片或时间片中。例如,再次在 RR 中,它说:
“每个进程必须等待不超过 (n-1) xq 个时间单位,直到它的下一个时间片。”