这可能是一个愚蠢的问题,但sleep()
,wait()
,pause()
功能如何运作?
答案 0 :(得分:22)
我们可以从更抽象的角度看待睡眠操作:这是一个让你等待事件的操作。
当从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冷却。
答案 1 :(得分:4)
现代操作系统是多任务处理,这意味着它似乎同时运行多个程序。实际上,您的计算机(传统上至少)只有一个CPU,因此它只能同时从一个程序执行一条指令。
操作系统看起来多种东西(你正在浏览网页,听音乐和下载文件)同时发生的方式是通过执行每个任务很短的时间(比方说10毫秒)。这种快速切换使得看起来事物同时发生,而事实上所有事情都是顺序发生的。 (多核系统存在明显差异)。
至于问题的答案:对于睡眠或等待或同步IO,程序基本上是告诉操作系统执行其他任务,并且不要再运行我,直到:X ms已经过去,事件已经已发出信号,或数据准备就绪。
答案 2 :(得分:1)
这些是系统调用。在Linux或Open BSD中查看开源代码中的实现。
答案 3 :(得分:1)
sleep()
导致调用线程从操作系统的就绪队列中移除,并插入到另一个队列中,操作系统定期检查 sleep() 是否超时,之后线程再次准备就绪。当线程从队列中移除时,操作系统会在休眠期间调度其他就绪线程,包括始终处于就绪队列中的“空闲”线程。