Volver al temario
Tema 04 · 70 páginas

Comunicación y sincronización

Tema completo Modo estudio
GUÍA DE ESTUDIO · Páginas 1517 Ver PDF

2.2.1. Definición de semáforo

Material de estudio basado en la edición de 2014. Borrador pendiente de revisión editorial independiente.

Definición de Semáforo

Resumen

Estructura del semáforo

Un semáforo es una variable de tipo semaphore que contiene un contador asociado. Se manipula exclusivamente mediante tres operaciones atómicas.

Las tres operaciones

1. sem_init(semaphore s, unsigned int valor)

  • Inicializa el contador del semáforo con el valor especificado.
  • El valor inicial debe ser ≥ 0.

2. sem_wait(semaphore s)

  • Operación atómica que espera a que el contador sea mayor que cero.
  • Cuando lo sea, decrementa el valor del contador.
  • Si el contador es 0, el proceso se bloquea.

3. sem_signal(semaphore s)

  • Operación atómica que incrementa el valor del contador asociado.

Pseudo-código detallado

sem_wait(semaphore s) {
    while (s <= 0)  /* atómicamente */
        espera();
    s = s - 1;
}

sem_signal(semaphore s) {
    s = s + 1;  /* atómicamente */
}

Clasificación por tipo de contador

  • Semáforo binario: contador vale 0 o 1. Es la forma más natural de implementar exclusión mutua.
  • Semáforo n-ario: contador puede tomar cualquier valor ≥ 0. Útil para contar recursos disponibles.

Comportamiento atómico

La atomicidad es esencial. Ejemplo:

  • Contador = 0, dos procesos hacen sem_wait.
  • Un tercer proceso ejecuta sem_signal → contador = 1.
  • Sólo uno de los dos procesos en espera verá el valor 1 y lo decrementará. El otro continuará esperando.

Problema de selección

Cuando varios procesos esperan en sem_wait sobre el mismo semáforo y se ejecuta sem_signal, la implementación debe elegir cuál de los procesos en espera continúa. Los criterios posibles incluyen aleatorio, FIFO y prioridades.

Nombres no estándar

Nombres alternativossem_waitsem_signal
Variantes comunesP, down, acquire, pendV, up, release, post

Precaución: no confundir con las llamadas al sistema UNIX wait y signal, que tienen semántica diferente.

Ideas clave

  • El semáforo se define por tres operaciones atómicas: init, wait y signal.
  • La atomicidad de sem_wait y sem_signal es la propiedad que garantiza la corrección.
  • Los semáforos binarios son los más adecuados para exclusión mutua.
  • Los semáforos n-arios permiten contar recursos disponibles.
Consultar el contenido original