Como saber o motivo de um processo entrar no estado de hibernação e acordá-lo?

Como saber o motivo de um processo entrar no estado de hibernação e acordá-lo?

Quando faço 'top' , vejo meu processo de script Perl no estado 'S'. Existe uma maneira de saber o que está fazendo esse processo Perl entrar no estado de suspensão e maneiras de ativá-lo? Qualquer forma de depurar para fornecer mais informações sobre as linhas no script perl, fazendo-o entrar no estado 'S'.

Responder1

Um processo em Sestado geralmente está em uma chamada de sistema de bloqueio, como ler ou gravar em um arquivo ou na rede, ou aguardar a conclusão de outro programa chamado.

Você pode usar strace -p <pid>para descobrir qual chamada de sistema está acontecendo no momento. Ele produzirá resultados como

escreva(1, "foobar"..., 4096

o que significa que o processo está tentando gravar 4.096 bytes começando com "foobar" no stdout (fd # 1), mas o que quer que tenha sido redirecionado está ocupado e o buffer de saída está cheio.

Responder2

Os processos entram em estado de suspensão quando estão esperando por algo, geralmente E/S.

Seu processo estará no Sestado quando estiver fazendo leituras e possivelmente gravações que estão bloqueando. Também pode acontecer enquanto espera por semáforos ou outras primitivas de sincronização.

Você não pode "acordá-lo" - ele só continuará quando os dados/recursos que está aguardando estiverem disponíveis.

Tudo isso é normal e esperado, e geralmente não é um problema. Normalmente, este "programa" é executado na linha de comando sem nenhum arquivo:

while (<>) { print; }

passará a maior parte do tempo em estado de suspensão, o que é bom - você não quer que ele desperdice CPU enquanto aguarda a entrada do usuário.

Se vocêpensarisso é um problema, tente mudar a maneira como você faz sua E/S (lendo pedaços maiores, em bons múltiplos do tamanho do bloco do dispositivo subjacente, fazendo E/S mapeada na memória, etc.).

informação relacionada