¿Cuál es el "canal de espera" de un proceso?

36

En la pestaña Procesos del Monitor del sistema GNOME hay una columna "Canal de espera". Con mucho, los valores más comunes que veo aquí son poll_schedule_timeout , pero también veo otros valores: 0 , do_exit , do_wait , futex_wait_queue_me , pipe_wait , __skb_recv_datagram y unix_stream_data_wait .

Entonces, ¿qué significa esta columna "Canal de espera"? ¿Y quizás qué significan algunos de esos valores?

Captura de pantalla

8128
fuente

Respuestas:

42

El canal de espera es el lugar en el Kernel donde la tarea está esperando actualmente. Una tarea tiene que esperar un Recurso, que puede ser datos o tiempo de procesamiento. Estos dos incluyen tomas de red, hardware, archivos, etc. dado que la mayoría de ellos son solo archivos, en sistemas tipo Unix.

  • 0: El proceso no está esperando

  • poll_schedule_timeout

    poll()es una llamada al sistema 1 utilizada para manejar E / S. Es similar a select(). 2

    Las aplicaciones que usan E / S sin bloqueo usan estas llamadas para ver si pueden leer o escribir en un archivo, sin tener que bloquearlo. A menudo se usan para flujos de entrada / salida, que pueden no estar bloqueados (de lo contrario, tal vez su mouse se detendría para moverse).

    El canal de espera poll_schedule_timeoutindica que una tarea está esperando E / S, ya sea hardware como teclados y ratones, dispositivos de sonido o incluso enchufes de red.

    1. Una función en el núcleo
    2. Están definidos en <linux/poll.h>. pollfue una implementación vista por primera vez en el Sistema V, selectes el equivalente BSD UNIX.
  • futex_wait_queue_me:

    Para explicar esto, tenemos que mirar las cerraduras. Un bloqueo es un estado guardado en el sistema que indica que una tarea funciona con un recurso. Puede haber, por ejemplo, solo una tarea que lea un archivo. Esta tarea bloqueará el archivo, cualquier otra tarea 1 que intente leer el archivo sabrá que está bloqueado y esperará a que el bloqueo desaparezca, antes de que pueda acceder a él. Lo mismo sucede con el tiempo del procesador.

    La versión moderna de Linux (en la mayoría de las arquitecturas) utiliza un bloqueo Futex (mutex de espacio de usuario rápido) en el núcleo. Mutex, exclusión mutua, se refiere a la idea de que solo se puede acceder a un recurso común mediante una tarea en cualquier momento. Para esto, se establecen banderas en el sistema.

    Si un proceso está esperando un recurso bloqueado, esto se llama Ocupado en espera o "Girar", en referencia al hecho de que intenta acceder a él una y otra vez, hasta que puede. Se dice que una tarea está bloqueada cuando gira.

    Si puede leer esto, está obligado a corregir al menos un error en esta respuesta: P

    Cerraduras futex pueden considerarse como un número en el espacio de usuario, que puede ser incrementado o decrementado en una tarea (en los casos en que el recurso puede ser accedida por múltiples tareas, este número puede ser mayor que uno). Este es el número que se muestra en el diagrama 4 .

    Estas tareas se ponen en cola en la cola de espera , una cola simple de tareas que necesitan hacer algún trabajo, una vez que el tiempo de procesamiento está disponible, las tareas hacen su trabajo y se eliminan de la cola.

    futex_wait_queue_mepone en cola una tarea. Luego espera una señal, un tiempo de espera o un despertar. Las tareas que están en este canal de espera no están esperando en la cola de espera, están esperando ser puestas en cola.


    1. Una tarea puede ser un Proceso 3 o un Hilo 2
    2. Un hilo es una subsección de un proceso. Muchos hilos pueden correr paralelos
    3. Un proceso es un programa completo, consta de uno o más subprocesos, aunque un programa también puede consistir en múltiples procesos.
    4. Recuerde, esto todavía es una vista de alto nivel de las cosas, no está considerando los detalles de implementación
  • __skb_recv_datagram

    Espere algunos datos en un socket de red bloqueado.

  • sk_wait_data

    Espere algunos datos en un socket de red.

  • do_exit

    Esta es la última parte de salir de un proceso. do_exit()llama al schedule()siguiente, para programar otro proceso. Cuando do_exit()se llama, el proceso es a ZOMBIE.

  • do_wait

    Se agrega un proceso a la cola de espera de los planificadores.

  • pipe_wait, unix_stream_data_wait

    Un proceso está esperando datos de un subproceso. Esto sucede, por ejemplo, cuando ejecuta este tipo de código:

    echo | sleep 10 && echo hallo              # pipe
    

    o

    cat < hello.c                              # unix data stream
    
  • hrtimer_nanosleep

    El proceso está durmiendo, usando el hrtimer_nanosleep()método. Este método puede usarse para que un programa duerma durante intervalos de tiempo específicos, con una precisión de nanosegundos.

