O que especificamente são a hora do relógio de parede, a hora da CPU do usuário e a hora da CPU do sistema no UNIX?

144

Posso adivinhar com base nos nomes, mas o que são especificamente o relógio de parede, o usuário-cpu-time e o sistema-cpu-time no UNIX?

O tempo da CPU do usuário é o tempo gasto na execução do código do usuário, enquanto o tempo da CPU do kernel é a quantidade de tempo gasto no kernel devido à necessidade de operações privilegiadas (como E / S no disco)?

Em que unidade de tempo é essa medida.

E o tempo do relógio de parede é realmente o número de segundos que o processo gastou na CPU ou o nome é apenas enganoso?

John Humphreys - w00te
fonte
Possível duplicata de O que significam 'real', 'usuário' e 'sys' na saída do tempo (1)?
Ciro Santilli escreveu:

Respostas:

142

A hora do relógio de parede é a hora que um relógio na parede (ou um cronômetro na mão) mediria como decorrido entre o início do processo e o 'agora'.

O tempo da CPU do usuário e da CPU do sistema são praticamente como você disse - a quantidade de tempo gasto no código do usuário e a quantidade de tempo gasto no código do kernel.

As unidades são segundos (e subsegundos, que podem ser microssegundos ou nanossegundos).

O tempo do relógio de parede não é o número de segundos que o processo gastou na CPU; é o tempo decorrido, incluindo o tempo gasto aguardando sua vez na CPU (enquanto outros processos são executados).

Jonathan Leffler
fonte
16
Então, isso significa que o tempo do relógio de parede sempre será maior que o tempo da CPU?
Pacerier
35
@Pacerier: sim, em uma máquina com um único núcleo, mas as máquinas com vários núcleos e os programas com vários threads podem usar mais de 1 CPU por segundo por segundo decorrido.
Jonathan Leffler
@ JonathanLeffler obrigado pela resposta, eu queria obter o número de nanossegundos decorridos, mas calcular o tempo da CPU usando a fórmula CPUtime = #clock_cycles / clock_ratenão pode ser o mesmo que calcular o tempo decorrido. Você sabe se posso obter o tempo decorrido do tempo da CPU?
Bionix1441
2
@ Bionix1441: Você não pode derivar o tempo decorrido do tempo da CPU por vários motivos. Primeiro, um processo pode ficar ocioso, sem consumir tempo de CPU, por períodos arbitrários (por exemplo, um processo daemon aguardando que um cliente se conecte a ele pela rede), portanto, pode não fazer nada por dias seguidos. . Segundo, se estiver em execução, poderá ter vários threads e, se houver, por exemplo, 4 threads e houver 4 ou mais núcleos no sistema, poderá acumular 4 segundos de CPU de esforço gasto por segundo de tempo decorrido. Isso mostra que não existe uma fórmula simples (ou mesmo complexa) que você possa usar.
Jonathan Leffler
1
@ Catbuilts: Você está ciente de que o kernel do Unix é executado separadamente dos programas do usuário. Quando o seu programa faz uma chamada do sistema (por exemplo, read()ou getpid()), o kernel executa o código em nome do seu programa. O kernel também lida com multitarefas preventivas para que outros programas executem sua vez, e realiza algumas tarefas gerais de manutenção para manter o sistema funcionando sem problemas. Este código é executado no 'código do kernel' (também no 'modo kernel'). Isso é diferente do código que você escreveu e das bibliotecas do usuário (incluindo a biblioteca C do sistema) que você executa.
Jonathan Leffler 13/10
36

Hora do relógio de parede: o tempo decorrido de acordo com o relógio interno do computador, que deve corresponder à hora no mundo exterior. Isso não tem nada a ver com o uso da CPU; é dado para referência.

Tempo de CPU do usuário e tempo do sistema: exatamente o que você pensa. As chamadas do sistema, que incluem I / O chamadas como read, write, etc. são executadas por saltar para o código do kernel e executar isso.

Se o tempo do relógio de parede <tempo da CPU, você está executando um programa em paralelo. Se o tempo do relógio na parede> tempo da CPU, você está aguardando disco, rede ou outros dispositivos.

Todos são medidos em segundos, de acordo com o SI .

Fred Foo
fonte
7

A hora do relógio de parede é exatamente o que diz: o tempo decorrido, medido pelo relógio na parede (ou no relógio de pulso)

Tempo de CPU do usuário é o tempo gasto em "terra do usuário", que é o tempo gasto em processos que não são do kernel

O tempo da CPU do sistema é o tempo gasto no kernel, geralmente o tempo gasto atendendo às chamadas do sistema.

ennuikiller
fonte
7
time [WHAT-EVER-COMMAND]

real    7m2.444s
user    76m14.607s
sys 2m29.432s

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                24

real ou relógio de parede

7m2.444s reais

Em um sistema com processador de 24 núcleos, esse cmd / processo levou mais de 7 minutos para ser concluído. Isso utilizando o paralelismo mais possível com todos os núcleos fornecidos.

do utilizador

usuário 76m14.607s

O cmd / processo utilizou essa quantidade de tempo da CPU. Em outras palavras, na máquina com CPU de núcleo único, o real e o usuário serão quase iguais, portanto, o mesmo comando levará ~ 76 minutos para ser concluído.

sys

sys 2m29.432s

Este é o tempo gasto pelo kernel para executar todas as operações no nível básico / do sistema para executar esse cmd, incluindo alternância de contexto, alocação de recursos, etc.

Nota: O exemplo assume que seu comando utiliza paralelismo / threads.

Página de manual detalhada: https://linux.die.net/man/1/time

Sankarganesh Eswaran
fonte
Dado o tempo que você postou, não é aproximadamente metade do paralelismo realizado? (Estou apenas fazendo (user + sys) / realpara representar isso.
dtc 29/03