[C++]让CPU使用率曲线呈现为正弦曲线(一)

看《编程之美》的第一题就很有意思:

写一个程序,让用户来决定Windows任务管理器的CPU占用率。可以实现下面三种情况:
1. CPU的占用率固定在50%,为一条直线;
2. CPU的占用率为条直线,但是具体占用率由命令行参数觉得(1~100);
3.CPU的占用率状态是一个正弦曲线

问题一

我开始是按照书上的做法来的,让CPU在一半的时间工作(一个空循环),另一半的时间Sleep。

#include<iostream>
#include<Windows.h>

using namespace std;

//工作和空闲各10ms
int busyTime = 10;
int idleTime = 10;
void CPU();

int main()
{
    CPU();
    return 0;
}

void CPU(){
    INT64 startTime = 0;
    while (true){
        startTime = GetTickCount();
        while ((GetTickCount()-startTime)<=busyTime)
        {
            ;
        }
        Sleep(idleTime);
    }
}

不过这个解法在我的电脑上并不可行,书上讨论的情况是只有单个CPU的环境,而我的CPU是双核四线程的,运行这个程序CPU使用率达不到50%,甚至当我把 Sleep(idleTime); 这句注释掉之后,CPU使用率也只不过30%左右。

解决这个问题我想到了两种办法:

  • 一是多线程,创建四个线程,让它们都运行这个CPU()函数;
  • 二是简单粗暴地在 Bois 里面设置一下,只使用CPU的一个核心,一个线程。

因为之前还没有接触过Windows多线程编程,所以在这儿我先偷懒选用了第二种方法,只用单个CPU核心(不过这样电脑卡顿了不少)。再次运行程序,从下面的截图可以看到,CPU使用率基本上就维持在了50%附近,基本上可以算是一条直线了。这些波动大概就是由于其他程序工作引起的。
解法一 50%使用率-任务管理器
解法一 50%使用率-性能监视器

问题二

对上面的解法设置level参数就可以使之呈现不同的使用率。

#include<iostream>
#include<Windows.h>
#include<cmath>

using namespace std;

int eachTime = 100;
void CPU(int busy,int idle);

int main()
{
    int level;
    cin >> level;
    int busyTime = eachTime*level / 100;
    int idleTime = eachTime - busyTime;

    CPU(busyTime,idleTime);
    return 0;
}

void CPU(int busy, int idle){
    INT64 startTime = 0;
    while (true){
        startTime = GetTickCount();
        while ((GetTickCount()-startTime)<=busy)
        {
            ;
        }
        Sleep(idle);
    }
}

下图为输入70时程序运行时性能监视器的曲线,基本上符合70%的占用率。
CPU70%占用率

问题三

为了让CPU使用率曲线呈现为一条正弦曲线,只要先算出一个正弦值的数组,依次根据数组中的值设定程序工作和空闲的时间。
先设置一个时间间隔eachTime,取其一半halfTime。每个工作时间busy=halfTime+sin(delta)*halftime,空闲时间则为eachTime-busy

#include<iostream>
#include<Windows.h>
#include<cmath>

using namespace std;

int eachTime = 100;
int halfTime = eachTime / 2;
int busy[200];
int idle[200];
const int COUNT = 200;
const double SPLIT = 0.01;
const double PI = 3.14159265;
void CPU();

int main()
{
    double delta = 0;
    for (int i = 0; i <COUNT; i++){
        delta = i*SPLIT*PI;
        cout << delta << endl;
        double s = sin(delta);
        busy[i]=s*halfTime+halfTime;
        idle[i] = eachTime-busy[i];
    }
    CPU();
    return 0;
}

void CPU(){
    INT64 startTime = 0;
    int i = 0;
    while (true){
        i %= COUNT;
        startTime = GetTickCount();
        while ((GetTickCount()-startTime)<=busy[i])
        {
            ;
        }
        Sleep(idle[i]);
        i++;
    }
}

实验结果如下图所示,不过结果还不是很好,一些细微的地方调整一下也许曲线会更完美一些。
正弦曲线-任务管理器
正弦曲线-性能监视器

我对这个的研究还不够详细,如果有错误的地方欢迎指正!
在单核处理器的环境下代码这么写差不多了,我一会就去把多核打开,电脑这样太卡顿了,过两天再把多核处理器下调整CPU使用率的方法研究一下。

版权声明:本文为博主原创文章,未经博主允许不得转载。

 

转载于:https://www.cnblogs.com/xiaff/p/4856505.html

### Linux CPU 使用率图形化展示工具 对于希望在Linux系统中以图形化方式展示CPU使用率的需求,有多种工具可供选择。 #### htop `htop` 是 `top` 的个增强版本,不仅提供了个更加直观的用户界面,而且支持鼠标操作以及更丰富的交互功能。通过这个工具能够方便地监视各个进程占用资源的情况,其中包括CPU使用率。它提供了良好的视觉效果,使得理解和管理系统的实时状态变得简单[^8]。 ```bash sudo apt-get install htop ``` 安装完成后可以直接输入 `htop` 启动程序,在界面上方会看到整体的CPU利用率图表。 #### Glances Glances是款基于Python开发的任务管理和资源监控软件,除了基本的功能外,还可以生成HTML报告并将其发送到浏览器端进行查看。其特色在于可扩展性强,可以通过插件的形式集成其他服务的数据源,如Docker容器统计信息等。 ```bash pip3 install glances glances -w & xdg-open http://localhost:61208/ ``` 上述命令将会启动Web服务器模式下的Glances,并自动打开默认网页浏览器访问本地地址来浏览详细的硬件性能指标,包括但不限于CPU核心级别的负载分布图。 #### Gnome System Monitor 如果正在使用GNOME桌面环境,则自带有个叫做Gnome System Monitor的应用程序。该应用具备简洁明了的设计风格,能清晰呈现各应用程序所消耗的时间百分比;同时也可以切换至“Resources”标签页观察段时间内的趋势变化曲线。 ![gnome-system-monitor](https://help.gnome.org/users/gnome-help/stable/pictures/system-monitor.png) 为了获取更为深入细致的剖析结果,可以考虑采用采样分析法配合专门设计用来捕捉内核事件轨迹数据集的工具链——Perf加上可视化手段之即火焰图(Flame Graph)[^2]。这种方法特别适合于定位那些难以捉摸却又影响效率的关键路径上的热点函数调用序列。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值