查看strace
我的来源,发现使用了克隆标志CLONE_IDLETASK
,在那里描述为:
#define CLONE_IDLETASK 0x00001000 /* kernel-only flag */
Run Code Online (Sandbox Code Playgroud)
在深入研究之后,我发现,虽然该标志并未包含在man clone
其中,但内核在引导过程中实际使用它为机器上的每个 CPU 创建空闲进程(所有这些进程都应该具有 PID 0)。即具有 8 个 CPU 的机器将至少有 7 个(见下面的问题)这样的进程“运行”(注意引号)。
现在,这让我想到了几个关于“空闲”过程实际上做了什么的问题。我的假设是它会持续执行 NOP 操作,直到它的时间范围结束并且内核分配一个真正的进程来运行或再次分配空闲进程(如果 CPU 没有被使用)。然而,这完全是猜测。所以:
在一台有 8 个 CPU 的机器上,会创建 7 个这样的空闲进程吗?(一个 CPU 将由内核本身持有,而没有执行用户空间工作?)
空闲进程真的只是一个无限的 NOP 操作流吗?(或执行相同操作的循环)。
CPU 使用率(比如说uptime
)是否简单地通过空闲进程在 CPU 上的时间以及在特定时间段内不存在的时间来计算?
PS 这个问题的很大一部分很可能是由于我不完全了解 CPU 的工作原理。即我了解程序集、时间范围和中断,但我不知道如何,例如,CPU 可能会根据执行的内容使用更多或更少的能量。如果有人也能启发我,我将不胜感激。