任務管理器每秒刷新一次 CPU 使用率圖表。要讓曲線呈現平穩的 50%,不能讓 CPU 「全速跑 1 秒、睡 1 秒」(那會呈現方波),必須在調度時間片粒度(Windows 約 10ms)內交替執行「忙等待」與「睡眠」。本文從原理推導到代碼實作,並分析實測偏差原因。
for 迴圈燃燒週期Sleep(10) 釋放時間片(參數單位:毫秒)// 假設:空 for 迴圈 ≈ 5 條組合指令
// 2.0 GHz = 2e9 週期/秒,雙發射 ≈ 4e9 指令/秒
// 1 秒可執行迴圈:4e9 / 5 = 8e8 次
// 10ms 時間片內:8e8 * 0.01 = 8,000,000 次
#include
#include
#include // Sleep()
int main() {
const long LOOPS_PER_SLICE = 8000000L; // 需依實測校準
int i = 0;
while (1) {
// 忙等待:佔用 CPU
for (i = 0; i < LOOPS_PER_SLICE; ++i) {
// 空操作,編譯器優化可能移除,建議加 volatile 或內聯組語
}
// 釋放 CPU:睡眠 10ms
Sleep(10);
}
return 0;
}
實際運行曲線往往不穩定,主要原因:
volatile 或內聯 NOP)QueryPerformanceCounter 動態校準迴圈次數單純的忙等待+Sleep 只能作為教學示範。生產級 CPU 佔用率控制器,需結合高精度計時、多核調度、反饋控制等進階技術。