Académique Documents
Professionnel Documents
Culture Documents
Editar
Semforo
Es una variable numrica entera de tipo protegida (slo la maneja el sistema operativo), que se
manipula a travs de operaciones atmicas bien definidas.
Los semforos se emplean para permitir el acceso a diferentes partes de programas
(llamados secciones crticas) donde se manipulan variables o recursos que deben ser
accedidos de forma especial. Segn el valor con que son inicializados se permiten a ms o
menos procesos utilizar el recurso de forma simultnea.
Caracteristicas
WAIT
Pregunta a los procesos si su contador es > = que cero, en caso de no ser as, los
decrementa. El proceso que cambia en este caso a negativo (1) desde la cola de procesos
Listos a ser ejecutados es el que automticamente toma el control del procesador.
WAIT = DOWN = P(S): while S < = 0 do;
S:=S-1
SIGNAL
A partir de un tiempo t definido por el despachador se ejecuta, y pregunta a los procesos si su
contador es < que cero en caso de que sea afirmativa la respuesta, saca a este proceso de su
ejecucin y depende de su estado.
SIGNAL = UP = V(S): S:=S+1
Uso del semforo para el manejo de secciones criticas
Procedure proceso_dos;
begin
while Ejecucion do
begin
Actividades_preliminares_dos;
P(Activo);
Seccion_critica_dos;
V(Activo);
otras_actividades_dos;
end
end;
BEGIN
IniciaSemaforo(Activo,1);
COBEGIN
Proceso_uno;
Proceso_dos;
COEND
END.
Problema del Barbero Dormiln
IniciaSemaforo (barbero,0);
IniciaSemaforo (critica,1);
COBEGIN
Barbero;
Clientes;
COEND
END.
Semforo (informtica)
Un semforo es una variable especial (o tipo abstracto de datos) que constituye el mtodo clsico
para restringir o permitir el acceso a recursos compartidos (por ejemplo, un recurso de
almacenamiento del sistema o variables del cdigo fuente) en un entorno de multiprocesamiento (en
el que se ejecutarn varios procesos concurrentemente). Fueron inventados por Edsger Dijkstra en
1965 y se usaron por primera vez en el sistema operativo THEOS.
ndice
[ocultar]
1 Operaciones
2 Usos
3 Ejemplo de uso
4 Vase tambin
5 Enlaces externos
Inicia(Semforo s, Entero v)
{
s = v;
}
En el que se iniciar la variable semforo s a un valor entero v.
P(Semforo s)
{
if(s>0)
s = s-1;
else
wait();
}
La cual mantendr en espera activa al regido por el semforo si ste tiene un valor inferior o igual al
nulo.
V(Semforo s)
{
if(!procesos_bloqueados)
s = s+1;
else
signal();
}
Estas instrucciones pueden modificarse para evitar la espera activa, haciendo que la operacin P
duerma al mismo proceso que la ejecuta si no puede decrementar el valor, mientras que la
operacin V despierta a un proceso que no es quien la ejecuta. En un pseudolenguaje ms
entendible, la operacin P suele denominarse "wait" o "espera" y la operacin V "signal" o "seal".
El porqu de los nombres de estas funciones, V y P, tiene su origen en el idioma holands.
"Verhogen" significa incrementar y "Proberen" probar, aunque Dijkstra us la palabra
inventada prolaag [1], que es una combinacin de probeer te verlagen (intentar decrementar). El
valor del semforo es el nmero de unidades del recurso que estn disponibles (si slo hay un
recurso, se utiliza un "semforo binario" cuyo valor inicial es 1).
La verificacin y modificacin del valor, as como la posibilidad de irse a dormir (bloquerse) se
realiza en conjunto, como una sola e indivisible accin atmica. El sistema operativogarantiza que al
iniciar una operacin con un semforo, ningn otro proceso puede tener acceso al semforo hasta
que la operacin termine o se bloquee. Esta atomicidad es absolutamente esencial para resolver los
problemas de sincronizacin y evitar condiciones de competencia.
Si hay n recursos, se inicializar el semforo al nmero n. As, cada proceso, al ir solicitando un
recurso, verificar que el valor del semforo sea mayor de 0; si es as es que existen
recursos libres, seguidamente acaparar el recurso y decrementar el valor del semforo.
Cuando el semforo alcance el valor 0, significar que todos los recursos estn siendo utilizados, y
los procesos que quieran solicitar un recurso debern esperar a que el semforo sea positivo, esto
es: alguno de los procesos que estn usando los recursos habr terminado con l e incrementar el
semforo con un signal o V(s).
Inicia se utiliza para inicializar el semforo antes de que se hagan peticiones sobre l, y toma por
argumento a un entero. La operacin P cuando no hay un recurso disponible, detiene la ejecucin
quedando en espera activa (o durmiendo) hasta que el valor del semforo sea positivo, en cuyo
caso lo reclama inmediatamente decrementndolo. V es la operacin inversa: hace disponible un
recurso despus de que el proceso ha terminado de usarlo. Las operaciones P y V han de ser
indivisibles (o atmicas), lo que quiere decir que cada una de las operaciones no debe ser
interrumpida en medio de su ejecucin.
Barreras
En el siguiente ejemplo se crean y ejecutan n procesos que intentarn entrar en su seccin crtica
cada vez que puedan, y lo lograrn siempre de a uno por vez, gracias al uso del semforo s
inicializado en 1. El mismo tiene la misma funcin que un lock.
const int n
/* nmero de procesos */
void P (int i)
{
while (cierto)
{
P(s)
V(s)
ndice
[ocultar]
3 Vase tambin
4 Enlaces externos
Si todos los filsofos toman el tenedor que est a su derecha al mismo tiempo, entonces todos se
quedarn esperando eternamente, porque alguien debe liberar el tenedor que les falta. Nadie lo
har porque todos se encuentran en la misma situacin (esperando que alguno deje sus tenedores).
Entonces los filsofos se morirn de hambre. Este bloqueo mutuo se denomina interbloqueo
o deadlock.
El problema consiste en encontrar un algoritmo que permita que los filsofos nunca se mueran de
hambre.
Se empieza por un filsofo, que si quiere puede comer y despus pasa su turno al de la derecha.
Cada filsofo slo puede comer en su turno. Problema: si el nmero de filsofos es muy alto, uno
puede morir de hambre antes de su turno.
Varios turnos
Se establecen varios turnos. Para hacerlo ms claro supongamos que cada filsofo que puede
comer (es su turno) tiene una ficha que despus pasa a la derecha. Si por ejemplo hay 7
comensales podemos poner 3 fichas en posiciones alternas ( entre dos de las fichas quedaran dos
filsofos).
Se establecen turnos de tiempo fijo. Por ejemplo cada 5 minutos se pasan las fichas (y los turnos) a
la derecha.
En base al tiempo que suelen tardar los filsofos en comer y en volver a tener hambre, el tiempo de
turno establecido puede hacer que sea peor solucin que la anterior. Si el tiempo de turno se
aproxima al tiempo medio que tarda un filsofo en comer esta variante da muy buenos resultados. Si
adems el tiempo medio de comer es similar al tiempo medio en volver a tener hambre la solucin
se aproxima al ptimo.
Colas de tenedores
Cuando un filsofo quiere comer se pone en la cola de los dos tenedores que necesita. Cuando un
tenedor est libre lo toma. Cuando toma los dos tenedores, come y deja libre los tenedores.
Visto desde el otro lado, cada tenedor slo puede tener dos filsofos en cola, siempre los mismos.
Esto crea el problema comentado de que si todos quieren comer a la vez y todos empiezan tomando
el tenedor de su derecha se bloquea el sistema (deadlock).
Cada vez que un filsofo tiene un tenedor espera un tiempo aleatorio para conseguir el segundo
tenedor. Si en ese tiempo no queda libre el segundo tenedor, suelta el que tiene y vuelve a
ponerse en cola para sus dos tenedores.
Si un filsofo A suelta un tenedor (porque ha comido o porque ha esperado demasiado tiempo con el
tenedor en la mano) pero todava desea comer, vuelve a ponerse en cola para ese tenedor. Si el
filsofo adyacente B est ya en esa cola de tenedor (tiene hambre) lo toma y si no vuelve a cogerlo
A.
Es importante que el tiempo de espera sea aleatorio o se mantendr el bloqueo del sistema.
Se indica a los filsofos que abandonen la mesa cuando no tengan hambre y que no regresen a ella
hasta que vuelvan a estar hambrientos (cada filsofo siempre se sienta en la misma silla). La misin
del portero es controlar el nmero de filsofos en la sala, limitando su nmero a n-1, pues si hay n-1
comensales seguro que al menos uno puede comer con los dos tenedores.