リアルタイム時間がユーザー時間より低い理由

リアルタイム時間がユーザー時間より低い理由

ビデオファイルを変換するスクリプトがあり、テストデータに基づいてサーバー上で実行して時間を測定します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

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

  • 実際の<ユーザー:プロセスはCPUにバインドされており、複数のコア/ CPUで並列実行を利用します。
  • 実際の≒ユーザー:プロセスはCPUに縛られ、並列実行を利用しません。
  • 物理>ユーザー:プロセスは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

関連情報