SINCRONIZACIÓN POR SEMÁFOROS
En 1965, E.W. Dijkstra sugirió el uso de una variable entera para contar el número de despertares almacenados para su uso posterior.
En su propuesta se presentó un nuevo tipo de variable, llamada Semáforo. Un semáforo puede tener el valor 0, lo que indica que no existen despertares almacenados; o bien algún valor positivo si están pendientes uno o más despertares.
Dijkstra, propuso dos operaciones, DOWN y UP (generalizaciones de SLEEP y WAKEUP, respectivamente). La operación Down verifica si el valor de un semáforo es mayor que 0. En este caso, decrementa el valor (es decir, utiliza un despertar almacenado) y continúa. Si el valor es cero, el proceso se va a dormir. La verificación y modificación del valor, así como la posibilidad de irse a dormir se realiza en conjunto, como una sola e indivisible acción atómica. Se garantiza que al iniciar una operación con un semáforo, ningún otro proceso puede tener acceso a semáforo hasta que la operación termine o se bloquee. Esta atomicidad es absolutamente esencial para resolver los problemas de sincronización y evitar condiciones de competencia.
La operación UP incrementa el valor del semáforo correspondiente. Si uno o más procesos dormían en ese semáforo y no podían completar una operación Down anterior, el sistema elige alguno de ellos (por ejemplo, en forma aleatoria) y se le permite terminar Down. Así, después de un UP en un semáforo con procesos durmiendo, el semáforo seguirá con valor cero, pero habrá un menor número de procesos durmiendo. La operación de incremento del semáforo y despertar de un proceso también es indivisible. Ningún proceso llega a bloquear mediante un UP.
Un semáforo es una variable protegida, cuyo valor sólo puede ser leído y alterado mediante las operaciones P y V, y una operación de asignación de valores iniciales y (Inicia semáforo).
TIPOS DE SEMÁFOROS
SEMÁFOROS BINARIOS (VALORES DE 1,0) SEMÁFOROS CONTADORES (Valores enteros no negativos)
Operación P (Sobre el semáforo S)
si S>0
entonces S:=S-1;
sino (esperar S)
Operación V (Sobre el semáforo S)
si (Uno o más procesos esperan S)
entonces (dejar que prosiga uno de esos procesos)
sino S:=S+1
La exclusión mutua sobre el semáforo S se implanta dentro de P(S) y V(S). Si varios procesos desean ejecutar una operación P(S) de manera simultánea , sólo se podrá ejecutar uno de ellos, pero esto no quiere decir que se aplazarán en forma indefinida.
checar http://www.frsn.utn.edu.ar/informatica01/Apuntes/sist_ope2.htm