Semáforo (informática)
Un semáforo es una variable protegida (o tipo abstracto de datos) que constituye el método clásico para restringir o permitir el acceso a recursos compartidos (por ejemplo, un recurso de almacenamiento) en un entorno de multiprocesamiento. Fueron inventados por Edsger Dijkstra y se usaron por primera vez en el sistema operativo T.H.E.
Los semáforos sólo pueden ser manipulados usando las operaciones siguientes:
P(Semaforo s) { while (s == 0) ; /* espera hasta que s>0 */ s = s-1; }
V(Semaforo s) { s = s+1; }
Inicia(Semaforo s, Entero v) { s = v; }
P y V tienen su origen en el holandés "Proberen", probar, y "Verhogen", incrementar. El valor del semáforo es el número de unidades del recurso que están disponibles. (Si sólo hay un recurso, se utiliza un "semáforo binario" con los valores 0 y 1). La operación P detiene la ejecución hasta que hay un recurso disponible, en cuyo caso lo reclama inmediatamente. V es la operación inversa; hace disponible un recurso después de que el proceso ha terminado de usarlo. Inicia se utiliza para inicializar el semáforo antes de que se hagan peticiones sobre él. Las operaciones P y V han de ser indivisibles, lo que quiere decir que cada una de las operaciones no puede ejecutarse múltiples veces de manera concurrente. Si un proceso desea ejecutar una operación que está siendo ejecutado por otro proceso debe esperar hasta que éste la finalice en primer lugar.
La operación V es denominada a veces "subir" el semáforo ("up") y la operación P se conoce también como "bajar" el semáforo ("down").
Para evitar la espera activa, un semáforo puede tener asociada una cola de procesos (normalmente una cola FIFO). Si un proceso efectúa una operación P en un semáforo que tiene valor cero, el proceso se añade a la cola del semáforo. Cuando otro proceso incrementa el semáforo mediante la operación V y hay procesos en la cola asociada, se extrae uno de ellos de la cola y reanuda su ejecución.