如何在操作系统级别实现睡眠?

Fat*_*mon 25 c operating-system sleep

我只是对如何sleep(time in ms)在C库中实现或基本上在操作系统级别实现...

我猜...

  1. 可能是基于处理器速度你做了一段时间的nop循环(我不确定睡眠时间是否准确)...
  2. 处理器中的任何特殊寄存器,您在其中写入一些值,处理器只停止指定的时间(由于处理器甚至无法运行其他程序,这将是非常低效的).

有线索吗?可能C库的源代码可以解释一下吗?我并不太关注"C"是如何实现的......我只是想知道"sleep()"函数是如何实现的.

Mic*_*urr 21

Sleep()在操作系统级别实施.当任务/线程/进程正在休眠时,处理器不会旋转.该特定线程被置于挂起队列(线程尚未准备好运行),直到时间到期为止,此时线程将被置于准备运行队列中.

与此同时,将运行准备运行的其他线程.

只有当没有准备好运行的线程时,操作系统才会进入空闲线程,这通常会发出指令以关闭(或无论如何都处于低功耗状态)处理器,直到发生硬件中断.

仅对于一个非常简单的系统(如最简单的嵌入式系统),Sleep() 实际上可能实现为繁忙的等待循环.

任何操作系统教科书,例如Tanenbaum的"现代操作系统"都将非常详细地介绍它 - 几乎任何一本(甚至是旧的,便宜的,用过的).

  • 超时到期后多久,任务将再次运行依赖于调度程序.系统可以保证它会在超时到期后立即运行,但我认为大多数只是将它放在准备运行的队列中的适当位置(如果线程优先级大于任何其他),并且它会在下次安排时运行. (3认同)
  • 这错过了一个非常重要的解释:为什么操作系统调度程序首先有 CPU 时间来进行队列操作?选项 1:因为它在每个内核滴答时唤醒以更新其逻辑。选项 2:因为它在 CPU 上设置了一个定时器,在决定的休眠时间段后唤醒 CPU 和操作系统。(无滴答的内核) (2认同)