/proc/*pid*/stat から読み取った情報はタイマ割り込みによって更新されますか?

/proc/*pid*/stat から読み取った情報はタイマ割り込みによって更新されますか?

に記録されているようにhttps://www.kernel.org/doc/Documentation/cpu-load.txt擬似ファイル/proc/statの情報は、タイマー割り込みによって更新されます。これは、/ proc / statがCPU使用率の実際のビューを提供しない可能性があることを意味します。

/proc/の情報も同じですか?PID/statもタイマ割り込みによって更新されますか?そうでない場合、その情報はいつ/どのように更新されますか?

答え1

kernel/sched/cputime.c読み込み時に値クエリを含む関数が含まれているため、Linuxカーネルからデータを読み取る必要があります。task_cputime_adjusted/proc/…/stat

具体的には、コメントはcputime_adjustあなたの文書が古い可能性があることを示しています。

スケジューラランタイム統計に基づいてティックベースのCPUTimeランダム精度を調整します

ティックベースのCPUタイムチャージは、タスクがタイマーによって中断されるかどうかに応じて、ランダムにスケジュールされた時間帯によって異なります。状況に応じて、これらの割り込みの数は、実際のユーザーとシステムのCPU時間をさまざまな精度で一致させるために楽観的にも十分に楽観的でもない場合があります。

この問題は、CFS スケジューラが貢献する合計実行時間に基づいてこれらのティックベースの値を調整することによって解決されます。

このコードは次の保証を提供します。

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

あなたが言うならばrtime_i+1 >= rtime_i

したがって、ここで何が起こるkernel/sched.cのかは、プロセスが何らかの理由で作成されるたびにプロセスが費やした時間が更新されますが(少なくともユーザースペースでは)統計がシステムサイクルごとに1回(またはそれ以下)に更新されることです。もちろん、これはマルチコアシステムではあいまいなので、複数のcputime_adjustコアが同時に同じデータを更新するのを防ぐためにスピンロックが必要です。

すなわち、部分更新は、プロセスがCPUコア制御を譲渡するたびに実行され、部分更新はシステムクロックサイクルごとに実行され、一定時間後にのみ実行され、譲歩の瞬間がシステムクロックサイクルに相対的であると仮定する。 /proc/… / statに示されている値が実際の値に収束するまで、相関関係が適用されます。

関連情報