2.2. Semáforos
Material de estudio basado en la edición de 2014. Borrador pendiente de revisión editorial independiente.
Semáforos — Definición
Resumen
Los semáforos son una herramienta de sincronización que permite garantizar la exclusión mutua de una sección crítica entre un número arbitrario de procesos de manera limpia y sencilla.
Definición formal
Un semáforo es una variable de tipo semaphore con un contador asociado. Se manipula con tres operaciones:
| Operación | Funcionamiento |
|---|---|
sem_init(semaphore s, unsigned int valor) | Inicializa el contador con el valor indicado (≥ 0) |
sem_wait(semaphore s) | Atómicamente: espera a que el contador sea > 0, luego lo decrementa |
sem_signal(semaphore s) | Atómicamente: incrementa el contador |
Pseudo-código
sem_wait(semaphore s) {
while (s <= 0) /* atómicamente */
espera();
s = s - 1;
}
sem_signal(semaphore s) {
s = s + 1; /* atómicamente */
}
Tipos de semáforos
- Binarios: el contador sólo puede valer 0 o 1. Implementan de modo más natural la exclusión mutua.
- N-arios: el contador puede tomar cualquier valor ≥ 0.
Observaciones importantes
-
Las operaciones son atómicas: si dos procesos esperan con
sem_waity un tercero ejecutasem_signal, sólo uno de los dos procesos en espera verá el incremento y lo decrementará. -
Problema de elección: cuando varios procesos esperan, la implementación debe elegir uno. Inicialmente se considera la elección aleatoria.
-
Las operaciones básicas no devuelven el valor actual del contador.
-
Nombres alternativos:
sem_wait: P, down, signal, acquire, pendsem_signal: V, up, wait, release, post- No confundir con las llamadas al sistema UNIX
waitysignal.
Ideas clave
- El semáforo es una variable con contador y tres operaciones atómicas: init, wait y signal.
- Los semáforos binarios implementan exclusión mutua; los n-arios permiten contar recursos.
- La atomicidad de las operaciones es la propiedad fundamental que garantiza la corrección.
- La elección del proceso en espera puede causar inanición si no se gestiona adecuadamente.