Bob*_*r02 0 operating-system process context-switch thread-sleep
我已经对进程之间的上下文切换问题感到困惑,给定了某个时间片的循环调度程序(这是unix/windows在基本意义上都使用的).
因此,假设我们在一台核心机器上运行了200个进程.如果调度程序使用的是1ms时间片,则每个进程每200ms就会获得一次,这可能不是这种情况(想象一下Java高频应用程序,我不认为它会每200ms调度一次以满足请求).话虽如此,我在图片中遗漏了什么?
此外,java和其他语言允许将正在运行的线程休眠例如100ms.我是否正确地说这不会导致上下文切换,如果是这样,这是如何实现的?
因此,假设我们在一台核心机器上运行了200个进程.如果调度程序使用的是1ms时间片,则每个进程每200ms就会获得一次,这可能不是这种情况(想象一下Java高频应用程序,我不认为它会每200ms调度一次以满足请求).话虽如此,我在图片中遗漏了什么?
不,你没有遗漏任何东西.在非先发制人的情况下也是如此.拥有先发制人权利(与其他流程相比具有高优先级)的人可以轻松交换不太有用的流程,达到高优先级流程运行10次的程度(假设 - 假设 - 实际结果完全取决于关于情况和实施),而不是最低优先级的过程,直到前者不产生最不优先过程的饥饿状态.
谈到类似优先级的过程,它完全取决于你提到的Round-Robin算法,尽管首先根据实现选择哪个过程.并且,Windows和Unix具有相同的进程调度算法.Windows和Unix确实使用Round-Robin,但Linux任务调度程序称为完全公平调度程序(CFS).
此外,java和其他语言允许将正在运行的线程休眠例如100ms.我是否正确地说这不会导致上下文切换,如果是这样,这是如何实现的?
编程语言和库借助内核实现"休眠"功能.如果没有内核级别的支持,他们必须忙着等待,在紧密的循环中旋转,直到请求的睡眠持续时间过去.这会浪费消耗处理器.
谈论导致睡眠的线程(Thread.sleep(long millis))通常在大多数系统中完成以下操作:
暂停执行该进程并将其标记为不可运行.
为给定的等待时间设置计时器.系统提供硬件定时器,让内核注册在将来的给定点接收中断.
当计时器命中时,将进程标记为可运行.
我希望你可能会注意到一对一,多对一,多对多的线程模型.所以,我没有详细介绍,作为自己的参考.
它可能看起来好像会增加开销/复杂性.但是,这就是如何操作线程(在JVM中创建的用户线程).然后,选择是基于我上面提到的那些内存模型.检查此Quora问题和答案,请通过Robert-Love给出的最佳答案.
为了进一步阅读,我建议你阅读Galvin,Gagne,Silberschatz 撰写的OSDev.org上的调度算法解释和操作系统概念书.