Por que o tempo real pode ser menor que o tempo do usuário?

26

Eu tenho um script convertendo arquivos de vídeo e o executo no servidor em dados de teste e meço seu tempo em time . Em resultado, vi:

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

Por que o tempo real é muito menor do que o tempo do usuário? Isso tem alguma conexão com multithreading? Ou o que mais?

Editar: E acho que esse script estava sendo executado por volta de 2m48s

    
por kobylecki 13.06.2012 / 17:49

2 respostas

35

A saída que você mostra é um pouco estranha, já que o tempo real normalmente seria maior do que os outros dois.

  • Real tempo é a hora do relógio de parede. (o que poderíamos medir com um cronômetro)
  • User time é a quantidade de tempo gasto no modo de usuário dentro do processo
  • Sys é o tempo gasto da CPU no kernel dentro do processo.

Então eu suponho que se o trabalho fosse feito por vários processadores simultaneamente, o tempo de CPU seria maior que o tempo decorrido do relógio de parede.

Este era um tipo de aplicativo simultâneo / multithread / paralelo?

Apenas como exemplo, é isso que recebo no meu sistema Linux quando emito o comando time find . . Como esperado, o tempo real decorrido é muito maior do que os outros neste processo de usuário único / núcleo único.

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

A regra geral é:

  • real < user: O processo é vinculado à CPU e aproveita a execução paralela em vários núcleos / CPUs.
  • real ≈ usuário: o processo é vinculado à CPU e não aproveita as vantagens da execução paralela.
  • real > usuário: o processo é vinculado a E / S. Execução em múltiplos núcleos seria de pouca ou nenhuma vantagem.
por 13.06.2012 / 17:56
13

Apenas para ilustrar o que foi dito, com dois processos segmentados fazendo alguns 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

(Isto é apenas para ilustrar, na vida real eu deveria ter adicionado o sinalizador -D_REENTRANT)

$ time ./a.out

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

(Os horários estão em um Intel Atom que possui dois núcleos lentos :))

    
por 07.10.2013 / 14:38

Tags