Por que o tempo de 'usuário' e 'sys' varia em múltiplas execuções?

Por que o tempo de 'usuário' e 'sys' varia em múltiplas execuções?

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+Sysinformará 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 Usere Sysde 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.

Fonte

informação relacionada