/proc/pid/stat里的进程用户态,内核态时间可能漏算..

/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
}

你可能感兴趣的:(user,div)