首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

程式控制 CPU 佔用率:從簡單空循環到精準調度的探索

     編輯:關於C語言

需求與思路

《編程之美》啟發:編寫程式使任務管理器顯示 CPU 佔用率穩定在 50%。任務管理器約 1 秒刷新一次,Windows 時間片約 10 ms。若在 1 秒內讓 CPU 忙閒各佔 50%(即 10 ms 忙 + 10 ms 閒循環),平均佔用率即為 50%。

第一版:校準空循環次數

理論計算

  • CPU 主頻 2.0 GHz,雙發射 → 40 億指令/秒
  • 空循環約 5 條彙編指令 → 8 億次/秒
  • 單時間片 (10 ms) 需 800 萬次循環

代碼實現

#include 
#include 
#include  // Sleep()

int main() {
    const long n = 8000000; // 理論值
    int i = 0;
    while (1) {
        for (i = 0; i < n; i++) { /* empty */ }
        Sleep(10); // 釋放時間片約 10 ms
    }
    return 0;
}

實測偏差分析

CPU 佔用率波動圖

  • 系統背景進程、中斷處理、I/O、核心調度均搶佔 CPU。
  • 空循環指令數隨編譯器優化、管線、快取而變動。
  • Sleep(10) 精度有限(最小 ~15.6 ms),實際閒置時間不穩定。

改進方向(下篇預告)

  1. 動態校準:啟動時測量單位時間空循環次數,自動調整 n。
  2. 高精度計時:使用 QueryPerformanceCounter 替代 Sleep,忙等待精確控制時間片。
  3. 多核心適配:設定執行緒親和性(SetThreadAffinityMask)鎖定單核,避免跨核調度干擾。
  4. 反饋控制:定期讀取自身 CPU 時間(GetProcessTimes),PID 調整忙閒比例。

核心啟示

「控制 CPU 佔用率」本質是時間片級別的資源調度博弈。單純空循環+Sleep 只能作為教學示範;生產級方案需結合高精度計時、動態反饋、系統負載感知,並考慮功耗與熱功耗影響。這也是作業系統調度器每天在做的事——我們只是在用戶態嘗試模擬而已。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved