• ベストアンサー

linuxのtimeコマンド

実行ファイルの経過時間を測定するためにtimeコマンドを使用し、 出力結果が以下のようになりました。 real 0m16.242s user 0m59.194s sys 0m6.264s 全体の経過時間であるrealの値より、ユーザーCPU時間のuserのほうが大きくなっており、 矛盾が生じているように思います。 原因が分かる方がおられましたら、教えていただけないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

そのプログラムはマルチスレッドのプログラムだったりしませんか? real というのは実行の前後でgettimeofdayなどで時刻を取得し、その差を表したもの。 userというのはユーザーモードで実行した時間の総和です。(言い換えると、スレッドごとのCPU使用時間の和です) 計測方法が違うだけです。 実際にコードを追っかけてみるとわかりやすいかもしれません。 まず、とっかかりはtimeコマンドでしょう。timeコマンドでこの手の情報を取っているのはresuse.cですが、time.cはこのresuse_beginを実際にコマンドを動かす前に実行し、resuse_endを終了時に呼び出しています。 http://git.savannah.gnu.org/cgit/time.git/tree/time.c#n600 http://git.savannah.gnu.org/cgit/time.git/tree/resuse.c resuse_endでは、先に述べたとおり、gettimeofdayでrealを用意した上で、wait3システムコールで子プロセスが使ったリソースを取得しています。 wait3システムコールの説明 http://linux.die.net/man/2/wait4 詳細はgetrusageに書いてあるとあるのでざっと目を通します。 http://linux.die.net/man/2/getrusage wait3システムコールはwait4システムコールの機能劣化版のようなものなので、wait4のコードをLinuxカーネルで追っかけます。 http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/kernel/exit.c#n1586 ここから呼ばれているdo_waitを見たらわかると思いますが、do_waitでは該当する子プロセスを見つけ出し、getrusageを呼び出して、リソース使用量を取っています。 getrusageは、thread_group_cputime_adjustedでスレッドグループのCPU使用量を取得します。 http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/kernel/sys.c 実際、thread_group_cputime_adjustedの中で呼ばれているthread_group_cputimeを見ると、各スレッドごとのCPU時間を足し合わせているのがわかると思います。 http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/kernel/sched/cputime.c というわけで、realは前後の単純な時刻の差、userやsysはスレッドごとのCPU時間の和ということをご理解いただけましたでしょうか?

ty1048
質問者

お礼

回答ありがとうございます。 コンパイル時に自動並列化のオプションをつけていました。 なんとなく、realとuserの違いは理解できたと思います。 いただいたURLの中身は正直あまり理解できませんでした・・・。 Savannah Git Hostingというのはlinuxのコマンドなどを統括している大元のシステムのようなものでしょうか? もしよろしければ、ご教示願います。

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

マルチコアで処理されたと言うことだと思います。 $ cat foo.c main(){ int i; for(i=1;i;i++); } $ make foo cc foo.c -o foo $ time ./foo real 0m12.901s user 0m12.890s sys 0m0.007s $ time bash -c "./foo | ./foo" real 0m13.102s user 0m26.141s sys 0m0.012s

ty1048
質問者

お礼

コンパイル時に自動並列化のオプションをつけていたので、 それが原因ということが分かりました。 回答ありがとうございました。

関連するQ&A