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
La ejecución de live55 en Linux muestra la figura: no obtener ip: ip es 0.0.0.0 live555 no conoce l
La primera vez es la configuración de red básica. 1. Verifique primero la dirección mac de la re
Notas de instalación 1. Este paquete de instalación se puede implementar e instalar en todos los
Windows CE es un sistema operativo integrado desarrollado por Microsoft que se puede utilizar en una
Sistema Linux y 20 puntos de diferencia con Windows
Línea de comandos de GCC detallada
Conceptos básicos sobre el uso de la familia de funciones de Linux exec
Cómo usar rdesktop para lograr el uso simultáneo de Linux y Windows
El enfoque de unión a la red tomas de dispositivos en Linux
¿Cómo resolver USB no reconocido bajo Linux?
Proceso de configuración de la cuota de disco de Linux (Cuota)
Funciones recursivas para scripts de shell - atravesar directorios para operaciones
Cómo instalar el controlador RAID en Linux usando el disco U
Windows XP tiene una terrible vulnerabilidad. Una forma fácil de invalidar las contraseñas
Cómo restaurar la función de limpieza del disco del sistema Win10
Win2003 consejos para mejorar la seguridad FSO
¿Qué debo hacer si Win7 instala un error en la verificación del certificado del sistema FLASH?
Windows 7 olvidó iniciar sesión en la solución de contraseña
¿Dónde está la tienda de aplicaciones Win10?