c++ - C++ 中的 "sleep"会发生什么?

标签 c++ multithreading kernel cpu cpu-architecture

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

让我们举个例子,

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

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

最佳答案

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

所以让我们考虑 free software像Linux一样的实现。所以你可以研究一下源代码。

调用sleep(3)可能会执行(由您的 C standard library )作为一些 system callnanosleep(2) .

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

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

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

当然细节很复杂,需要读很多书,研究很多源码。

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

(我不了解 Windows,但我听说它的系统调用的实际集尚未发布。您将针对 WinAPI 进行编码,并且它的具体实现方式可能是某些 Microsoft 的“因此,如果您有兴趣了解内部,我建议使用并安装 Linux - 或其他一些自由软件操作系统。

关于c++ - C++ 中的 "sleep"会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41478218/

相关文章:

c++ - C++使用Keccak库

c++ - static_assert 在 Visual C++ 10 中不起作用

c++ - 如何打开用 C++ 创建的 DLL 文件以查看类、方法和源代码?

c++ - 在 C++ 中处理 boost 线程竞争条件

ios - 如何防止 UI 快速卡住?

.net - IfxConnection 和线程可以相处吗?

c - RtlCopyMemory PUNICODE_STRING 到 WCHAR 段错误

c++ - 关于C++中构造函数链的一些问题

c++ - preempt_disable/enable 和 raw_local_irq_save/restore 在基准测试中的作用

android - 物理地址、设备地址和虚拟地址的区别