La diferencia entre el mecanismo de señal de Linux y el mecanismo de señal de Linux
¡Similares en nombre, pero muy diferentes en esencia! Ver respuesta detallada...
Mecanismo de señales de Linux
Las señales también se denominan señales (señales de interrupción suave), que se utilizan para notificar al proceso que ha ocurrido un evento asincrónico.
Principio:
Se puede decir que el proceso que recibe la señal y el procesador que recibe la solicitud de interrupción son el mismo. Entre los mecanismos de comunicación entre procesos, las señales son el único mecanismo de comunicación asincrónica; el proceso no necesita hacer nada para esperar la llegada de la señal y, de hecho, el proceso no conoce la hora exacta de llegada de la señal. Se pueden enviar señales de interrupción suave entre procesos a través de la llamada al sistema Kill. El kernel también puede enviar señales al proceso debido a eventos internos, notificando al proceso que ha ocurrido un evento. Además de las funciones básicas de notificación, el mecanismo de señalización puede transmitir otra información.
Clasificación:
Las señales se pueden clasificar desde dos perspectivas diferentes:
Fiabilidad: señales fiables y señales no fiables;
Relación con el tiempo : señales en tiempo real y señales en tiempo no real.
Parte de la definición está reproducida de: blogs.com/hoys/archive/2012/08/19/2646377.html
Mecanismo de semáforo de Linux
Linux Los semáforos del kernel se utilizan para sincronizar el acceso a los recursos que disfrutan los procesos del sistema operativo.
Principio: el semáforo debe establecer un valor inicial cuando se crea, es decir, varias tareas pueden acceder al semáforo al mismo tiempo para proteger los recursos más compartidos. Cuando el valor inicial es 1, se convertirá en un bloqueo de exclusión mutua (Mutex), es decir, solo una tarea puede acceder al semáforo al mismo tiempo para proteger los recursos compartidos.
Para acceder a los recursos compartidos de ****, la tarea primero debe obtener el semáforo. La operación de obtener el semáforo reducirá el valor del semáforo en 1. Si el valor actual del semáforo es negativo, indica que no se puede obtener el semáforo, la tarea debe colgarse en la cola del semáforo y esperar a que el semáforo esté disponible; si el valor del semáforo actual es un número no negativo, indica que se puede obtener el semáforo; Se puede acceder inmediatamente al semáforo protegido por recursos compartidos. El semáforo está protegido por recursos compartidos ****. El valor actual del semáforo no es negativo, lo que significa que el semáforo está disponible y puede acceder inmediatamente al recurso protegido por el semáforo.
Cuando una tarea accede a un recurso protegido por semáforo, debe liberar el semáforo sumando 1 al valor del semáforo. Si el valor del semáforo no es negativo, significa que hay una tarea esperando el semáforo actual, por lo que todas las tareas que esperan el semáforo también se despertarán.
API común para señales:
DECLARE_MUTEX(name)
Esta macro declara un nombre de semáforo y lo inicializa al valor 0, es decir, declara un Bloqueo mutex.
DECLARE_MUTEX_LOCKED(nombre)
Esta macro declara el nombre de un bloqueo mutex, pero establece su valor inicial en 0, lo que significa que el bloqueo está bloqueado cuando se crea. Por lo tanto, para este tipo de bloqueo, normalmente se libera antes de adquirirlo.
void sema_init (struct semaphore *sem, int val);
Esta función se utiliza para la inicialización digital para establecer el valor inicial de un semáforo, que establece el valor del semáforo sem en vale.
void init_MUTEX (struct semaphore *sem );
Esta función se utiliza para inicializar un bloqueo mutex, es decir, establecer el valor del semáforo sem en 0.
void init_MUTEX_LOCKED (struct semaphore *sem );
Esta función también se usa para inicializar el interlock, pero establecerá el valor de sem en 0, es decir, será bloqueado desde el estado inicial.
void down(struct semaphore * sem);
Esta función se utiliza para obtener el semáforo sem. Provocará suspensión y, por lo tanto, no puede estar en el contexto de interrupción (incluido el contexto IRQ y softirq). contexto) uso. Esta función disminuye el valor de sem en 1. Si el valor del semáforo sem no es negativo, regresa directamente. De lo contrario, la persona que llama será suspendida hasta que otras tareas liberen el semáforo para continuar ejecutándose.
int down_interruptible(struct semaphore * sem);
Esta función es similar a down, pero down no será interrumpido por señales, mientras que down_interruptible puede ser interrumpido por señales.
int down_trylock(struct semaphore * sem);
Esta función intenta obtener el semáforo sem. Si se puede obtener inmediatamente, obtiene el semáforo y devuelve 0. De lo contrario, indicará que no se puede obtener el semáforo y devolverá un valor distinto de cero. Por lo tanto, no hace que la persona que llama duerma y puede usarse en un contexto de interrupción.
void up(struct semaphore * sem);
Esta función libera el semáforo sem, es decir, suma 1 al valor de sem si el valor de sem no es positivo. número, significa que hay tareas que están esperando el semáforo, así que despierte a estos camareros.
Ejemplo:
Los semáforos se utilizan como bloqueos mutex en la mayoría de los casos. El siguiente es un ejemplo del uso de semáforos en un sistema controlado por consola.
En kernel/printk.c en el árbol de código fuente del kernel, el bloqueo mutex console_sem se declara usando la macro DECLARE_MUTEX. Este bloqueo se usa para proteger la lista de controladores de consola console_drivers y sincronizar todo el sistema de consola. acceso.