计算Linux 2.4.14中的时钟周期

时间:2010-01-15 16:23:56

标签: linux linux-kernel kernel

我正在尝试计算每个进程的时钟周期总数(仅当它实际运行时)。我在schedule()(文件sched.h)中插入了以下代码:

...
switch_tasks:
    prefetch(next);
    clear_tsk_need_resched(prev);
    if (likely(prev != next)) {
        rq->nr_switches++;
        rq->curr = next;

        /* My code start here*/
        if (next->start_count==1)
            next->start_run=jiffies;
        if (prev->start_count==1)
        {
            prev->total_running += (jiffies-prev->start_run);
            printk("total running = %lu, jif-start = %lu\n", \
            prev->total_running, jiffies-prev->start_run);
        }
...

我添加了printk因为我得到了奇怪的结果。以下是一些输出:

  

总跑步= 1522,jif-start = 1
  总跑= 1522,jif-start = 0
  总跑= 1523,jif-start = 1
  总跑= 1,jif-start = 1
  总跑= 0,jif-start = 0
  总跑= 0,jif-start = 0
  总跑= 0,jif-start = 0
  总跑= 0,jif-start = 0

对我来说没有意义。我的代码有问题吗?

1 个答案:

答案 0 :(得分:1)

跟踪输出显示每个任务状态,因此如果您还打印prev->pid以识别您正在谈论的任务,则可能更有意义。

编辑:好的,如果你担心得到“jif-start = 0”:请注意jiffies仅在每个定时器中断时递增,我认为对于2.4.14内核几乎肯定是每10ms 。很可能(甚至可能)你的I / O绑定进程可能会被唤醒,然后很快阻塞I / O,导致在jiffy计数器增加之前进行另一次重新安排。

可能能够从do_gettimeofday()(在<linux/time.h>中声明)获得更高分辨率的时间间隔,但实际的分辨率将从中获得取决于平台。