操作系统 - 上下文切换

时间:2015-08-05 16:13:42

标签: process operating-system thread-sleep context-switch

我一直对进程之间的上下文切换问题感到困惑,给定了某个时间片的循环调度程序(这是unix / windows在基本意义上都使用的)。

因此,假设我们在一台核心机器上运行了200个进程。如果调度程序使用的是1ms时间片,则每个进程每200ms就会获得一次,这可能不是这种情况(想象一下Java高频应用程序,我不认为它会每200ms调度一次以满足请求)。话虽如此,我在图片中遗漏了什么?

此外,java和其他语言允许将正在运行的线程置于休眠状态,例如100毫秒。我是否正确地说这不会导致上下文切换,如果是这样,这是如何实现的?

1 个答案:

答案 0 :(得分:5)

  

因此,假设我们在一台核心机器上运行了200个进程。如果   调度程序使用甚至1ms的时间片,每个进程都会得到它   每200毫秒分享一次,这可能不是这样(想象一下Java   高频应用程序,我不认为它会每200毫秒安排一次   服务请求)。话虽如此,我错过了什么   图片?

不,你没有遗漏任何东西。在非先发制人的情况下也是如此。拥有先发制人权利(与其他流程相比具有高优先级)的人可以轻松交换不太有用的流程,达到高优先级流程运行10次的程度(假设 - 假设 - 实际结果完全取决于关于情况和实施情况),而不是最低优先级的流程,直到前者不会产生最不优先流程的饥饿状态。

谈论类似优先级的过程,它完全取决于你提到的Round-Robin算法,尽管首先根据实现选择哪个过程。并且,Windows和Unix具有相同的进程调度算法。 Windows和Unix确实使用Round-Robin,但Linux任务调度程序称为完全公平调度程序(CFS)。

  

此外,java和其他语言允许放置正在运行的线程   为...睡觉100毫秒。我是否正确地说这不是   导致上下文切换,如果是,这是如何实现的?

编程语言和库借助内核实现“休眠”功能。如果没有内核级别的支持,他们必须忙着等待,在紧密的循环中旋转,直到请求的睡眠持续时间过去。这会浪费处理器。

谈论导致睡眠的线程(Thread.sleep(long millis))通常在大多数系统中完成以下操作:

  1. 暂停执行该流程并将其标记为不可运行。

  2. 为给定的等待时间设置计时器。系统提供硬件定时器,让内核注册在将来的某一点接收中断。

  3. 当计时器点击时,将进程标记为可运行。

  4. 我希望您可能会注意到一对一,多对一,多对多的线程模型。所以,我没有详细介绍,只是为自己提供参考。

    您可能会觉得它增加了开销/复杂性。但是,这就是如何操作线程(在JVM中创建的用户线程)。然后,选择是基于我上面提到的那些内存模型。查看this Quora question and answers to that one,请仔细阅读Robert-Love给出的最佳答案。

    如需进一步阅读,建议您阅读Scheduling Algorithms explanation on OSDev.orgOperating System Concepts book by Galvin, Gagne, Silberschatz