sleep()如何工作?

Ble*_*der 20 language-agnostic operating-system sleep

这可能是一个愚蠢的问题,但如何sleep(),wait(),pause(),职能的工作?

peo*_*oro 24

我们可以从更抽象的角度看待睡眠操作:它是一种让你等待事件的操作.
当从sleep调用传递的时间超过sleep参数时,将触发相关事件.

当进程处于活动状态时(即:它拥有一个CPU),它可以等待活动或被动方式的事件:

  • 活动等待是指进程主动/显式等待事件:

    sleep( t ):
        while not [event: elapsedTime > t ]:
            NOP // no operatior - do nothing
    
    Run Code Online (Sandbox Code Playgroud)

    这是一个简单的算法,可以以可移植的方式在任何地方实现,但是存在的问题是,当您的进程正在主动等待时,它仍然拥有CPU,浪费它(因为您的进程并不真正需要CPU,而其他任务可能需要它).

    通常这应该仅通过那些无法被动等待的过程来完成(参见下文).

  • 相反,通过在事件发生时要求其他东西唤醒你并暂停自己(即:释放CPU)来完成被动等待:

    sleep( t ):
        system.wakeMeUpWhen( [event: elapsedTime > t ] )
        release CPU
    
    Run Code Online (Sandbox Code Playgroud)

    为了实现被动等待,您需要一些外部支持:您必须能够释放CPU并在事件发生时让其他人叫醒您.

    这在单任务设备(如许多嵌入式设备)上是不可能的,除非硬件提供wakeMeUpWhen操作,因为没有人可以释放CPU或要求被唤醒.

    x86处理器(以及大多数其他处理器)提供HLT操作,使CPU休眠直到触发外部中断.这样一来,操作系统内核也可以睡眠以保持CPU冷却.