外部コマンド「time」と予約語「time」とはどういう意味ですか?

外部コマンド「time」と予約語「time」とはどういう意味ですか?

Bashリファレンスマニュアルによると

timeシェルの組み込み、シェル機能、パイプのタイミングを許可するには、予約語として使用してください。外部コマンドtimeでは簡単に時間を測定できません。

  1. 外部コマンドで時間を測定できるのは何ですかtime

    ただ単純な外部コマンドですか?他の人はいませんか?

    他の仕事のタイミングを合わせることを防ぐルールは何ですか?このルールはシェルに属していますか、それとも外部コマンドの実行に属していますかtime

    しかし、私はUbuntuを実行しているので、timeDebianで実行しています。

  2. Bashの予約語は、time実行できるすべてのものの時間を測定できますか?そうでなければいつできませんか?

  3. time外部で時間を測定できますが、予約語timeでは時間を測定できないものは何ですか?

答え1

私の答えはLinuxについてです。

  1. 他の仕事のタイミングを合わせることを防ぐルールは何ですか?

私の考えではそうだと思います。時間情報wait4実際には、この値を取得するためにシステムコールを使用するため、プロセスに対してのみ機能します。時間情報。最初のパラメータwait4はプロセスのpidです。だから/usr/bin/timeいつも電話execveして待ってください。

ちなみに:

execve() はファイル名を指すプログラムを実行します。ファイル名はバイナリ実行可能ファイルまたは#!interpreter [オプションの引数]形式の行で始まるスクリプトでなければなりません。

したがって、/usr/bin/timeには実行可能なものが必要です。execve

  1. Bashの予約語時間を実行可能なすべての時間を測定するために使用できますか?

そうだと思います。これは 2 つの呼び出しセットで実装されます。

10:06:03 getrusage(RUSAGE_SELF, {ru_utime={0, 152976}, ru_stime={0, 465929}, ru_maxrss=4052, ru_ixrss=0, ru_idrss=0, ru_isrss=0, ru_minflt=6214, ru_majflt=1, ru_nswap=0, ru_inblock=368, ru_oublock=0, ru_msgsnd=0, ru_msgrcv=0, ru_nsignals=0, ru_nvcsw=6349, ru_nivcsw=12}) = 0
10:06:03 getrusage(RUSAGE_CHILDREN, {ru_utime={2, 259656}, ru_stime={1, 888712}, ru_maxrss=21176, ru_ixrss=0, ru_idrss=0, ru_isrss=0, ru_minflt=64297, ru_majflt=4, ru_nswap=0, ru_inblock=272, ru_oublock=368, ru_msgsnd=0, ru_msgrcv=0, ru_nsignals=0, ru_nvcsw=56077, ru_nivcsw=386}) = 0

コマンドまたは組み込みコマンドの実行

10:06:04 getrusage(RUSAGE_SELF, {ru_utime={0, 152976}, ru_stime={0, 476927}, ru_maxrss=4052, ru_ixrss=0, ru_idrss=0, ru_isrss=0, ru_minflt=6243, ru_majflt=1, ru_nswap=0, ru_inblock=368, ru_oublock=0, ru_msgsnd=0, ru_msgrcv=0, ru_nsignals=0, ru_nvcsw=6399, ru_nivcsw=13}) = 0
10:06:04 getrusage(RUSAGE_CHILDREN, {ru_utime={2, 271654}, ru_stime={1, 903710}, ru_maxrss=21176, ru_ixrss=0, ru_idrss=0, ru_isrss=0, ru_minflt=64514, ru_majflt=4, ru_nswap=0, ru_inblock=272, ru_oublock=368, ru_msgsnd=0, ru_msgrcv=0, ru_nsignals=0, ru_nvcsw=56079, ru_nivcsw=406}) = 0

bashだから違いを計算して印刷したいと思います。これにより、独自の組み込みやサブプロセスなど、すべてを測定できます。

  1. 外部時間で測定できますが、予約語時間では測定できないものは何ですか?

実際、それらはすべてシステムコールであり、getrusageカーネルwait4から取得されます。構造の使い方。ただし、bash timeこの構造では、限られた数のフィールドが印刷されます。ソースman 1 time:

注:一部のシェル(例:bash(1))には、ここで説明されているものよりも少ない機能を提供する組み込み時間コマンドがあります。

$/usr/bin/time -v  seq 10000
    Command being timed: "seq 10000"
    User time (seconds): 0.01
    System time (seconds): 0.01
    Percent of CPU this job got: 24%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.12
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 2640
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 199
    Voluntary context switches: 8
    Involuntary context switches: 24
    Swaps: 0
    File system inputs: 0
    File system outputs: 8
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

関連情報