睡眠 (系统调用)计算机程序(或进程、任务或线程等)进入不活跃状态并持续一段时间,称為“睡眠”。当引发程序睡眠的代码所设定的内部计时器归零,或是此程序收到唤醒信号或中断时,程序将恢复执行。 睡眠中的程序也有可能不经唤醒而直接被终止。 用法睡眠指令通常需要输入一个参数,以说明程序睡眠至少多长时间后才恢复执行。这一时间参数的单位通常是秒[來源請求],有些操作系统可以提供更高精度,例如以毫秒或微秒作为单位。 WindowsWindows 操作系统中, Unix在类Unix操作系统中, C语言样例Windows 操作系统中: Sleep(2*1000); // 睡眠2秒
类Unix操作系统中: sleep(2); // 睡眠2秒
底层功能睡眠使得线程或进程让出他们占用的剩余时间片,并在 “不在运行”状态等待一段时间。虽然这段程序在睡眠前被设定了最短睡眠时长,可这并不意味着这段时间结束后此程序能够立即恢复运作——这取决于 调度程序 的分配、等待唤醒的程序的优先级和其他一些因素。在 POSIX 系统中, nanosleep 及其他类似的系统指令会被中断信号中断,相应程序也会停止睡眠。而 sleep 库函数却不尽相同,在一些老一点的操作系统中,它是通过调用 alarm 系统指令实现的,因而必须通过送信号的方式才能运作。 在Windows中,由于除了终止运行信号外没有专门的信号可以用于打断,睡眠函数是不可中断的。不过,Windows提供了 SleepEX 函数来实现通过 APC 调用控制睡眠进程的唤醒。 严格说来,一个线程也可以由于其他线程终止运行或抛出异常被唤醒。 使用场景一些系统程序在事件轮询过程中从不被终止,只是在每个周期开始前进入睡眠状态,等待着某些事件的发生唤醒它们。当收到事件之后,它们就被唤醒去处理这些事件,然后进入下一个周期的等待。 还有一些程序周期性的从睡眠中恢复运行并收集事件。当运行恢复,程序拉取事件列表和状态变更情况,然后针对睡眠时发生的事件做相应处理,完成后再次进入睡眠,等待下一个时隙。这类事件被称作心跳事件,或“持久连接[5]”信号,可由上述类型的周期性程序发送。
不可中断睡眠不可中断睡眠指的是在此状态的程序无法对外界信号做出任何立即的响应,只有在为它提供足够的正在等待的资源或是睡眠时间结束它才会开始运行。这类睡眠常见于硬件驱动程序等待磁盘或网络输入输出结束。当进程处于不可中断睡眠状态,睡眠期间的信号会不断堆积到队列里面去。 在类Unix操作系统中,使用指令 另见参考文献
Information related to 睡眠 (系统调用) |