我使用的是Ubuntu 14.04版本,用的是自带的系统监视器来观察CPU使用率的变化。
1.首先来说说怎么控制CPU使用率,当程序执行一个死循环的时候,使用率就会变成100%,而当程序进入idle的时候,使用率就会很低(在别的程序不启动的情况下),那么控制CPU使用率就是调整它idle和busy的时间比例。
2.CPU使用率设为任意值(0 ~ 1之间)
代码如下
//#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <stdio.h>
#include <sched.h>
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%:
80%:
3.CPU使用率为正弦曲线
由于2中已经做到了把CPU使用率设为任意值,所以做成一个函数图像也比较简单,代码如下:
//#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <stdio.h>
#include <sched.h>
#include <math.h>
#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;
}
效果图:
本文主要介绍在Ubuntu 14.04系统中如何通过编程方式控制CPU的使用率。当程序处于死循环时,CPU使用率可能达到100%,而在空闲时则较低。通过调整程序的idle和busy状态的时间比例,可以控制CPU的使用率。作者给出了将CPU使用率设置为任意值(0到1之间)的代码示例,并展示了将CPU使用率模拟为正弦曲线的效果。
1211

被折叠的 条评论
为什么被折叠?



