
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 S
estado 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 S
estado 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.).