2.2.1. Definición de semáforo
Texto íntegro de la conversión. Las figuras y la disposición de las notas se pueden consultar en el PDF.
2.2.1. Definición de semáforo
Un semáforo es una variable (asumimos que es de tipo semaphore) que tiene asociado un contador. El semáforo se manipula utilizando las tres operaciones siguientes:
- sem_init(semaphore s, unsigned int valor): inicializa el contador del semáforo asignando el valor indicado. El valor inicial del contador debe ser mayor o igual que cero.
- Sem_wait(semaphore s): de manera atómica, espera a que el contador sea mayor que cero; cuando lo sea, decrementará el valor del contador (figura 11).
- Sem_signal(semaphore s): de manera atómica, incrementa el valor del contador asociado al semáforo (figura 12).
sem_wait (semaphore s) { while (s <= 0) /* atómicamente */ espera();
s = s - 1; }
Figura 11. Pseudo-código de sem_wait
Página 16
sem_signal (sempahore s) { s = s + 1; /* atómicamente */
}
Figura 12. Pseudo-código de sem_signal
Observaciones:
-
Existen dos tipos de semáforos en función del rango de valores que pueda alcanzar el contador asociado al semáforo: binarios (el contador sólo puede valer 0 o 1) y n-arios (el contador puede tomar cualquier valor mayor o igual que cero). Los semáforos binarios son los que implementan de modo más natural el acceso en exclusión mutua a una región crítica.
-
Cabe destacar que las operaciones realizan sus acciones de manera atómica. Supongamos que el contador asociado a un semáforo vale 0 y dos procesos están esperando haciendo un sem_wait a que el contador tome un valor mayor que cero. Si ahora algún proceso ejecuta un sem_signal sobre este semáforo e incrementa el contador del semáforo, únicamente uno de los procesos que ejecuta el sem_wait verá que el contador vale 1 y lo decrementará; el otro proceso deberá continuar esperando hasta que se realice otro sem_signal.
-
Si varios procesos están esperando haciendo un sem_wait a que el contador del semáforo tome un valor mayor que cero y algún proceso ejecuta un sem_signal sobre este semáforo, se plantea un problema de elección. ¿Cuál de los procesos en espera ha de ver este incremento del semáforo? Inicialmente, consideraremos que esta elección será aleatoria, pero más adelante volveremos sobre este tema.
-
Las operaciones básicas no devuelven cuál es el valor actual del contador asociado al semáforo. Algunas implementaciones de semáforos ofrecen una operación para obtener este valor pero en este documento no las consideraremos.
-
Los nombres de las operaciones sem_wait y sem_signal no son estándar. En la literatura o en implementaciones concretas podéis encontrar que la operación sem_wait se denomina P, down, signal, acquire o pend; la operación sem_signal se puede denominar V, up, wait, release o post. Es importante no confundir las llamadas al sistema UNIX wait y signal con las operaciones sobre semáforos wait y signal.
Página 17
Ver fragmento extraído sin normalizar
2.2.1. Definición de semáforo
Un semáforo es una variable (asumimos que es de tipo semaphore) que tiene
asociado un contador. El semáforo se manipula utilizando las tres operaciones
siguientes:
• sem_init(semaphore s, unsigned int valor): inicializa el contador
del semáforo asignando el valor indicado. El valor inicial del contador debe
ser mayor o igual que cero.
• Sem_wait(semaphore s): de manera atómica, espera a que el contador
sea mayor que cero; cuando lo sea, decrementará el valor del contador
(figura 11).
• Sem_signal(semaphore s): de manera atómica, incrementa el valor del
contador asociado al semáforo (figura 12).
sem_wait (semaphore s) {
while (s <= 0) /* atómicamente */
espera();
s = s - 1;
}
Figura 11. Pseudo-código de sem_wait
## Página 16
<!-- source-page: 16 -->
GNUFDL • PID_00214803 16 Comunicación y sincronización
sem_signal (sempahore s) {
s = s + 1; /* atómicamente */
}
Figura 12. Pseudo-código de sem_signal
Observaciones:
• Existen dos tipos de semáforos en función del rango de valores que pueda
alcanzar el contador asociado al semáforo: binarios (el contador sólo pue-
de valer 0 o 1) y n-arios (el contador puede tomar cualquier valor mayor o
igual que cero). Los semáforos binarios son los que implementan de modo
más natural el acceso en exclusión mutua a una región crítica.
• Cabe destacar que las operaciones realizan sus acciones de manera ató-
mica. Supongamos que el contador asociado a un semáforo vale 0 y dos
procesos están esperando haciendo un sem_wait a que el contador tome
un valor mayor que cero. Si ahora algún proceso ejecuta un sem_signal
sobre este semáforo e incrementa el contador del semáforo, únicamente
uno de los procesos que ejecuta el sem_wait verá que el contador vale 1
y lo decrementará; el otro proceso deberá continuar esperando hasta que
se realice otro sem_signal.
• Si varios procesos están esperando haciendo un sem_wait a que el conta-
dor del semáforo tome un valor mayor que cero y algún proceso ejecuta
un sem_signal sobre este semáforo, se plantea un problema de elección.
¿Cuál de los procesos en espera ha de ver este incremento del semáforo?
Inicialmente, consideraremos que esta elección será aleatoria, pero más
adelante volveremos sobre este tema.
• Las operaciones básicas no devuelven cuál es el valor actual del conta-
dor asociado al semáforo. Algunas implementaciones de semáforos ofre-
cen una operación para obtener este valor pero en este documento no las
consideraremos.
• Los nombres de las operaciones sem_wait y sem_signal no son estándar.
En la literatura o en implementaciones concretas podéis encontrar que la
operación sem_wait se denomina P, down, signal, acquire o pend;
la operación sem_signal se puede denominar V, up, wait, release
o post. Es importante no confundir las llamadas al sistema UNIX wait y
signal con las operaciones sobre semáforos wait y signal.
## Página 17
<!-- source-page: 17 -->
GNUFDL • PID_00214803 17 Comunicación y sincronización