ubuntu 上让CPU占用率画曲线(一)

5657阅读 0评论2012-10-28 gallexy
分类:LINUX

这是<编程之美>里面的第一题,不过书里写的是windows下的算法,我们看看linux上怎么实现。

先来画一条直线,在idle 50%:

#define _GNU_SOURCE
#define __USE_GNU
#include
#include
#include
#include
#include

///由t于linux上没有GetTickCount()函数,我们需要自己实现一下

unsigned long GetTickCount()
{
  struct timespec ts;
  clock_gettime(CLOCK_MONOTONIC,&ts);
  return (ts.tv_sec*1000 + ts.tv_nsec/(1000*1000));
  struct timeval tv;
  if(gettimeofday(&tv,NULL) != 0)
  {
     printf("gettimeofday error\n");
     exit(0);
  }
  //printf("gettime %d + %d \n",tv.tv_sec*1000,tv.tv_usec/1000);
  return (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
}

int main()
{
  int i=0;
  cpu_set_t mask;
  CPU_ZERO(&mask);
  CPU_SET(1, &mask);  //我的机器上CPU有4个core,所以这里取第二个cpu来画
  pid_t mypid=getpid();
  printf("mypid=%d",mypid);
  sched_setaffinity(mypid,sizeof(mask),&mask);   //把本进程绑定在前面定义的CPUset上
  unsigned long busytime=10; 
  unsigned long idletime=busytime;  //定义繁忙和空闲时间片相同,都是10ms
  unsigned long starttime=0;
  while(1)
  {
    starttime=GetTickCount();
    while ((GetTickCount() - starttime) <= busytime);
    //{printf("delta=%d",GetTickCount()-starttime); }
    usleep(10000);  

//usleep单位是1微妙,所以这里需要睡10000微妙,跟爱你一万年的一万数字相同,

//其实一万年也就是弹指一挥间,所以同志们,只争朝夕啊。
  }
  return 0;

}

编译的时候需要注意,clock_gettime()所在的库 librt比较变态,-lrt需要写在编译行的末尾,

就是下面这个样子:

gcc –o perf perf.c –lrt

编译成功

好了,运行一下,欣赏一下CPU运行的轨迹吧:

 

cpudraw

可以看到CPU2所画的红线基本在50%处于水平状态。其他几个CPU的轨迹犬牙交错

上一篇:体验开机之旅
下一篇:在虚拟机上部署openstack