网络上流传一个面试题,说如何编程让CPU的使用率按照正弦方式变化

代码如下(运行环境Linux):

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <time.h>

int main(int argc,char* argv[])

{

struct timeval tv;

long long start_time,end_time;

long long busy_time[100];

long long idle_time[100];

int i;

for(i = 0; i < 100; i++)

{

busy_time[i] = 100000 * 0.5 * (sin(i*0.0628) + 1);

idle_time[i] = 100000 - busy_time[i];

}

i = 0;

while(1)

{

gettimeofday(&tv,NULL);

start_time = tv.tv_sec*1000000 + tv.tv_usec;

end_time = start_time;

while((end_time - start_time) < busy_time[i])

{

gettimeofday(&tv,NULL);

end_time = tv.tv_sec*1000000 + tv.tv_usec;

}

usleep(idle_time[i]);

i = (i+1)%100;

}

return 0;

}

编译时候需要加上 –lm 选项,比如gcc main.c –o main –lm

具体原理是:选定一个时间段,比如我们10s内要画出一个正弦函数的完整曲线。

将10s等分100分,每份100ms。在这个每份的100ms内,CPU运行一定ms,空闲一定ms,这个比例按照正弦变化,最后CPU的使用率就是正弦。原因是:比如在某个时间点的100ms(100000us)内,空闲了50ms,运行了50ms,那么此时资源管理器上的显示CPU使用率应该为50%。

05-20 14:06