Chinaunix首页 | 论坛 | 博客
  • 博客访问: 63564
  • 博文数量: 10
  • 博客积分: 300
  • 博客等级: 二等列兵
  • 技术积分: 160
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-12 21:57
文章分类
文章存档

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运行的轨迹吧:

 

cpudraw

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

阅读(5580) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~