/proc/pid/stat里的字段,可以显示进程的用户态&内核态执行时间。
具体的实现分别是task_utime和task_stime
两者都用到cputime_to_clock_t将内核ticks转换为用户态ticks, 以及
nsec_to_clock_t将内核纳秒转换为用户态ticks
下面假设如下场景:
当HZ = 250, USER_HZ=100的时候
TICK_NSEC = 4*10^6
NSEC_PER_SEC = 10^9
则
jiffies_to_clock_t(x) = (x*4)/10
同理nsec_to_clock_t(x) = x/10^7
如果x的增长幅度小于5个tick,则会丢失tick;
如果x的增长幅度小于10^7纳秒即10ms,会丢失运行时间
因此,用task_utime和task_stime来判断进程是否得到调度是不恰当的
附jiffies_to_clock_t以及nsec_to_clock_t的代码实现:
clock_t jiffies_to_clock_t(long x)
{
#if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0
return x / (HZ / USER_HZ);
#else
u64 tmp = (u64)x * TICK_NSEC;
do_div(tmp, (NSEC_PER_SEC / USER_HZ));
return (long)tmp;
#endif
}