Uso de colas en la programación de procesos de Linux

  
 El kernel de Linux usa muchas colas, solo para nombrar algunas de sus aplicaciones en la programación de procesos. Las colas en el kernel de Linux están conectadas en forma de listas de enlaces dobles. Include /linux /list.h define las colas y proporciona algunas interfaces. Para una introducción detallada, consulte el apéndice en [1]
.
Linux en el proceso tiene los siguientes estados:

Estado de proceso
Descripción


TASK_RUNNING

El proceso se está ejecutando o se ejecutará.

TASK_INTERRUPTIBLE

El proceso está inactivo, esperando la finalización de una condición.

TASK_UNINTERRUPTIBLE

El sueño profundo no se verá afectado por la señal.

TASK_STOPPED

La ejecución del proceso se detiene.

TASK_TRACED

El proceso es detenido por el depurador y seguido por otro proceso.
dos estados adicionales son EXIT_ZOMBIE y EXIT_DEAD, que representa un avance real en un estado de muerte o la muerte. Un proceso que está en un estado muerto esperará la adopción de su proceso principal (de lo contrario, será adoptado por el proceso de inicio), y el proceso que está realmente muerto se eliminará directamente.
proceso TASK_RUNNING estado será colocado en la cola de ejecución (cola de ejecución), esto es por task_struct (definido en include /linux /sched.h) miembros run_list a enlaces. Sin embargo, para que el kernel elija el proceso de prioridad más apropiado cada vez, Linux crea una cola para cada prioridad. Esto se consigue mediante un prio_array struct, prio_array struct define en kernel /sched.c, como sigue:
struct prio_array {
int nr_active;
sin signo de mapa de bits de largo [BITMAP_SIZE];
struct list_head cola [MAX_PRIO];
};
cola es una matriz de miembro de cola. Cada CPU tiene su propia cola de ejecución, y cada cola de ejecución tiene dos prio_arrays, una para la cola activa y otra para la cola agotada en el tiempo. Cuando la cola de ejecución está vacía, el kernel intercambia los punteros de las dos colas y la cola de escape original se convierte en la nueva cola activa. Esto y el mapa de bits en la matriz prio son la clave para determinar el algoritmo de programación como O (1).
proceso del estatuto TASK_STOPPED, EXIT_ZOMBIE o EXIT_DEAD no ser colocados en una cola especial, se accede a ellos directamente a través de pid o hijo de la cola de proceso padre. Proceso
estado TASK_UNINTERRUPTIBLE TASK_INTERRUPTIBLE y se coloca en la cola de espera. La diferencia es que cada evento de espera tiene una cola de espera, y el proceso en la cola espera la finalización del mismo evento.
( quo; Evento " Un proceso dinámico, no es fácil definir un "evento" a través de una estructura específica. La espera de un evento aquí es para ver si una condición es verdadera, por ejemplo, si una variable de marca es verdadera.) wait_queue_head_t definido en include /linux /wait.h como sigue:
typedef struct _ _wait_queue_head {
spinlock_t cerradura;
struct list_head task_list;
} wait_queue_head_t;
wait_queue_t define como sigue: typedef struct
_ {_wait_queue
sin signo int flags;
estructura task_struct * tarea;
wait_queue_func_t func;
estructura list_head task_list;
} wait_queue_t;
en un estado de espera de la interfaz, hay dos tipos:
Prepare_To_Wait * () /finish_wait ()
wait_event * ()
hecho wait_event * () llamada es interna Prepare_to_wait * (), póngalo en un bucle. Y wait_event * () llamará automáticamente finish_wait () cuando se complete el evento. Decide cuál usar dependiendo de la situación.
(sleep_on * () es una interfaz abandonada y ya no se usa, aunque también es compatible). Hay dos tipos de procesos que esperan en la cola, uno es exclusivo y el otro no es exclusivo. El llamado exclusivo significa que los recursos que esperan el proceso de reactivación se excluyen mutuamente, y solo se activan uno a la vez (múltiples despertadores, pero solo uno se activará al final, y el resto se agregará nuevamente a la cola de espera, por lo que la eficiencia será Gran descuento). En general, la función de espera establecerá el proceso como no exclusivo e ininterrumpible, y el "interrumpible" especificará específicamente el estado como interrumpible, y el "tiempo de espera" se cerrará después del tiempo de espera, ya que llamará schedule_timeout (); con " Exclusivo " establecerá el proceso en exclusivo.
raíz de la interfaz, aunque sólo wake_up * (), pero también se divide en varios interior. La función de activación con "interrumpible" solo activará el proceso cuyo estado es TASK_INTERRUPTIBLE, sin el proceso de activación de TASK_INTERRUPTIBLE y TASK_UNINTERRUPTIBLE; todas las funciones de activación despertarán todos los procesos no exclusivos a la espera del mismo evento, o uno de ellos exclusivo. El proceso se activa, y con "nr", activará el número especificado de procesos exclusivos, con "todos" activará todos los procesos exclusivos. Con " sync " ignorará la verificación de prioridad, los procesos de alta prioridad pueden demorarse. Finalmente, solo se puede llamar a wait_up_locked () cuando se mantiene un bloqueo de giro.
gestión de procesos del núcleo de Linux es la parte más crítica, su rendimiento se determina casi directamente la calidad del grano, algunos de los diseños y el uso de algoritmos que son muy complejos. Esto es solo para introducir el uso de la cola en él, y aún queda por explorar una mayor exploración.

Copyright © Conocimiento de Windows All Rights Reserved