我读到它不消耗 CPU 周期,但是内存中调用“ sleep ”的程序/线程会发生什么情况?会被放入等待队列吗?或者会发生什么?代码如何翻译成机器指令?或者更确切地说,它的机器指令相当于什么。
让我们举个例子,
`#include<WinBase.h>
main()
{
Sleep(10);
}`
此示例适用于 Windows,但我想问这个问题,无论平台如何。
最佳答案
答案显然是特定于操作系统和处理器的。 我不知道Windows,因为它是proprietary software ,许多实现细节被 Microsoft 隐藏了。
所以让我们考虑 free software像Linux一样的实现。所以你可以研究一下源代码。
调用sleep(3)可能会执行(由您的 C standard library )作为一些 system call像nanosleep(2) .
在 Linux 上,您可以使用 strace(1)查看某个给定进程或命令执行了哪些系统调用。
任何系统调用都涉及(根据定义)操作系统 kernel 。用户-mode执行内核模式切换机器指令(例如 x86-64 上的 SYSENTER
,或 INT
,或某些调用门等)。所以内核取得了控制权,它的scheduler可能会运行另一个可运行的 process (正如您所猜测的,在其等待队列中),或到 idle处理器(如果没有可运行的进程)。很久以后,内核将重新安排您的进程(可能在处理了许多 interrupts 之后)。
如果您想了解更多详细信息(对于 Linux!),请查看 libc 的源代码(例如 GNU libc 或 musl-libc )和 kernel 的源代码本身。
当然细节很复杂,需要读很多书,研究很多源码。
您还可以阅读一本很好的教科书,例如 Operating Systems: Three Easy Pieces 。它有几个关于调度、进程和线程的章节。
(我不了解 Windows,但我听说它的系统调用的实际集尚未发布。您将针对 WinAPI 进行编码,并且它的具体实现方式可能是某些 Microsoft 的“因此,如果您有兴趣了解内部,我建议使用并安装 Linux - 或其他一些自由软件操作系统。
关于c++ - C++ 中的 "sleep"会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41478218/