Por qué el tiempo real puede ser menor que el tiempo del usuario

Por qué el tiempo real puede ser menor que el tiempo del usuario

Tengo un script que convierte archivos de video y lo ejecuto en el servidor con datos de prueba y mido su tiempo mediante time. En resultado vi:

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

¿Por qué el tiempo real es mucho menor que el tiempo del usuario? ¿Tiene esto alguna conexión con el subproceso múltiple? ¿O qué más?

Editar:Y creo que el script se ejecutó alrededor de 2m48s.

Respuesta1

El resultado que muestra es un poco extraño, ya que el tiempo real normalmente sería mayor que los otros dos.

  • Realel tiempo es el tiempo del reloj de pared. (lo que podríamos medir con un cronómetro)
  • UserEl tiempo es la cantidad de tiempo que se pasa en modo usuario dentro del proceso.
  • Syses el tiempo de CPU empleado en el kernel dentro del proceso.

Entonces, supongo que si el trabajo lo realizaran varios procesadores al mismo tiempo, el tiempo de la CPU sería mayor que el tiempo transcurrido del reloj de pared.

¿Era este un tipo de aplicación concurrente/multiproceso/paralela?

A modo de ejemplo, esto es lo que obtengo en mi sistema Linux cuando ejecuto el time find .comando. Como era de esperar, el tiempo transcurrido reales mucho mayor que el de los demás en este proceso de usuario único/núcleo único.

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

La regla general es:

  • real <usuario: el proceso está vinculado a la CPU y aprovecha la ejecución paralela en múltiples núcleos/CPU.
  • usuario real ≈: el proceso está vinculado a la CPU y no aprovecha la ejecución paralela.
  • real > usuario: El proceso está vinculado a E/S. La ejecución en múltiples núcleos tendría poca o ninguna ventaja.

Respuesta2

Solo para ilustrar lo que se ha dicho, con dos procesos de subprocesos haciendo algunos cálculos.

/*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 */

compilar

gcc a.c -lpthread

(Esto es sólo para ilustrar, en la vida real debería haber agregado el indicador -D_REENTRANT)

$ time ./a.out

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

(Los tiempos están en un Intel Atom que tiene dos núcleos lentos :))

Respuesta3

No es necesario que sean programas de subprocesos múltiples; Puede obtener el mismo efecto con múltiples procesos. Escribí un programa en C para hacer algunos cálculos numéricos triviales:

$ time ./runner

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

Luego escribí un script para ejecutar dos copias del proceso:

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

$ time ./run_script

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

Respuesta4

Como dijo Levón:

Tengo un i7 (8 procesadores), así que si lo ejecuto en bash:

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

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

Entonces, si restringimos bash a un proceso contaskset -cp 0 $BASHPID

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

ahora el resultado es

$ 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

información relacionada