Comment connaître la raison d'un processus qui s'endort et le réveille?

19

Quand je fais 'top', je vois mon processus de script perl dans l'état 'S'. Existe-t-il un moyen de savoir ce qui fait que ce processus Perl passe en état de sommeil et comment le réveiller? N'importe quel moyen de déboguer pour donner plus d'informations sur les lignes du script perl en le faisant passer en état «S».

xyz
la source

Réponses:

22

Un processus en Sétat est généralement dans un appel système bloquant, comme la lecture ou l'écriture dans un fichier ou le réseau, ou l'attente de la fin d'un autre programme appelé.

Vous pouvez utiliser strace -p <pid>pour savoir quel appel système est en cours. Il produira une sortie comme

écrire (1, "foobar" ..., 4096

ce qui signifie que le processus essaie d'écrire 4096 octets commençant par "foobar" dans stdout (fd # 1) mais que ce dans quoi il a été redirigé est occupé et le tampon de sortie est plein.

BCoates
la source
5

Les processus se mettent en veille lorsqu'ils attendent quelque chose, généralement des E / S.

Votre processus sera en Sétat lorsqu'il effectuera des lectures et éventuellement des écritures bloquantes. Peut également se produire en attendant des sémaphores ou d'autres primitives de synchronisation.

Vous ne pouvez pas le "réveiller" - il ne se poursuivra que lorsque les données / ressources qu'il attend seront disponibles.

Tout cela est normal et attendu, et ce n'est généralement pas un problème. En règle générale, ce "programme" s'exécute sur la ligne de commande sans fichier:

while (<>) { print; }

passera la plupart de son temps en veille, ce qui est bien - vous ne voulez pas qu'il gaspille le processeur en attendant l'entrée de l'utilisateur.

Si vous pensez que c'est un problème, essayez de changer la façon dont vous effectuez vos E / S (lecture de plus gros morceaux, en jolis multiples de la taille de bloc du périphérique sous-jacent, exécution d'E / S mappées en mémoire, etc.).

Tapis
la source