何度も実行すると、「ユーザー」時間と「システム」時間が異なるのはなぜですか?

何度も実行すると、「ユーザー」時間と「システム」時間が異なるのはなぜですか?

良いものがあります質問と回答「実際」、「ユーザー」、「システム」の関係を説明します。

「実際」がどのように変化するかを説明し、「ユーザー」と「システム」をプロセスが実際にプロセッサで実行される時間として定義します。

今は「現実」を完全に無視しましょう。同じアプリケーションを複数回実行すると、「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がメモリからデータを取得するのを待つサイクル)を消費する可能性があります。

実際、ユーザー、およびシステムプロセス時間統計の違い

これらの1つは他のものとは異なります。 Realは実際の経過時間を表し、UserとSysは使用されたCPU時間を表します。コースを通してだけ。

  • 本物ウォールクロック時間は、通話の開始から終了までの時間です。これは、他のプロセスで使用されているタイムスライスや、プロセスがブロックされた時間(たとえば、I / Oが完了するのを待つ場合など)を含むすべての経過時間です。

  • ユーザー消費されたCPU時間。ユーザーモードでコード(カーネル外)以内にのコース。これは、プロセスの実行中に使用された実際のCPU時間です。他のプロセスとそのプロセスによってブロックされた時間は、この数値に含まれません。

  • システム消費されたCPU時間。カーネルからプロセス内で。これは、システムコールの実行に費やされたCPU時間を意味します。カーネルではユーザー空間でまだ実行されているライブラリコードとは反対です。 「ユーザー」と同様に、これはプロセスで使用されるCPU時間にすぎません。カーネルモード(「ハイパーバイザ」モードとも呼ばれる)とシステムコールメカニズムの簡単な説明については、以下を参照してください。

User+Sysプロセスが実際に使用したCPU時間を通知します。これはすべてのCPUに適用されるため、プロセスに複数のスレッドがある場合は、報告された壁時計がタイムアウトする可能性がありますReal。出力では、この数には、すべての子プロセス(およびその子プロセス)の時間UserSys時間だけでなく、またはwait(2)を通じて収集できる時間も含まれますwaitpid(2)。ただし、デフォルトのシステムコールはプロセスとそのプロセスの統計を返します。子供たちは別に。

源泉

おすすめ記事