Gestion de
Procesos

![]() Semáforo Función |
---|
![]() Semáforo Algoritmo |
![]() Semáforo |
![]() Exclusión de Semáforos |
¿ Que es un Semáforo ?
¿Semáforo?
Un semáforo es una variable especial que constituye el método clásico para restringir o permitir el acceso a recursos compartidos en un entorno de multiprocesamiento. Fueron inventados por Edsger Dijkstra en 1965 y se usaron por primera vez en el sistema operativo THEOS.
Los semáforos sólo pueden ser manipulados usando las siguientes operaciones:
Inicia(Semáforo s, Entero v) { s = v; }
En el que se iniciará la variable semáforo s a un valor entero v.
P(Semáforo s)
{ if(s>0) s = s-1; else wait(); }
La cual mantendrá en espera activa al regido por el semáforo si éste tiene un valor inferior o igual al nulo.
V(Semáforo s)
{ if(!procesos_bloqueados) s = s+1; else signal(); }
Estas instrucciones pueden modificarse para evitar la espera activa, haciendo que la operación P duerma al mismo proceso que la ejecuta si no puede decrementar el valor, mientras que la operación V despierta a un proceso que no es quien la ejecuta. En un pseudolenguaje más entendible, la operación P suele denominarse "wait" o "espera" y la operación V "signal" o "señal".
El porqué de los nombres de estas funciones, V y P, tiene su origen en el idioma holandés. "Verhogen" significa incrementar y "Proberen" probar.
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), y también son llamadas signl y wait.
Si hay n recursos, se inicializará el semáforo al número n. Así, cada proceso, al ir solicitando un recurso, verificará que el valor del semáforo sea mayor de 0; si es así es que existen recursos libres, seguidamente acaparará el recurso y decrementará el valor del semáforo.
Cuando el semáforo alcance el valor 0, significará que todos los recursos están siendo utilizados, y los procesos que quieran solicitar un recurso deberán esperar a que el semáforo sea positivo, esto es: alguno de los procesos que están usando los recursos habrá terminado con él e incrementará el semáforo con un signal o V(s).
Aplicaciones
Los semáforos se emplean para permitir el acceso a diferentes partes de programas (llamados secciones críticas) donde se manipulan variables o recursos que deben ser accedidos de forma especial. Según el valor con que son inicializados se permiten a más o menos procesos utilizar el recurso de forma simultánea.
Un tipo simple de semáforo es el binario, que puede tomar solamente los valores 0 y 1. Se inicializan en 1 y son usados cuando sólo un proceso puede acceder a un recurso a la vez. Son esencialmente lo mismo que los mutex.
Los semáforos pueden ser usados para diferentes propósitos, entre ellos:
-
Implementar cierres de exclusión mutua o locks.
-
Barreras.
-
Permitir a un máximo de N threads (hilos) acceder a un recurso, inicializando el semáforo en N.
-
Notificación. Inicializando el semáforo en 0 puede usarse para comunicación entre threads sobre la disponibilidad de un recurso.