Há um bompergunta e respostaexplicando as relações entre 'real', 'usuário' e 'sys'.
Ele explica as razões pelas quais 'real' pode variar e define o 'usuário' e o 'sistema' como os tempos que o processo realmente gastou em execução no processador.
Vamos agora ignorar completamente o “real”. Percebi que ao executar o mesmo aplicativo várias vezes, ele fornece 'sys' e 'user' diferentes.
$time dummy_app
user 0m0.032s
sys 0m0.064s
$time dummy_app
user 0m0.020s
sys 0m0.084s
O dummy_app é apenas um loop for que conta de 0 a 100.000.
Qual a razão pela qual a execução do mesmo binário gastaria tempos diferentes no processador? Em outras palavras, por que 'usuário' e 'sys' não são sempre iguais para o mesmo aplicativo?
Responder1
Por que os tempos de execução do mesmo binário diferem em múltiplas execuções
O principal problema aqui é o comportamento não determinístico devido à forma como a CPU funciona. CPUs superescalares modernas podem executar múltiplas instruções ao mesmo tempo ou alterar a ordem dos comandos a serem executados (execução fora de ordem). Em relação ao seu exemplo, também é possível que a otimização no uso do cache se aplique. A RAM é várias magnitudes mais lenta que a própria CPU, é por isso que o cache intensivo é usado. A segunda execução do seu binário pode ser executada no cache, consumindo menos ciclos de CPU (ciclos que a CPU teria esperado que os dados fossem recuperados da memória).
Sobre a diferença entre estatísticas de tempo de processo real, de usuário e de sistema
Uma dessas coisas não é igual as outras. Real refere-se ao tempo real decorrido; User e Sys referem-se ao tempo de CPU usadoapenas pelo processo.
Realé a hora do relógio de parede - hora do início ao fim da chamada. Todo esse tempo é decorrido, incluindo intervalos de tempo usados por outros processos e o tempo que o processo passa bloqueado (por exemplo, se estiver aguardando a conclusão da E/S).
Do utilizadoré a quantidade de tempo de CPU gastono modo de usuáriocódigo (fora do kernel)dentro deo processo. Este é apenas o tempo real da CPU usado na execução do processo. Outros processos e o tempo que o processo passa bloqueado não contam para este valor.
Sistemaé a quantidade de tempo de CPU gastono núcleodentro do processo. Isso significa executar o tempo de CPU gasto em chamadas do sistemadentro do kernel,em oposição ao código da biblioteca, que ainda está em execução no espaço do usuário. Assim como 'usuário', este é apenas o tempo de CPU usado pelo processo. Veja abaixo uma breve descrição do modo kernel (também conhecido como modo 'supervisor') e do mecanismo de chamada do sistema.
User+Sys
informará quanto tempo real de CPU seu processo usou. Observe que isso ocorre em todas as CPUs, portanto, se o processo tiver vários threads, ele poderá exceder o tempo do relógio relatado por Real
. Observe que na saída esses números incluem o tempo User
e Sys
de todos os processos filhos (e seus descendentes), bem como quando eles poderiam ter sido coletados, por exemplo, por wait(2)
ou waitpid(2)
, embora as chamadas do sistema subjacente retornem as estatísticas do processo e de seus filhos separadamente.