1. ホーム
  2. unix

[解決済み] time(1) の出力における 'real', 'user' および 'sys' はどのような意味ですか?

2022-03-15 14:09:50

質問

$ time foo
real        0m0.003s
user        0m0.000s
sys         0m0.004s
$

何をするのか real , usersys は、時間の出力における意味ですか?

アプリのベンチマークを行う場合、どれに意味があるのでしょうか?

どのように解決するのですか?

実時間、ユーザ時間、シス時間統計

どちらか一方が好きというわけではありません。 Realは実際の経過時間、UserとSysは使用したCPU時間 プロセスによってのみ行われます。

  • リアル は壁時計時間、つまり呼び出しの開始から終了までの時間です。 これは、他のプロセスが使用するタイムスライスや、プロセスがブロックされている時間(I/Oの完了を待っている場合など)を含む、すべての経過時間です。

  • ユーザー は、ユーザーモードのコード(カーネル外)に費やされたCPU時間の量です プロセス。 これは、プロセスの実行に使用された実際のCPU時間のみです。 他のプロセスやプロセスがブロックされている時間は、この数字にカウントされません。

  • シス は、プロセス内のカーネルに費やされたCPU時間の量です。 これは、システムコールに費やされたCPU時間を実行することを意味します カーネル内で ライブラリコードとは対照的に、ユーザ空間で実行されたままです。 ユーザー」と同様、これはプロセスによって使用されるCPU時間のみです。 カーネルモード(「スーパーバイザ」モードとも呼ばれる)とシステムコールの仕組みについては、以下を参照してください。

User+Sys は、そのプロセスが実際に使用したCPU時間を教えてくれます。 これはすべての CPU にわたっているので、 プロセスに複数のスレッドがある場合 (そしてこのプロセスが複数のプロセッサを持つコンピュータで 実行されている場合) は Real (通常発生する)。 なお、出力では、これらの数値には UserSys によって収集された可能性がある場合、すべての子プロセス (およびその子孫) の時間だけでなく、たとえば wait(2) または waitpid(2) しかし、基本的なシステムコールは、プロセスとその子プロセスの統計を別々に返します。

が報告する統計の起源は、以下のとおりです。 time (1)

が報告する統計は time は、さまざまなシステムコールから収集されます。 User'と'Sys'は wait (2) ( POSIX ) または times (2) ( POSIX )、特定のシステムに依存する。 'Real'は、開始時刻と終了時刻を gettimeofday (2) の呼び出しがあります。 システムのバージョンによっては、コンテキストスイッチの回数など、他の様々な統計も time .

マルチプロセッサマシンでは、マルチスレッドプロセスや子プロセスを分岐させた場合、異なるスレッドやプロセスが並行して実行されるため、経過時間が総CPU時間より短くなる可能性があります。 また、報告された時間の統計は異なるソースから取得されているため、元の投稿者が示した例のように、非常に短い実行タスクで記録された時間は丸め誤差の対象となる可能性があります。

カーネルモードとユーザーモードについての簡単な入門書

Unixやその他の保護メモリOSの場合。 カーネル」または「スーパーバイザー モードとは 特権モード CPUが動作可能な状態であること。 セキュリティや安定性に影響を与える可能性のある特権的な操作は、CPUがこのモードで動作しているときのみ可能で、アプリケーションコードからは利用できません。 このような動作は、アプリケーションコードからは利用できません。 MMU 他のプロセスのアドレス空間にアクセスできるようになります。 通常は ユーザーモード を要求することはできますが、(正当な理由があって)これを行うことはできません。 共有メモリ は、カーネルから できる 複数のプロセスで読み書きができる。 この場合、共有メモリは安全なメカニズムを通じてカーネルから明示的に要求され、それを使用するためには両方のプロセスが明示的にアタッチする必要があります。

特権モードは、このモードで動作するCPUによってカーネルが実行されるため、通常「カーネル」モードと呼ばれます。 カーネルモードに切り替えるには、特定の命令(しばしば トラップ CPUをカーネルモードで動作させるように切り替える ジャンプテーブルに保持された特定の位置からコードを実行します。 セキュリティ上の理由から、カーネルモードに切り替えて任意のコードを実行することはできません。トラップは、CPUがスーパーバイザーモードで動作していない限り書き込めないアドレスのテーブルで管理されています。 CPUがスーパーバイザーモードで動作していない限り、書き込むことができません。明示的なトラップ番号でトラップすると、そのアドレスがジャンプテーブルで検索されます。カーネルには、制御されるエントリポイントの数が限られています。

C ライブラリの「システム」コール(特にマニュアルページのセクション 2 で説明されているもの)には、ユーザーモードのコンポーネントがあり、C プログラムから実際に呼び出されるものです。 裏側では、I/O などの特定のサービスを行うためにカーネルに 1 つ以上のシステムコールを発行しているかもしれませんが、それでもユーザモードで動作しているコードもあります。 また、必要に応じてユーザー空間のコードから直接カーネルモードへのトラップを発行することも可能ですが、呼び出しのためにレジスタを正しく設定するためのアセンブリ言語の断片を記述する必要があるかもしれません。

sys'の詳細

ユーザーモードからはできないこと、たとえばメモリの割り当てやハードウェア(HDD、ネットワークなど)へのアクセスなどがあります。これらはカーネルの監督下にあり、カーネルだけが行うことができます。以下のような操作もあります。 malloc または fread / fwrite がこれらのカーネル関数を呼び出すと、'sys' の時間としてカウントされます。残念ながら、quot;mallocへのすべての呼び出しが'sys'時間にカウントされる、というような単純なものではありません。への呼び出しは malloc はそれ自身で何らかの処理を行い (やはり 'user' 時間でカウントされます)、 その後どこかでカーネル内の関数を呼び出すかもしれません ('sys' 時間でカウントされます)。カーネル呼び出しから戻った後、さらに 'user' の時間があり、それから malloc はあなたのコードに戻ります。いつ切り替わるのか、どれだけの時間をカーネルモードで過ごすのか・・・については、何とも言えません。それはライブラリの実装に依存します。また、他の一見何の変哲もない関数でも malloc などがバックグラウンドで動作しており、その時にまた 'sys' に時間がかかることになります。