Estos no son todos, pero no observé ningún otro. Publica un comentario si me he perdido algo.

Stefano Palazzo
fuente
Me he encontrado con sleep_on_page_killable?
Emmanuel M. Smith
La causa más probable de sleep_on_page_killable es que el proceso está intentando cargar una página que no está en la memoria, por lo que causa un error de página, y el proceso debe ponerse en suspensión hasta que se cargue la página. Si el subsistema de E / S está sobrecargado (tal vez porque está haciendo muchas E / S), esto podría aparecer con frecuencia.
tsuna
¿qué pasa signal? Me he encontrado con eso. ¿El proceso está muerto? ¿zombi? ¿o que? ¿Qué pasará con el proceso?
itsnotmyrealname
11

El valor del canal de espera es el nombre de la función del núcleo en la que el proceso está actualmente bloqueado.

El nombre generalmente está relacionado con una llamada al sistema, que tendrá una página de manual.

  • futex_wait_queue_me está relacionado con futex . Se refiere a un tipo de bloqueo de mutex (exclusión mutua de espacio de usuario rápido) que se utiliza para programar el trabajo de muchos procesos en un procesador. El estado indica que su proceso está en cola para recibir el bloqueo. 2
  • do_wait está relacionado con la espera .
  • etc.

Si realmente desea información más detallada, puede consultar la fuente del núcleo .

Si escribe cat /proc/some_pid/stacken un terminal obtendrá un resultado como ese:

[<c0227f4e>] poll_schedule_timeout+0x3e/0x60
[<c022879f>] do_select+0x55f/0x670
[<c0228f40>] core_sys_select+0x140/0x240
[<c0229241>] sys_select+0x31/0xc0
[<c05c9cc4>] syscall_call+0x7/0xb
[<ffffffff>] 0xffffffff

Y en la primera línea obtienes lo que se muestra en el monitor del sistema. Hasta donde yo sé, poll_schedule_timeout indica que su proceso está esperando algo.

Se trata de E / S asíncronas y sondeo .

Fuente (s): 1. ¿ canal de espera de proceso (WCHAN) y alarma? - 2. Respuesta de AskUbuntu

Maxime R.
fuente
Reformula eso. : P
Stefano Palazzo
Parece que notaste que reutilicé tu respuesta para mejorarla ;-) ¿Qué tipo de atribución te gustaría tener?
Maxime R.
2
Su comentario es más que suficiente para mantenerme feliz :) Si desea conocer cómo funciona la atribución, hay una buena publicación de blog SO sobre el tema. Sin embargo, no se preocupe demasiado, quiero que la gente reutilice mi trabajo tanto como sea posible.
Stefano Palazzo
1
Bueno, estaba escribiendo una pregunta sobre este tema en meta. (ya había leído la publicación del blog)
Maxime R.
Es aquí . Y apuesto a que su respuesta terminará sobre la mía en algún momento ^^
Maxime R.