language-agnostic - sleep() 是如何工作的?

标签 language-agnostic operating-system sleep

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

最佳答案

我们可以从更抽象的角度来看休眠操作:它是一种让您等待事件的操作。
当时间从 sleep 过去时触发有问题的事件调用超过 sleep 参数。

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

  • 主动等待是指进程主动/明确等待事件:
    sleep( t ):
        while not [event: elapsedTime > t ]:
            NOP // no operatior - do nothing
    

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

    通常这应该只由那些不能被动等待的进程来完成(见下点)。
  • 被动等待是通过在事件发生时请求其他东西唤醒您并挂起自己(即:释放 CPU)来完成的:
    sleep( t ):
        system.wakeMeUpWhen( [event: elapsedTime > t ] )
        release CPU
    

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

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

    x86 处理器(和大多数其他处理器)提供 HLT使 CPU 休眠直到触发外部中断的操作。通过这种方式,操作系统内核也可以休眠以保持 CPU 冷却。
  • 关于language-agnostic - sleep() 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4911739/

    相关文章:

    asynchronous - 在运行下一个操作之前休眠 x 秒

    javascript - jquery sleep 未在 ajax 请求上执行

    algorithm - 通过具有正成本和负成本的成本矩阵的最小成本路径

    java - 如果某些命名约定(例如大写方法名称)如此令人不悦,那么为什么语言完全允许它们呢?

    c - 了解低级文件例程

    c++ - 为什么变量的打印地址会在每次执行时打印随机值,即使它是 C 中的逻辑地址?

    java - 方法签名最佳实践 - 重载与长名称

    random - 与随机数生成算法相关的种子是什么?为什么经常使用计算机时间来创建该种子?

    linux - 开发内核以支持多CPU

    opencv:显示图像并等待变量更改,而不是等待按键