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

精準控制 CPU 佔用率:50% 穩定輸出的實作與原理

     編輯:關於C

任務管理器每秒刷新一次 CPU 使用率圖表。要讓曲線呈現平穩的 50%,不能讓 CPU 「全速跑 1 秒、睡 1 秒」(那會呈現方波),必須在調度時間片粒度(Windows 約 10ms)內交替執行「忙等待」與「睡眠」。本文從原理推導到代碼實作,並分析實測偏差原因。

核心原理:時間片級別的占用控制

  • 目標:每 10ms 時間片內,CPU 執行 5ms、閒置 5ms
  • 忙等待:空 for 迴圈燃燒週期
  • 閒置:Sleep(10) 釋放時間片(參數單位:毫秒)

迴圈次數估算(2.0 GHz CPU 為例)

// 假設:空 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;
}

實測偏差分析

實際運行曲線往往不穩定,主要原因:

  1. 系統背景負載:OS 服務、驅動、中斷處理同樣消耗 CPU
  2. 編譯器優化:空迴圈可能被完全優化掉(需 volatile 或內聯 NOP)
  3. 時間片不固定:Windows 非即時系統,調度延遲、優先級搶佔導致實際執行時間波動
  4. 多核心干擾:單執行緒只能佔用單核,系統整體佔用率 = 單核佔用 / 核心數

改進方向(下篇預告)

  • 使用高精度計時器 QueryPerformanceCounter 動態校準迴圈次數
  • 多執行緒綁定不同核心,實現系統級佔用率控制
  • 引入 PID 控制演算法,根據實際佔用率反饋調整忙等待時長

單純的忙等待+Sleep 只能作為教學示範。生產級 CPU 佔用率控制器,需結合高精度計時、多核調度、反饋控制等進階技術。

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