您的位置:首页 > 运维架构 > Linux

linux CPU 画正弦曲线 编程之美

2014-02-22 12:02 260 查看
捣鼓了一下,画成了这个熊样子,算是蒙混过关了吧。



思想:大致原理是参考编程之美这本书上的,cpu的使用率是一段时间内cpu繁忙的平均值,所以可以通过一段时间内cpu繁忙的时间和空间的时间来控制cpu的使用率。

            linux下面用gettimeofday函数获得系统精确时间,如果系统支持,可以精确到us。

            interval是取样间隔,算出第i个间隔里面对应cpu繁忙(busy)的时间和空闲(idle)的时间,也就是:

                    busy[i] = cpu应该的使用率 * interval,

                    idle[i] = interval - busy[i] 。

            

          因为我的cpu是多核的,需要用shed_setaffinity();函数绑定到第一个cpu,上面也是该cpu上的曲线。

代码如下:

N是采样的个数,即interval的个数。

T 是周期,毫秒表示,10s画一个正弦曲线。

#include <stdlib.h>
#include <math.h>
#include <sys/time.h>
#include <stdbool.h>
#include <unistd.h>
#include <stdio.h>
#include <sched.h>

#define  N  50
#define PI 3.1415926

int main(int argc, char * argv[])
{
    //绑定cpu0
    unsigned long  mask = 1;
sched_setaffinity(0, sizeof(mask), &mask);

int T = 10000;   // 10s
int i;
double busy
, idle
;
double interval = (double)T / N ; //ms

    //算出每个interval的空闲时间和繁忙时间
for(i = 0; i < N; i ++)
{
busy[i] = ((sin(2 * PI * i / N)/2 + 0.5) * 50 + 25 )/100 * interval;
idle[i] =  interval - busy[i];
printf("%d %.2lf %.2lf\n", i, busy[i], idle[i]);
}

int j = 0;
struct timeval  start_timeval;
struct timeval  cur_timeval;

while (true)
{
gettimeofday(&start_timeval, NULL);
double last_ms = (double)start_timeval.tv_sec * 1000 + start_timeval.tv_usec/1000 ;
while (true)
{
gettimeofday(&cur_timeval, NULL);
double cur_ms = (double)cur_timeval.tv_sec * 1000 + cur_timeval.tv_usec/1000 ;
if (cur_ms - last_ms >= busy[j])
break;
}

usleep(idle[j] * 1000);
j = (j + 1) % N;
}

exit(1);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息