2. ¿Qué es?
Un semáforo es una variable especial que
constituye una serie de opciones elementales para
poder restringir o garantizar el acceso a los
recursos en un sistema operativo con un entorno
de multiprocesamiento (en el que se ejecutarán
varios procesos concurrentemente). Fueron
inventados por Edsger Dijkstra en 1965 y se
usaron por primera vez en el sistema
operativo THEOS.
3. • Un semáforo es una estructura diseñada para
sincronizar dos o más
threads o procesos, de modo que su ejecución se
realice de forma
ordenada y sin conflictos entre ellos.
4. Tipo de semáforos
Semáforo Contador:
Nos permiten llevar la cuenta del número de
unidades de recurso compartido disponible en
memoria, que va desde 0 hasta N.
• Semáforo de Espera:
Se emplea para forzar que un proceso pase a
estado bloqueado hasta que se cumpla la
condición que le permite ejecutarse. Por lo
general, el contador vale 0 inicialmente, no
obstante, podría tener un valor distinto de cero.
5. • Semáforo de exclusión mutua:
Inicialmente su contador vale 1 y permite que
haya un único proceso simultáneamente dentro de
la sección crítica.
Ventajas del uso de semáforos
La principal ventaja de los semáforos frente a los
cerrojos es que permiten sincronizar dos o más
procesos de manera que no se desperdician
recursos de CPU realizando comprobaciones
continuadas de la condición que permite
progresar al proceso.
6. • Desventajas del uso de semáforos
Mal uso por parte de los programadores.
No hay nada que obligue a los programadores a
usarlos.
Los compiladores no ofrecen ningún mecanismo
de comprobación sobre el correcto uso de los
semáforos.
Son independientes del recurso compartido al
que se asocian.
7. • El por qué no se pueden usar directamente otras estructuras mas
clásicas, como por ejemplo usar una variable común para decidir si
se
puede o no acceder a un recurso, se debe a que estamos en un
sistema
multitarea: hacer esto implicaría realizar una espera activa
(un bucle, comprobando constantemente si la variable está o no a 0,
y así saber si podemos seguir ejecutando o no). Por otro lado, puede
ocurrir algo mucho peor: supongamos que un proceso comprueba la
variable, y ve que el recurso está libre, por lo que procedería a
cambiar dicha variable de valor y seguir. Pues bien, si justo después
de la comprobacion pero antes de que cambie el valor se conmuta de
tarea (puede pasar, pues el sistema operativo puede hacerlo en
cualquier momento), y el nuevo proceso comprueba la variable,
como
todavía no se ha actualizado, creerá que el recurso está libre,
e intentará tomarlo, haciendo que ambos programas fallen. Lo peor
del caso es que se tratará de un error aleatorio: unas veces fallará
(cuando se produzca cambio de tarea en ese punto) y otras no.
Ejemplo
8. • Para evitarlo, se idearon los semáforos. Un
semáforo básico es una
estructura formada por una posición de
memoria y dos instrucciones,
una para reservarlo y otra para liberarlo. A esto
se le puede añadir
una cola de threads para recordar el orden en
que se hicieron las
peticiones.