실시간이 사용자 시간보다 낮을 수 있는 이유

실시간이 사용자 시간보다 낮을 수 있는 이유

비디오 파일을 변환하는 스크립트가 있고 서버에서 테스트 데이터로 실행하고 시간을 time. 결과적으로 나는 다음을 보았다:

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

실시간 시간이 사용자 시간보다 훨씬 낮은 이유는 무엇입니까? 이것이 멀티스레딩과 관련이 있나요? 아니면 또 뭐야?

편집하다:그리고 내 생각엔 그 스크립트가 약 2분 48초 동안 실행되었던 것 같아요

답변1

실시간은 일반적으로 다른 두 가지보다 크기 때문에 표시되는 출력은 약간 이상합니다.

  • Real시간은 벽시계 시간입니다. (스톱워치로 측정할 수 있는 것)
  • User시간은 프로세스 내에서 사용자 모드에서 소비한 시간입니다.
  • Sys프로세스 내의 커널에서 소비되는 CPU 시간입니다.

따라서 작업이 여러 프로세서에 의해 동시에 수행되면 CPU 시간이 경과된 벽시계 시간보다 높을 것이라고 가정합니다.

동시/다중 스레드/병렬 유형의 애플리케이션이었습니까?

예를 들어, 이것은 명령을 실행할 때 Linux 시스템에서 얻는 것입니다 time find .. 예상한 대로 경과 real시간은 이 단일 사용자/단일 코어 프로세스의 다른 프로세스보다 훨씬 큽니다.

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

경험 법칙은 다음과 같습니다.

  • 실제 < 사용자: 프로세스는 CPU에 바인딩되어 있으며 여러 코어/CPU에서 병렬 실행을 활용합니다.
  • 실제 ≒ 사용자: 프로세스는 CPU에 바인딩되어 있으며 병렬 실행을 활용하지 않습니다.
  • 실제 > 사용자: 프로세스가 I/O 바인딩되어 있습니다. 다중 코어에서의 실행은 거의 또는 전혀 이점이 없습니다.

답변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

(시간은 두 개의 느린 코어가 있는 Intel Atom에 있습니다 :))

답변3

다중 스레드 프로그램일 필요는 없습니다. 여러 프로세스로 동일한 효과를 얻을 수 있습니다. 나는 사소한 숫자 처리를 수행하기 위해 C 프로그램을 작성했습니다.

$ time ./runner

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

그런 다음 프로세스의 복사본 두 개를 실행하는 스크립트를 작성했습니다.

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

$ time ./run_script

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

답변4

Levon이 말했듯이 :

나는 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를 하나의 프로세스로 제한하면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

관련 정보