控制CPU使用率

我使用的是Ubuntu 14.04版本,用的是自带的系统监视器来观察CPU使用率的变化。

1.首先来说说怎么控制CPU使用率,当程序执行一个死循环的时候,使用率就会变成100%,而当程序进入idle的时候,使用率就会很低(在别的程序不启动的情况下),那么控制CPU使用率就是调整它idle和busy的时间比例。

2.CPU使用率设为任意值(0 ~ 1之间)
代码如下

//#define _GNU_SOURCE
#include 
#include 
#include 
#include 
#include 

int idleTime;
double busyTime = 0.01;

void setCpu(int id)
{
    cpu_set_t mask;
    CPU_ZERO(&mask);
    CPU_SET(id, &mask);
    if (sched_setaffinity(0,sizeof(mask),&mask) == -1)
    {
        printf("warning: could not set CPU affinity\n");
    }
}

int main(int argc, char const *argv[])
{
    double percent;
    //input
    printf("Input cpu percent(0 ~ 1): ");
    scanf("%lf",&percent);

    idleTime = (busyTime / percent) * 1000000 * (1 - percent);

    //set cpu id
    setCpu(0);

    //infinite loop
    while (true)
    {
        clock_t begin = clock();
        while ((double)(clock() - begin) / CLOCKS_PER_SEC <= busyTime);
        usleep(idleTime);
    }
    return 0;
}

效果图:
30%:
控制CPU使用率_第1张图片

80%:
控制CPU使用率_第2张图片

3.CPU使用率为正弦曲线
由于2中已经做到了把CPU使用率设为任意值,所以做成一个函数图像也比较简单,代码如下:

//#define _GNU_SOURCE
#include 
#include 
#include 
#include 
#include 
#include 
#define PI 3.14159265
#define valueSize 3600

const double sliceTime = 0.02;


void setCpu(int id)
{
    cpu_set_t mask;
    CPU_ZERO(&mask);
    CPU_SET(id, &mask);
    if (sched_setaffinity(0,sizeof(mask),&mask) == -1)
    {
        printf("warning: could not set CPU affinity\n");
    }
}

int main(int argc, char const *argv[])
{
    double sinValue[valueSize], busyTime[valueSize];
    double percent;
    int idleTime[valueSize], count = 0;
    int k = 0;

    //set cpu id
    setCpu(0);

    //initial sin
    for (int i = 0; i < valueSize; ++i)
    {
        sinValue[i] = sin(i*PI/180) / 2.1 + 0.5;
        busyTime[i] = sliceTime * sinValue[i];
        idleTime[i] = (1 - sinValue[i]) * 1000000 * sliceTime;
    }
    //infinite loop
    for (int j = 0; ; j = (j + 1) % valueSize)
    {
        clock_t begin = clock();
        while ((double)(clock() - begin) / CLOCKS_PER_SEC <= busyTime[j]);
        usleep(idleTime[j]);
    }
    return 0;
}

效果图:
控制CPU使用率_第3张图片

你可能感兴趣的:(其他)