博主电脑CPU

zabbix CPU空闲时间占用率 是什么意思 cpu空闲时间百分比太大_编程之美

然后,打开任务管理器—>进程—>System Idle Process 占用了CPU的空闲时间,表示我们系统剩余的CPU资源,like this

zabbix CPU空闲时间占用率 是什么意思 cpu空闲时间百分比太大_c++_02


博主电脑的System Idle Process占用为97%,说明我现在没干啥高负荷的工作,电脑负担很轻。了解系统“闲下来”的时间,那么,要能控制CPU占用率曲线,就是调整“空闲”和“busy”的比率了。

一 使CPU使用达到50%
使用GetTickCount()和Sleep()

#include<stdio.h>
#include<windows.h>

int main()
{
    const DWORD busyTime = 10;//10ms,因为10ms比较接近windows的调度时间片
    const DWORD  idleTime = busyTime;

    INT64 startTime = 0; 

    while(true){
        DWORD startTime = GetTickCount();//该函数可以得到“系统启动到现在”所经历时间的毫秒数
        //busy loop
        while((GetTickCount()-startTime)<=busyTime){;
        }
        //idle loop
        Sleep(idleTime);
    }
}

运行后,得到如下:

zabbix CPU空闲时间占用率 是什么意思 cpu空闲时间百分比太大_系统_03


可以看到CPU每一核使用基本趋于平稳,但是还是达不到使用为50%,因为在同一时刻,从上图可以看到CPU占用测试只是占用了24%,Idle占用了62%,还有别的进程占用了14%。

所以要寻找动态的解决办法

使用Perform

上图资源监视器进程中第四个也就是perform进程。

Perform可获取有关操作系统,应用程序和硬件的各种效能技术器(perf counter)。Perform的用法很直接,只要选择你所要检测的对象(such as 处理器、RAM或者硬盘)。
win7—>计算机—>管理—>性能—>性能监视器

选好自己要监视的对象之后,Like this

zabbix CPU空闲时间占用率 是什么意思 cpu空闲时间百分比太大_编程之美_04

.Net Framework提供了PerformanceCounter这一对象,可以方便地得到当前各种性能数据,包括CPU的使用率。

namespace cpu占用测试
{
    class Program
    {
        static void MakeUsage(double level)
        {
            PerformanceCounter p = new PerformanceCounter("Processor", "% Processor Time", "_Total");

            if (p == null)
                return;
            while (true) 
            {

                if(p.NextValue()>level)
                {
                    System.Threading.Thread.Sleep(10);
                }
            }
        }
        static void Main(string[] args)
        {
            MakeUsage(0.5);
        }
    }
}

由于博主电脑四核,所以完全看不到50%的说,而且这个50%分配到每一核大概是多少也是不确定的。

二 CPU占用率达到正弦曲线

const int SAMPLING_COUNT = 200;
const double PI = 3.1415926535;
const int TOTAL_AMPLITUDE = 300;

int main()
{
    DWORD busySpan[SAMPLING_COUNT];
    int amplitude = TOTAL_AMPLITUDE/2;
    double radian = 0.0;
    double radianIncrement = 2.0/(double)SAMPLING_COUNT;//抽样弧度的增量
    for(int i = 0;i<SAMPLING_COUNT;++i)
    {
        busySpan[i] = (DWORD)(amplitude+(sin(PI*radian)*amplitude));
        radian +=radianIncrement;
        printf("%d\t%d\n",busySpan[i],TOTAL_AMPLITUDE-busySpan[i]);
    }

    DWORD startTime = 0;
    for(int j = 0;;j = (j+1)%SAMPLING_COUNT)
    {
        startTime = GetTickCount();
        while((GetTickCount()-startTime)<=busySpan[j])
            ;
        Sleep(TOTAL_AMPLITUDE - busySpan[j]);
    }
    return 0;
}

zabbix CPU空闲时间占用率 是什么意思 cpu空闲时间百分比太大_编程之美_05

总的还是能看到正弦曲线的雏形。

接下来指定某一CPU看看,主要用到两个函数指定运行哪个CPU用SetThreadAffinityMask()
定义:

DWORD_PTR SetThreadAffinityMask(HANDLE hThread, DWORD_PTR dwThreadAffinityMask);

该函数中的hThread参数用于指明要限制哪个线程, dwThreadAffinityMask用于指明该线程能够在哪个CPU上运行。dwThreadAffinityMask必须是进程的亲缘性屏蔽的相应子集。返回值是线程的前一个亲缘性屏蔽。 关于进程的亲缘性,请看线程的相关性

修改后

int main()
{
    SetProcessAffinityMask(GetCurrentProcess(),0x00000001);//指定CPU

    DWORD busySpan[SAMPLING_COUNT];
    int amplitude = TOTAL_AMPLITUDE/2;
    double radian = 0.0;
    double radianIncrement = 2.0/(double)SAMPLING_COUNT;//抽样弧度的增量
    for(int i = 0;i<SAMPLING_COUNT;++i)
    {
        busySpan[i] = (DWORD)(amplitude+(sin(PI*radian)*amplitude));
        radian +=radianIncrement;
        printf("%d\t%d\n",busySpan[i],TOTAL_AMPLITUDE-busySpan[i]);
    }

    DWORD startTime = 0;
    for(int j = 0;;j = (j+1)%SAMPLING_COUNT)
    {
        startTime = GetTickCount();
        while((GetTickCount()-startTime)<=busySpan[j])
            ;
        Sleep(TOTAL_AMPLITUDE - busySpan[j]);
    }
    return 0;
}

运行结果

zabbix CPU空闲时间占用率 是什么意思 cpu空闲时间百分比太大_process_06


可以看到指定程序只在cpu0上运行。

《编程之美》第一篇还是很有意思的,日后把可任务管理器玩成示波器的说。