Definición de Semáforos e implementación con espera activa.
Un mecanismo semáforo consta básicamente de dos operaciones primitivas señal (Signal) y espera (Wait) (Originalmente definidas como P y V por Disjkstra), que operan sobre un tipo especial de variable semáforo, “s”. La variable semáforo puede tomar valores enteros y, excepto posiblemente en su inicialización, solo puede ser accedida y manipulada por medio de las operaciones SIGNAL y WAIT. Ambas primitivas llevan un argumento cada una, la variable semáforo, y pueden definirse del modo siguiente..:
SIGNAL (s) ..:
Incrementa el valor de su argumento semáforo, s , en una operación indivisible.
WAIT (s) ..:
Decrementa el valor de su argumento semáforo, s , en tanto el resultado no sea negativo. La conclusión de la operación WAIT, una vez tomada la decisión de decrementar su argumento semáforo, debe ser individual.
Ejemplo..:
Wait(s): While not (s > 0 ) do {Seguir Probando};
S := s - 1;
Signal(s) s := s + 1;
Un semáforo cuya variable solo tiene permitido tomar los valores 0 (ocupado) y 1 (libre) se denomina Semáforo Binario. Un Semáforo General puede tomar cualquier valor entero.La lógica de las operaciones WAIT y SIGNAL aplica tanto para Semáforos Binarios como Semáforos Generales.
Propiedades
Los semáforos son un mecanismo relativamente sencillo pero poderoso de asegurar la exclusión mutua entre procesos concurrentes para acceder a un recurso compartido. En vez de que lo usuarios inventen sus propios protocolos de sincronización (tarea difícil y traicionera) los semáforos son una herramienta proporcionada por el diseñador de sistemas. Los usuarios solo necesitan contribuir a controlar el acceso a los recursos compartidos obedeciendo un protocolo estándar y sencillo.
Los semáforos pueden estar disponibles en un lenguaje de programación, como construcción del lenguaje, o como servicio del sistema operativo invocado mediante llamadas al sistema. Cuando son proporcionadas por el sistema operativo, las variables semáforos no son declaradas ni manipuladas en el lenguaje, sino que se manipulan a través de llamadas al sistemas tales como ..: CREAR_SEMAFORO, ASOCIAR_A_SEMAFORO, ESPERAR, SEÑAL, CERRAR_SEMAFORO.
Disciplina de Servicio de los Semáforos
La definición de semáforo con espera activa no impone la aplicación de ninguna ordenación a los procesos que esperan, existe, por tanto, una posibilidad de que un proceso pueda quedar bloqueado debido a la competencia con otros. Esta situación, en la cual algunos procesos progresan hacia su terminación pero uno o más procesos permanecen bloqueados fuera del recurso, se denomina Aplazamiento Indefinido. Este fenómeno también es conocido como Bloqueo Activo, y los procesos afectados se dicen que son Postergados. Para evitar bloqueos activos algunas implementaciones de semáforos obligan a aplicar una disciplina de servicio entre los procesos en espera.
La elección de una disciplina de servicio es muy importante ya que una disciplina sesgada puede posibilitar que un grupo de procesos conspire contra otros y usurpe permanentemente el recurso.
La postergación de procesos puede evitarse añadiendo el siguiente requisito a la implementación de semáforo ..: “Una petición para entrar a la sección critica debe ser concedida en tiempo finito”. Dada la suposición de que cada proceso tarda un tiempo finito en ejecutar la sección critica, este requisito puede sastifacerse utilizando la disciplina FIFO (First Input First Output - “Primero en entrar... Primero en Salir”) para elegir entre los procesos en espera. Este método garantiza la entrada a la sección critica en tiempo finito, como también es conocido como Implementación Estricta de Semáforos.
Implementación de Semáforos con Colas
La implemetación de los semáforos con espera activa tienen dos importantes desventajas .: el potencial aplazamiento indefinido y la baja eficiencia debido al consumo de ciclos de procesador por parte de procesos bloqueados. Aunque un proceso bloqueado no experimenta ningún proceso real, no obstante continua consumiendo recursos del sistema a causa de la espera activa. Tanto el bloqueo activo como la ineficaz espera activa pueden verse aliviados por la implementación de semáforos con cola.
Un proceso suspendido no consume ciclos de procesador, de modo que este método es potencialmente más eficiente que el de la espera activa.
Resumen
La sincronización entre procesos es necesaria para evitar error de temporización debido al acceso concurrente a recursos compartidos, tales como estructuras a datos o dispositivos de E/S, por parte de procesos competidores. La sincronización entre procesos también permite el intercambio de señales de temporización (Parar / Seguir) entre procesos cooperativos con el fin de preservar las relaciones especificadas de precedencia impuesta por el problema que se resuelva.
Los semáforos son un mecanismo de sincronización entre procesos simples pero potente basado en esta filosofía. Los semáforos satisfacen la mayoría de los extensos requisitos que hemos especificados para un buen mecanismo de control de concurrencia incluyendo la no existencia de suposiciones con respecto a las velocidades relativas ni la prioridades de los procesos competidores excepto que posiblemente existan.
De las estrategias para la implementación de semáforos, la implementación con cola facilita la eliminación del problema del aplazamiento indefinido y tiene una mayor eficiencia potencial que la implementación con espera activa.