¿Cómo saber el motivo por el que un proceso entra en estado de suspensión y lo despierta?

¿Cómo saber el motivo por el que un proceso entra en estado de suspensión y lo despierta?

Cuando hago 'top', veo el proceso de mi script Perl en estado 'S'. ¿Hay alguna manera de saber qué hace que este proceso de Perl entre en estado de suspensión y formas de reactivarlo? Cualquier forma de depurar para brindar más información sobre las líneas en el script Perl haciendo que entre en estado 'S'.

Respuesta1

Un proceso en Sestado generalmente se encuentra en una llamada al sistema de bloqueo, como leyendo o escribiendo en un archivo o en la red, o esperando a que finalice otro programa llamado.

Puede utilizar strace -p <pid>para averiguar qué llamada al sistema se está realizando actualmente. Producirá resultados como

escribir(1, "foobar"..., 4096

lo que significa que el proceso está intentando escribir 4096 bytes comenzando con "foobar" en la salida estándar (fd #1), pero aquello a lo que se ha redirigido está ocupado y el búfer de salida está lleno.

Respuesta2

Los procesos entran en estado de suspensión cuando están esperando algo, generalmente E/S.

Su proceso estará en Sestado cuando esté realizando lecturas y posiblemente escrituras que estén bloqueando. También puede suceder mientras se espera semáforos u otras primitivas de sincronización.

No puede "despertarlo": solo continuará cuando los datos/recursos que está esperando estén disponibles.

Todo esto es normal y esperado, y no suele ser un problema. Normalmente, este "programa" se ejecuta en la línea de comando sin ningún archivo:

while (<>) { print; }

pasará la mayor parte del tiempo en estado de suspensión, lo cual es bueno: no desea que desperdicie la CPU mientras espera la entrada del usuario.

Si ustedpensaresto es un problema, intente cambiar la forma en que realiza sus E/S (leyendo fragmentos más grandes, en buenos múltiplos del tamaño de bloque del dispositivo subyacente, realizando E/S asignadas en memoria, etc.).

información relacionada