/proc/*pid*/stat 中读取的信息是否由定时器中断更新?

/proc/*pid*/stat 中读取的信息是否由定时器中断更新?

如记录在https://www.kernel.org/doc/Documentation/cpu-load.txt伪文件 /proc/stat 中的信息由计时器中断更新,这意味着 /proc/stat 可能无法提供 CPU 使用情况的真实视图。

/proc/中的信息是否也是如此?PID/stat 也由定时器中断更新?如果没有,其中的信息如何/何时更新?

答案1

您需要从 Linux 内核中读取数据,因为当您读取 时,它包含值为 query 的kernel/sched/cputime.c函数。task_cputime_adjusted/proc/…/stat

特别是评论cputime_adjust指出您的文档可能已过时。

根据调度程序运行时统计调整基于滴答的 cputime 随机精度

基于 Tick 的 cputime 计费取决于任务是否被计时器中断的随机调度时间片。根据这些情况,这些中断的数量可能过于乐观或不够乐观,以可变的精度匹配真实用户和系统 cputime。

通过根据 CFS 调度程序所占的总运行时间缩放这些基于刻度的值来解决此问题。

此代码提供以下保证:

stime + utime == rtime                    
stime_i+1 >= stime_i, utime_i+1 >= utime_i

假如说rtime_i+1 >= rtime_i

因此,这里发生的情况是,kernel/sched.c每当进程因任何原因产生时,都会更新进程所花费的时间(至少在用户空间中);但统计数据在每个系统周期更新一次(或更少)。这在多核系统中当然是不明确的,因此cputime_adjust必须有一个自旋锁以避免多个核心尝试同时更新相同的数据。

因此,简而言之:每当进程产生对 CPU 核心的控制权时,就会完成部分更新,每个系统时钟周期都会完成部分更新,只有在一段时间后,并假设屈服时刻相对于系统时钟周期的不相关性才会执行这些值/proc/…/stat 中显示的值收敛于实际值。

相关内容