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_timeout
indica que una tarea está esperando E / S, ya sea hardware como teclados y ratones, dispositivos de sonido o incluso enchufes de red.
- Una función en el núcleo
- Están definidos en
<linux/poll.h>
. poll
fue una implementación vista por primera vez en el Sistema V, select
es 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.
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_me
pone 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.
- Una tarea puede ser un Proceso 3 o un Hilo 2
- Un hilo es una subsección de un proceso. Muchos hilos pueden correr paralelos
- Un proceso es un programa completo, consta de uno o más subprocesos, aunque un programa también puede consistir en múltiples procesos.
- 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.