我正在尝试计算每个进程的时钟周期总数(仅当它实际运行时)。我在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
对我来说没有意义。我的代码有问题吗?
答案 0 :(得分:1)
跟踪输出显示每个任务状态,因此如果您还打印prev->pid
以识别您正在谈论的任务,则可能更有意义。
编辑:好的,如果你担心得到“jif-start = 0”:请注意jiffies
仅在每个定时器中断时递增,我认为对于2.4.14内核几乎肯定是每10ms 。很可能(甚至可能)你的I / O绑定进程可能会被唤醒,然后很快阻塞I / O,导致在jiffy计数器增加之前进行另一次重新安排。
您可能能够从do_gettimeofday()
(在<linux/time.h>
中声明)获得更高分辨率的时间间隔,但实际的分辨率将从中获得取决于平台。