実時間がユーザー時間よりも短くなる理由

実時間がユーザー時間よりも短くなる理由

ビデオ ファイルを変換するスクリプトがあり、それをテスト データでサーバー上で実行し、その時間を測定しますtime。結果は次のようになりました。

real    2m48.326s
user    6m57.498s
sys     0m3.120s

なぜ実時間はユーザー時間よりもずっと短いのでしょうか? これはマルチスレッドと関係があるのでしょうか? それとも他に何かあるのでしょうか?

編集:そして、そのスクリプトは2分48秒くらいで実行されていたと思います

答え1

リアルタイムは通常他の 2 つよりも大きいため、表示される出力は少し奇妙です。

  • Real時間は壁時計の時間です。(ストップウォッチで計測できる時間)
  • User時間はプロセス内でユーザーモードで費やされた時間の量です
  • Sysプロセス内のカーネルで費やされた CPU 時間です。

したがって、作業が複数のプロセッサによって同時に実行された場合、CPU 時間は経過したウォールクロック時間よりも長くなると考えられます。

これは同時実行/マルチスレッド/並列タイプのアプリケーションでしたか?

一例として、これは Linux システムでコマンドを発行したときに得られる結果ですtime find .。予想どおり、経過real時間は、この単一ユーザー/単一コア プロセスでは他のものよりもはるかに長くなっています。

real    0m5.231s
user    0m0.072s
sys     0m0.088s

経験則は次のとおりです。

  • real < user: プロセスは CPU にバインドされており、複数のコア/CPU での並列実行を活用します。
  • 実数 ≈ ユーザー: プロセスは CPU にバインドされており、並列実行の利点を活用しません。
  • real > user: プロセスは I/O バウンドです。複数のコアで実行してもほとんど利点はありません。

答え2

これまで述べてきたことを説明すると、2 つのスレッド プロセスが何らかの計算を実行します。

/*a.c/*
    #include <pthread.h>
    static void  * dosomething () {
        unsigned long a,b=1;
        for (a=1000000000; a>0; a--) b*=3;
        return NULL;
    }
    main () {
        pthread_t one, two;
        pthread_create(&one,NULL, dosomething, NULL);
        pthread_create(&two,NULL, dosomething, NULL);
        pthread_join (one, NULL);
        pthread_join (two, NULL);
    }
/* end of a.c */

コンパイル

gcc a.c -lpthread

(これは単なる説明であり、実際には -D_REENTRANT フラグを追加する必要があります)

$ time ./a.out

real    0m7.415s
user    0m13.105s
sys     0m0.032s

(時間は 2 つの低速コアを持つ Intel Atom 上でのものです :) )

答え3

マルチスレッド プログラムである必要はありません。複数のプロセスで同じ効果を得ることができます。私は簡単な数値計算を行う C プログラムを書きました。

$ time ./runner

real    1m12.746s
user    1m12.493s
sys     0m0.015s

次に、プロセスのコピーを 2 つ実行するスクリプトを作成しました。

$ cat run_script
#!/bin/sh
./runner &
./runner &
wait

$ time ./run_script

real    1m31.231s
user    3m0.538s
sys     0m0.215s

答え4

レヴォンはこう言った。

私はi7(8プロセッサ)を持っているので、次のように実行しますbash

$ time for ((i=0;i<1000000;i++)); do echo $i; done | wc -l
1000000

real    0m4,878s
user    0m4,368s
sys     0m3,083s

次に、bashを1つのプロセッサに制限すると、taskset -cp 0 $BASHPID

$ taskset -cp 0 $BASHPID                                                                                         
pid 30551's current affinity list: 0-7
pid 30551's new affinity list: 0

結果は

$ time for ((i=0;i<1000000;i++)); do echo $i; done | wc -l
1000000

real    0m7,120s
user    0m4,282s
sys     0m2,824s

https://www.looklinux.com/how-to-run-process-or-program-on-specific-cpu-cores-in-linux/

http://man7.org/linux/man-pages/man1/time.1.html

関連情報