Semáforos: en Linux hay bloqueos de suspensión. Cuando una tarea intenta adquirir un semáforo que no está disponible, el semáforo coloca la tarea en una cola de espera y la pone en suspensión. El procesador queda libre para ejecutar otro código. Cuando el semáforo se convierte disponible, una de las tareas en la cola de espera se despierta para que luego pueda adquirir el semáforo.
Hay dos tipos de semáforos en el kernel de Linux:
1. Semáforo binario: si el recuento es igual a uno, y el semáforo se llama semáforo binario (porque lo tiene una tarea o no lo tiene) o un mutex (porque obliga a la exclusión mutua).
- ¿Por qué todas las distribuciones de Linux tienen Python preinstalado y no C / C ++?
- La pantalla de mi computadora portátil Asus no funciona, pero otros periféricos funcionan perfectamente. ¿Qué tengo que hacer?
- ¿Hay algún software de respaldo continuo?
- ¿Qué tan grande puede llegar a ser un átomo?
- ¿Se detiene la tecnología informática?
2. Recuento de semáforos: el recuento se puede inicializar a un valor distinto de cero mayor que Uno. en este caso, el semáforo se llama semáforo de conteo, y permite a la mayoría de los titulares del bloqueo a la vez. Los semáforos de conteo no se usan para forzar la exclusión mutua porque permiten múltiples hilos de ejecución en la región crítica a la vez.
● La implementación del semáforo de Linux:
● estructura semáforo:
● Inicialización básica:
● void sema_init (struct semaphore * sem, int val);
● P está “abajo” y V está “arriba”
Versiones de “abajo”:
vacío (struct semáforo * sem); Disminuya y espere tanto como sea necesario
int down_interruptible (estructura semáforo * sem); Disminuya y espere, pero permita que el proceso de espacio de usuario continúe recibiendo señales. Debe probar el valor de retorno para la interrupción.
int down_trylock (estructura semáforo * sem); Nunca espere, intente y falle si no puede bloquear. Debe probar retval.
Versión de “arriba”
vacío (struct semáforo * sem);
Semáforos de lector / escritor:
Las situaciones en las que se prefieren los semáforos de lector-escritor sobre los semáforos estándar Todos los semáforos de lector-escritor son mutexes, es decir, su recuento de uso es uno, aunque imponen la exclusión mutua solo para escritores, no lectores. bloqueo, siempre que no haya escritores. Por el contrario, solo un único escritor (sin lectores) puede adquirir la variante de escritura de la cerradura. Todas las cerraduras de lector-escritor usan suspensión ininterrumpida.
Encabezado: struct rw_semaphore:
Inicialización: void init_rwsem (struct rw_semaphore * sem);
Acceso de solo lectura:
vacío down_read (struct rw_semaphore * sem);
int down_read_trylock (struct rw_sempaphore * sem);
vacío up_read (struct rw_semaphore * sem);
Acceso de escritura:
vacío down_write (struct rw_semaphore * sem);
int down_write_trylock (struct rw_semaphore * sem);
vacío up_write (struct rw_semaphore * sem);
anular downgrade_write (struct rw_semaphore * sem);