空閒的 CPU 程序有什麼作用?
查看原始碼,
strace
我發現複製標誌的使用在CLONE_IDLETASK
那裡被描述為:#define CLONE_IDLETASK 0x00001000 /* kernel-only flag */
在深入研究之後,我發現,雖然該標誌沒有被覆蓋,
man clone
但核心在引導過程中實際上使用它來為機器上的每個 CPU 創建空閒程序(所有這些程序都應該有 PID 0)。即具有 8 個 CPU 的機器將至少有 7 個(請參閱下面的問題)這樣的程序“執行”(注意引號)。現在,這讓我想到了幾個關於“空閒”過程實際上做了什麼的問題。我的假設是它連續執行 NOP 操作,直到它的時間範圍結束並且核心分配一個真正的程序來執行或再次分配空閒程序(如果沒有使用 CPU)。然而,這是一個完整的猜測。所以:
- 在一台有 8 個 CPU 的機器上會創建 7 個這樣的空閒程序嗎?(並且一個 CPU 將由核心本身持有,而沒有執行使用者空間工作?)
- 空閒程序真的只是一個無限的 NOP 操作流嗎?(或執行相同操作的循環)。
- CPU 使用率(比如
uptime
)是否簡單地通過空閒程序在 CPU 上的時間以及在特定時間段內它不存在的時間來計算?PS 這個問題很可能是由於我不完全了解 CPU 的工作原理。即,我了解程序集、時間框架和中斷,但我不知道,例如,CPU 可能會根據其正在執行的內容而使用更多或更少的能量。如果有人也能啟發我,我將不勝感激。
空閒任務用於程序記賬,也用於降低能耗。在 Linux 中,為每個處理器創建一個空閒任務,並鎖定到該處理器;只要該 CPU 上沒有其他程序可執行,就會安排空閒任務。在空閒任務上花費的時間在諸如
top
. (正常執行時間的計算方式不同。)Unix 似乎總是有某種空閒循環(但不一定是實際的空閒任務,請參閱Gilles 的回答),即使在 V1 中,它也使用了一條
WAIT
指令停止處理器直到發生中斷(它代表“等待打斷”)。其他一些作業系統使用繁忙循環,特別是 DOS、OS/2和早期版本的 Windows。很長一段時間以來,CPU 一直使用這種“等待”指令來降低能耗和熱量產生。arch/x86/kernel/process.c
您可以在 Linux 核心中看到各種空閒任務的實現:基本的只是呼叫HLT
,它停止處理器直到發生中斷(並啟用 C1 節能模式),其他實現處理各種錯誤或低效率(例如,在某些 CPU 上使用MWAIT
而不是)。HLT
當程序等待事件(I/O 等)時,所有這些都與程序中的空閒狀態完全分開。