Implementación de la cola de espera en el sistema Linux

  

En el desarrollo de software, las tareas a menudo tienen que ir a la suspensión porque no se cumplen algunas condiciones, y luego continúan ejecutándose cuando se cumplen las condiciones de espera, e ingresan al estado de ejecución. Este requisito debe ser soportado por el mecanismo de cola. Se proporciona un mecanismo para esperar colas en Linux, que se usa ampliamente en el kernel.

El proceso de usar una cola de espera en el kernel de Linux es muy simple. Primero, defina un wait_queue_head, luego si una tarea quiere esperar un evento, llame a wait_event (wait queue, event).

Las colas de espera se utilizan ampliamente, pero la implementación del kernel es bastante simple. Implica dos estructuras de datos importantes: __wait_queue_head, que describe el encabezado de cadena de la cola de espera, que contiene una lista vinculada y un bloqueo atómico. La estructura se define de la siguiente manera:

struct __wait_queue_head {

spinlock_t lock; /* protege los bloqueos atómicos a la espera de colas * /

struct list_head task_list; /* wait queues * /

};

__wait_queue, la estructura es correcta Una abstracción de la espera de una tarea. Cada tarea de espera se abstrae en wait_queue y se monta en wait_queue_head. La estructura se define de la siguiente manera:

struct __wait_queue {

indicadores int sin signo;

void * private; /* generalmente apunta al bloque de control de tareas actual * /

/* Método de operación de activación de tareas, que se proporciona en el kernel, generalmente autoremove_wake_function * /

wait_queue_func_t func;

struct list_head task_list; /* mount mount_queue_head mount point * /< Br>

};

La idea de las colas de espera en Linux es la que se muestra en la siguiente figura. Cuando una tarea debe suspenderse en un wait_queue_head, encapsula su propia información de bloque de control de proceso en wait_queue, y luego Montado en la lista enlazada de wait_queue para realizar el sueño programado. Cuando ocurren ciertos eventos, otra tarea (proceso) despierta una o todas las tareas en wait_queue_head. El trabajo de activación establece las tareas en la cola de espera en un estado programable y las elimina de la cola.

se utiliza primero para definir una cola wait_queue_head espera, que se puede lograr por DECLARE_WAIT_QUEUE_HEAD macro, que es un método de estáticamente definido. Esta macro define un wait_queue_head e inicializa los bloqueos en la estructura, así como la cola de espera. Por supuesto, el método de inicialización dinámica también es muy simple, puede inicializar el bloqueo y la cola.

Cuando una tarea necesita esperar a que ocurra un evento, generalmente llama a wait_event, que define un wait_queue, describe la tarea en espera, inicializa wait_queue con el bloque de descripción del proceso actual, y luego agrega wait_queue a wait_queue_head. El flujo de implementación de la función se describe a continuación:

1. Inicialice una tarea de espera descrita por wait_queue con el bloque de descripción del proceso actual (PCB).

2, a la espera de la protección de recursos de bloqueo de cola, esperará a que la tarea se una a la cola de espera.

3. Determine si se satisface la condición de espera. Si se cumple, esperará a que la tarea se elimine de la cola y salga de la función.

4, si no se cumplen las condiciones, la programación de tareas, los recursos de la CPU a otras tareas.

5. Después de que se despierte la tarea de reposo, repita los pasos (2) y (3). Si se cumple la condición de confirmación, salga de la función de evento de espera.

Interfaz de programación de la cola de espera

1

wait_event

Esta es una macro que coloca la tarea actual en un estado de evento de espera. Los parámetros de entrada son los siguientes:

@wq: cola de espera

@conditions: condición de espera

2

wait_event_timeout

la función es similar a la de wait_event Hay un mecanismo de tiempo de espera adicional. Hay un tiempo de espera adicional en el parámetro.

3

wait_event_interruptible

Esta es una macro que puede despertarse con un mensaje en comparación con las dos primeras macros. Si un mensaje lo despierta, devuelva - ERESTARTSYS. Los parámetros de entrada son los siguientes:

@wq: cola de espera

@condition: condición de espera

@rt: valor de retorno

4

wait_event_interruptible_timeout

Comparado con (3), el mecanismo de tiempo de espera es más

5

wake_up

despertar esperando Una tarea en la cola

6

wake_up_all

reactiva todas las tareas en la cola de espera

Copyright © Conocimiento de Windows All Rights Reserved