我一直对进程之间的上下文切换问题感到困惑,因为给定了特定时间片的循环调度程序(这是unix/windows在基本意义上使用的)。
因此,假设我们有200个进程在单核机器上运行。如果调度器使用1ms的时间片,那么每个进程将每200ms获得一次份额,但实际情况可能并非如此(想象一下Java高频应用程序,我不会假设它每隔200ms就被调度一次来处理请求)。话虽如此,我在图片中遗漏了什么?
此外,java和其他语言允许将正在运行的线程休眠例如100ms。我说这不会导致上下文切换,这是正确的吗?如果是,这是如何实现的?
发布于 2015-08-06 00:39:25
所以,假设我们有200个进程在单核机器上运行。如果调度器使用1ms的时间片,那么每个进程将每200ms获得一次份额,但实际情况可能并非如此(想象一下Java高频应用程序,我不会假设它每隔200ms就被调度一次来处理请求)。话虽如此,我在图片中遗漏了什么?
不,你不会错过任何东西。在非先发制人系统的情况下也是如此。那些拥有抢占权(与其他进程相比具有高优先级)的进程可以很容易地交换不太有用的进程,直到高优先级进程比最低优先级进程运行10倍(比方说/假设--实际结果完全取决于情况和实现),直到前者不产生最低优先级进程的饥饿状态。
说到类似优先级的进程,这完全取决于您提到的轮询算法,尽管首先选择哪个进程是基于实现的。而且,Windows和Unix具有相同的进程调度算法。Windows和Unix确实使用了循环调度,但是Linux任务调度程序被称为完全公平调度程序(CFS)。
此外,java和其他语言允许将正在运行的线程休眠例如100ms。我说这不会导致上下文切换,这是正确的吗?如果是,这是如何实现的?
编程语言和库在内核的帮助下实现“睡眠”功能。如果没有内核级的支持,它们将不得不忙碌地等待,在一个紧密的循环中旋转,直到所请求的睡眠持续时间过去。这会浪费处理器。
谈到导致休眠(Thread.sleep(long millis))的线程,通常在大多数系统中都会执行以下操作:
我希望您可能知道线程模型,如一对一、多对一和多对多。所以,我不会涉及太多细节,只是给你自己一个参考。
在您看来,它似乎增加了开销/复杂性。但是,这就是线程(在JVM中创建的用户线程)的操作方式。然后,根据我上面提到的那些内存模型进行选择。查看this Quora question and answers to that one,请看罗伯特-爱给出的最好答案。
要进一步阅读,我建议您阅读Scheduling Algorithms explanation on OSDev.org和Operating System Concepts book by Galvin, Gagne, Silberschatz。
https://stackoverflow.com/questions/31837712
复制相似问题