2012年(10)
分类: LINUX
2012-10-28 16:55:44
这是<编程之美>里面的第一题,不过书里写的是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运行的轨迹吧:
可以看到CPU2所画的红线基本在50%处于水平状态。其他几个CPU的轨迹犬牙交错