一尘不染

sleep()背后的算法是什么?

algorithm

现在有个我一直想知道的事情:sleep()是如何实现的?

如果仅使用操作系统中的API,那么该API是如何制成的?

是否全部归结为在CPU上使用特殊的机器代码?该CPU是否需要特殊的协处理器或其他Gizmo,否则您将无法拥有sleep()?

sleep()最著名的化身是C语言(更准确地说,是C编译器随附的库,例如GNU的libc),尽管当今几乎每种语言都有其等效语言,但是sleep在某些语言中的实现(认为Bash)不是我们在此问题中所关注的…

编辑:阅读一些答案后,我看到该进程被放置在等待队列中。从那里,我可以猜出两种选择

  1. 设置了一个计时器,以便内核在适当的时候唤醒进程,或者
  2. 只要允许内核有一个时间片,它就会轮询时钟以检查是否该唤醒一个进程。

答案仅提及备选方案1。因此,我问:此计时器的行为如何?如果是让内核唤醒进程的简单中断,内核如何要求计时器“在140毫秒内唤醒我,以便使进程进入运行状态”?


阅读 205

收藏
2020-07-28

共1个答案

一尘不染

问题的“更新”显示了对现代操作系统的工作方式的一些误解。

内核不“允许”时间片。内核是为用户进程分配时间片的东西。未将“计时器”设置为唤醒睡眠进程,而是将其设置为停止当前正在运行的进程。

本质上,内核试图通过停止CPU上时间过长的进程来公平地分配CPU时间。为了简化起见,假设任何进程使用CPU的时间都不得超过2毫秒。因此,内核会将计时器设置为2毫秒,然后让进程运行。当计时器触发中断时,内核将获得控制权。它保存正在运行的进程的当前状态(寄存器,指令指针等),并且不会将控件返回给它。而是从等待给定CPU的进程列表中选择另一个进程,被中断的进程转到队列的后面。

睡眠过程根本 不在
等待CPU的事务队列中。相反,它存储在睡眠队列中。每当内核收到计时器中断时,都会检查睡眠队列,并将时间已到的进程转移到“等待CPU”队列中。

当然,这是一个简单的简化。它采用非常复杂的算法来确保安全性,公平性,平衡性,优先级,防止饥饿,并且以最少的内核数据存储量来快速完成所有工作。

2020-07-28