É assim que o GNU / Linux e outros sistemas multitarefa funcionam, eles compartilham o processador entre os processos em execução, dot
não terá 99%, mas 100% durante 99% do tempo. Cada processo domina o processador por um determinado período de tempo.
Isso é feito pelos agendadores (o linux tem vários agendadores, alguns apenas empregam a estratégia usual, alguns tentam dar mais tempo às interfaces do usuário e assim por diante).
Agora, no seu caso, o problema era - provavelmente - que dot
não estava levando muito tempo do processador, mas muita memória. E quando um programa usa muita memória, há debulha , que é exatamente um processo que faz o sistema congelar, não porque dot
está fazendo muito, mas porque o kernel tem que mover as páginas de memória para frente e para trás entre o disco (partição swap) e a memória do sistema.
Mesmo se dot
estivesse tirando apenas 99% do tempo da CPU, é provável que a mudança para um terminal de texto fosse quase imediata, o que acontece é que o kernel precisa mover dot
de memória para poder colocar X
de volta na memória para que X
possa ver as chaves que você acabou de acessar e mover para o terminal de texto, então o kernel precisa mover X
de memória para dot
que ainda está em execução e também mover dot
out para mover os processos do terminal de texto (talvez apenas login
?) de volta na memória. (Se isso parece confuso, não é só porque o exemplo é confuso - a realidade é esta bagunçada.)
Um exemplo é se você logar no terminal de texto, você pode apenas apertar teclas, clicar em backspace, e isso acontecerá em tempo real, mas se você fizer algo tão simples como executar uma pequena ferramenta como ps
, ele irá "congelar" por um tempo porque ele tem que liberar memória para carregar ps
(e também tem que esperar na fila de E / S de disco, que está sendo muito usada para mover dados de e para a memória, até ele é capaz de solicitar ps
do sistema de arquivos).