
素敵な質問と回答「real」、「user」、「sys」の関係を説明します。
ここでは、「real」が変化する理由を説明し、「user」と「sys」をプロセスがプロセッサ上で実際に実行に費やした時間として定義します。
ここで、「real」を完全に無視してみましょう。同じアプリケーションを複数回実行すると、「sys」と「user」が異なることに気付きました。
$time dummy_app
user 0m0.032s
sys 0m0.064s
$time dummy_app
user 0m0.020s
sys 0m0.084s
dummy_app は、0 から 100000 までをカウントする単なる for ループです。
同じバイナリの実行がプロセッサ上で異なる時間を費やす理由は何ですか? 言い換えると、同じアプリで「user」と「sys」が常に同じではないのはなぜですか?
答え1
同じバイナリを複数回実行すると実行時間が異なる理由
ここでの主な問題は、CPU の動作方法による非決定的な動作です。最新のスーパースカラー CPU は、一度に複数の命令を実行したり、実行するコマンドの順序を変更したりできます (アウトオブオーダー実行)。あなたの例に関して言えば、キャッシュの使用における最適化が適用される可能性もあります。RAM は CPU 自体よりも数桁遅いため、集中的なキャッシュが使用されます。バイナリの 2 回目の実行はキャッシュで実行される可能性があり、CPU サイクル (CPU がメモリからデータを取得するのを待機するサイクル) の消費が少なくなります。
実プロセス時間、ユーザープロセス時間、システムプロセス時間の統計の違いについて
これらは互いに異なります。Realは実際の経過時間を指し、UserとSysは使用されたCPU時間を指します。プロセスによってのみ。
本物ウォールクロック時間 - 呼び出しの開始から終了までの時間。これは、他のプロセスによって使用されるタイムスライスと、プロセスがブロックされている時間 (たとえば、I/O が完了するのを待機している場合) を含むすべての経過時間です。
ユーザー費やされたCPU時間の量ユーザーモードでコード(カーネル外)内でプロセス。これはプロセスの実行に使用された実際の CPU 時間のみです。他のプロセスやプロセスがブロックされている時間は、この数値にはカウントされません。
システム費やされたCPU時間の量カーネル内プロセス内では、システムコールで費やされるCPU時間の実行を意味しますカーネル内では、ライブラリ コードとは異なり、ライブラリ コードは引き続きユーザー空間で実行されます。'user' と同様に、これはプロセスによって使用される CPU 時間のみです。カーネル モード ('supervisor' モードとも呼ばれます) とシステム コール メカニズムの簡単な説明については、以下を参照してください。
User+Sys
は、プロセスが実際に使用した CPU 時間を示します。これはすべての CPU にわたるため、プロセスに複数のスレッドがある場合は、 によって報告されるウォールクロック時間を超える可能性があることに注意してReal
ください。出力では、これらの数値には、すべての子プロセス (およびその子孫) の と時間、およびそれらが収集された場合 ( または など) も含まれることに注意してください。User
ただしSys
、wait(2)
基礎waitpid(2)
となるシステム コールは、プロセスとその子の統計情報を別々に返します。