Como saber o motivo de um processo entrar em estado de suspensão e acordá-lo?

19

Quando eu 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 maneira de depurar para fornecer mais informações sobre linhas no script perl, tornando-o no estado 'S'.

xyz
fonte

Respostas:

22

Um processo no Sestado geralmente ocorre em uma chamada do 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 do sistema está acontecendo no momento. Produzirá saída como

gravação (1, "foobar" ..., 4096

o que significa que o processo está tentando gravar 4096 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.

BCoates
fonte
5

Os processos entram no estado de suspensão quando aguardam algo, geralmente E / S.

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

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

Tudo isso é 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 no estado de suspensão, o que é bom - você não quer que ela perca CPU enquanto aguarda a entrada do usuário.

Se você acha que isso é um problema, tente alterar a maneira como realiza suas E / S (lendo blocos maiores, em múltiplos agradáveis ​​do tamanho do bloco do dispositivo subjacente, executando E / S mapeadas na memória etc.).

Esteira
fonte