Como saber a razão de um processo entrar em estado de suspensão e despertá-lo?

19

Quando eu faço 'top', vejo meu processo de script perl no estado 'S'. Existe uma maneira de saber, o que está tornando esse processo perl em estado de suspensão e maneiras de ativá-lo? Qualquer maneira de depurar para dar mais insights sobre linhas no script perl, tornando-o no estado 'S'.

    
por xyz 11.04.2012 / 08:50

2 respostas

19

Um processo no estado S 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. Isso produzirá resultados como

write(1, "foobar"..., 4096

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

    
por 05.09.2012 / 21:32
5

Os processos vão para os estados de suspensão quando estão esperando por algo, geralmente I / O.

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

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

Isso tudo é normal e esperado, e geralmente não é um problema. Normalmente, esse "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ê achar que isso é um problema, tente mudar a maneira como você faz o seu I / O (lendo pedaços maiores, em bons múltiplos do tamanho do bloco do dispositivo subjacente, fazendo E / S mapeada na memória, etc.).

    
por 11.04.2012 / 10:23