让CPU占用在给定的比例

让CPU占用在给定的比例

一段有意思的小程序, 可以让CPU占用维持在指定的比例(不考虑其他进程的影响)。

例如让CPU占用率维持在20%,基本原理是,让CPU在每100ms的时间里,线程工作20ms,休息80ms。

基本思路:

  • 计算每个线程的工作和休息时间
  • 创建多个线程
  • 同步线程,让所有线程一起工作和休息。
#include <chrono>
#include <iostream>
#include <thread>
#include <vector>
using namespace std;
using namespace std::chrono;

void cpuLoadFunction(int workTimeMs, int restTimeMs) {
    auto workDuration = milliseconds(workTimeMs);
    auto restDuration = milliseconds(restTimeMs);

    while (true) {
        auto start = steady_clock::now();
        // 工作时间
        while (steady_clock::now() - start < workDuration) {
            // 繁忙等待
        }
        // 休息时间
        std::this_thread::sleep_for(restDuration);
    }
}

int main() {
    int targetPercentage;
    std::cout << "Enter target CPU usage percentage (1-100): ";
    std::cin >> targetPercentage;

    if (targetPercentage < 1 || targetPercentage > 100) {
        std::cerr << "Percentage must be between 1 and 100." << std::endl;
        return 1;
    }

    int numThreads = std::thread::hardware_concurrency();
    if (numThreads == 0) {
        numThreads = 2;  // 如果无法确定核心数,默认使用2个线程
    }

    int workTimeMs = targetPercentage;
    int restTimeMs = 100 - targetPercentage;

    std::vector<std::thread> threads;
    for (int i = 0; i < numThreads; ++i) {
        threads.emplace_back(cpuLoadFunction, workTimeMs, restTimeMs);
    }

    // 等待所有线程结束(实际上它们会无限运行)
    for (auto& t : threads) {
        t.join();
    }

    return 0;
}

理论上是可以实现让CPU占比维持在指定数值上的,但实际情况更加复杂,首先线程分为用户级线程和内核级线程,查阅std::thread的相关介绍,这里创建的是内核级线程,同时操作系统不一定会将每个线程单独分配到一个逻辑处理器上,因此这里的占用是理论上的。

作者:WuQiling
文章链接:https://www.wqlblog.cn/让cpu占用在给定的比例/
文章采用 CC BY-NC-SA 4.0 协议进行许可,转载请遵循协议
暂无评论

发送评论 编辑评论


				
默认
贴吧
上一篇