在c ++的“睡眠”中会发生什么?

时间:2017-01-05 06:01:31

标签: c++ multithreading kernel cpu cpu-architecture

我读到它不消耗CPU周期但是内存中调用“sleep”的程序/线程会发生什么?它会被放入等待队列吗?或者会发生什么?如何将代码转换为机器指令?或者更确切地说,它的机器指令相当于什么。

让我们举个例子,

`#include<WinBase.h>
main()
{
    Sleep(10);
}`

此示例适用于Windows,但无论平台如何,我都想提出这个问题。

1 个答案:

答案 0 :(得分:2)

答案显然是操作系统和处理器特定的。 我不了解Windows,因为它是proprietary software,MicroSoft会隐藏许多实现细节。

因此,让我们考虑像Linux这样的free software实现。所以你可以研究源代码。

sleep(3)的来电可能(由您的C standard library)执行system call,如nanosleep(2)

在Linux上,您可以使用strace(1)查看某些给定进程或命令执行的系统调用。

任何系统调用都涉及(按定义)操作系统kernel。用户 - mode到内核模式切换机器指令被执行(例如x86-64上的SYSENTER,或INT,或某些呼叫门等......)。所以内核获得了控制权,它的scheduler可能会运行另一个 runnable process(在你的猜测等待队列中),或idle处理器(如果没有可运行的进程)。很久以后,内核会重新安排你的进程(可能在处理了很多interrupts之后)。

如果您需要更多详细信息(适用于Linux!),请查看您的libc的源代码(例如GNU libcmusl-libc)和kernel本身的源代码。

当然,细节非常复杂,您需要阅读很多书籍并学习很多源代码。

您还可以阅读一本好的教科书,例如Operating Systems: Three Easy Pieces。它有关于调度,进程和线程的几个章节。

(我不了解Windows,但我听说系统调用的实际集合未发布。您将对WinAPI进行编码,具体如何实施可能是一些MicroSoft&#34; secret&#34;因此,如果您有兴趣了解 internals ,我建议使用&amp;安装Linux或其他一些免费软件操作系统。 / SUP>