Por que um sistema pode não responder?

12

Acabei de executar dot(um programa para desenhar gráficos direcionados) com um arquivo de entrada que era tão grande que não podia ser renderizado em um período de tempo razoável.

Todo o meu sistema congelou. Eu mal conseguia chegar a um console de texto com Ctrl+ Alt+ F1para matar dot, mas levou alguns minutos.

Por que o sistema permite algo assim? Por que ele fornece um programa não crítico, como dot99% do sistema, e usa os 1% restantes para permanecer responsivo?

Christoph Wurm
fonte
Possível duplicado de disco pesada I / O unix.stackexchange.com/questions/5565/... e unix.stackexchange.com/questions/11/...
George M

Respostas:

15

É assim que o GNU / Linux e outros sistemas de multitarefa funcionam, eles compartilham o processador entre os processos em execução, dotnão terão 99%, mas 100% durante 99% do tempo. Cada processo domina o processador por um determinado período de tempo.

Isso é tratado pelos agendadores (o linux possui vários agendadores, alguns apenas empregam a estratégia usual, outros tentam dar mais tempo às interfaces do usuário e assim por diante).

Agora, no seu caso, o problema era - provavelmente - isso dotnão estava demorando muito tempo no processador, mas muita memória. E quando um programa usa muita memória, há uma debulha , que é exatamente um processo que congela o sistema, não porque dotestá fazendo muito, mas porque o kernel precisa 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 dotconsumisse apenas 99% do tempo da CPU, as chances são de que a mudança para um terminal de texto seria quase imediata, o que acontece é que o kernel precisa mover dotcoisas da memória para poder Xvoltar à memória para Xpoder ver as chaves. você apenas pressiona e move para o terminal de texto e, em seguida, o kernel precisa Xsair da memória para o dotqual ainda está sendo executado, e também dotpara mover os processos do terminal de texto (talvez apenas login?) de volta na memória. (Se isso parece confuso, não é apenas porque o exemplo é confuso - a realidade é esta . Confuso)

Um exemplo é que, se você fizer login no terminal de texto, poderá pressionar teclas, pressionar backspace e, felizmente, isso acontecerá em tempo real, mas se você fizer algo tão simples quanto executar uma ferramenta pequena como ps, ela "congelará". "por um tempo porque ele precisa liberar memória para carregar ps(e também precisa aguardar na fila de E / S do disco, que está sendo muito usada para mover dados da e para a memória, até poder solicitar psdo sistema de arquivos) .

njsg
fonte
Hum, então o caminho para uma melhor experiência do usuário seria especificar determinados programas como " fixos " e, assim, impedir que eles fossem trocados.
Christoph Wurm
A aderência não funciona assim desde os anos 70 e a semântica original do bit 'pegajoso'. No entanto, você pode bloquear (partes de) programas na memória para que não possam ser trocados. A memória principal é um luxo caro, portanto, isso não pode ser feito para tudo.
Alexios
@ njsg, obrigado pela boa explicação. Uma pergunta de acompanhamento: não há como evitar surras? Entendo que a troca torna o uso da memória mais eficaz no geral, mas deve haver limites. IMHO um processo tão essencial quanto X nunca deve ser movido para fora da memória. Existe uma maneira de configurar um sistema semelhante ao Unix, de modo que processos essenciais sejam protegidos contra a remoção? Em um servidor, é uma coisa diferente, mas em uma área de trabalho, eu prefiro que um processo com fome de memória seja interrompido do que ter minha área de trabalho parar de falar comigo.
A.Delda