首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >操作系统上下文切换

问操作系统上下文切换
EN

Stack Overflow用户
提问于 2015-08-06 00:13:42
回答 1查看 372关注 0票数 0

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

因此,假设我们有200个进程在单核机器上运行。如果调度器使用1ms的时间片,那么每个进程将每200ms获得一次份额,但实际情况可能并非如此(想象一下Java高频应用程序,我不会假设它每隔200ms就被调度一次来处理请求)。话虽如此,我在图片中遗漏了什么?

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

EN

回答 1

Stack Overflow用户

发布于 2015-08-06 00:39:25

所以,假设我们有200个进程在单核机器上运行。如果调度器使用1ms的时间片,那么每个进程将每200ms获得一次份额,但实际情况可能并非如此(想象一下Java高频应用程序,我不会假设它每隔200ms就被调度一次来处理请求)。话虽如此,我在图片中遗漏了什么?

不,你不会错过任何东西。在非先发制人系统的情况下也是如此。那些拥有抢占权(与其他进程相比具有高优先级)的进程可以很容易地交换不太有用的进程,直到高优先级进程比最低优先级进程运行10倍(比方说/假设--实际结果完全取决于情况和实现),直到前者不产生最低优先级进程的饥饿状态。

说到类似优先级的进程,这完全取决于您提到的轮询算法,尽管首先选择哪个进程是基于实现的。而且,Windows和Unix具有相同的进程调度算法。Windows和Unix确实使用了循环调度,但是Linux任务调度程序被称为完全公平调度程序(CFS)。

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

编程语言和库在内核的帮助下实现“睡眠”功能。如果没有内核级的支持,它们将不得不忙碌地等待,在一个紧密的循环中旋转,直到所请求的睡眠持续时间过去。这会浪费处理器。

谈到导致休眠(Thread.sleep(long millis))的线程,通常在大多数系统中都会执行以下操作:

  1. 挂起进程的执行并将其标记为不可运行。
  2. 为给定的等待时间设置计时器。系统提供硬件计时器,让内核注册,以便将来在给定的时间点接收中断。
  3. 当计时器到达时,将进程标记为可运行。

我希望您可能知道线程模型,如一对一、多对一和多对多。所以,我不会涉及太多细节,只是给你自己一个参考。

在您看来,它似乎增加了开销/复杂性。但是,这就是线程(在JVM中创建的用户线程)的操作方式。然后,根据我上面提到的那些内存模型进行选择。查看this Quora question and answers to that one,请看罗伯特-爱给出的最好答案。

要进一步阅读,我建议您阅读Scheduling Algorithms explanation on OSDev.org和Operating System Concepts book by Galvin, Gagne, Silberschatz。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31837712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档