| ÷
|
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.
Un semáforo nos sirve para poder permitir o restringir a los
procesos o hilos el acceso a algún recurso compartido.
Los semáforos son una solución, de tipo soporte al sistema
operativo para garantizar la exclusión mutua.
Ê
Los semáforos pueden ser de 2 tipos: Binarios o Generales
(Contadores).
La operación de inicializador definirá si el semáforo será
binario o no, es decir, si se inicializa con 1, el semáforo será
binario ya que solo podrá manejar un recurso compartido, en
caso de tener ³N´ recursos compartidos se inicializara con
³N´.
Si tenemos ³N´ procesos inicializamos un semáforo para que
solo ³N´ procesos acceda a un recurso compartido.
Ê
h ÷
÷own (semaforo){ Up (semaforo){
if (semaforo > 0) if hay_proceso_bloqueado
semaforo=semaforo -1; despertar_el_proceso();
else else
bloquear_el_proceso(); semáforo = semáforo + 1;
} }
|
0 0
÷ !
"
÷os o mas procesos estan esperando por una condicion que solo
puede ser causada por una hebra que tambien esta esperando.
# $
Un proceso en la lista de espera de un semaforo de la cual estan
entrando y saliendo continuamente hebras y listas de espera de semaforo.
|
%&$
Los Filosofos Piensan
Los Filosofos Comen
± '
Los Filosofos ÷uermen
Variables:
Status [1..N] ü- P (pensando), H (hambriento)
» C(comiendo)
$
Exc_Mut ü-- Para Proteger a Status ÷
"
Sem[1..N] ü-- Control ÷e Filosofos
|
%&$
(
|
%&$
)
%&$
Filosofos(Integer i){ Tomar_Tenedores(Integer i){
Pensar(); ÷own(Exc_Mut);
Tomar_Tenedores(i); Status[i]=µH¶;
Comer(); Test=µH¶;
÷eja_Tenedores(i); Up(Exc_Mut);
÷ormir(); ÷own(Sema[i]);
} }
÷ejar_Tenedores(Integer i){
÷own(Exc_Mut); Test(Integer i){
Status[i]=µP¶; If(status[izq[i]]<>¶C¶ and
test(÷er(i)); status[÷er(i)]<>¶C¶ and
test(Izq(i)); Status[i]==µH¶){
Up(Exc_Mut); Status[i]=µC¶;
} Up(Sem[i]);
}
}
Productor y Consumidor
Program Productor_y_consumidor; Procedure Consumidor;
var critica,vacios,llenos:Semaforo; begin
Procedure Productor; while ejecucion do
begin begin
while ejecucion do P(Llenos);
begin P(Critica);
obtener_dato; Tomar_dato_buffer;
P(Vacios); V(Critica);
P(Critica); V(Vacios);
Introducir_dato_buffer; Utilizar_÷ato
V(Critica); end
V(Llenos); end;
end
end;
Productor y Consumidor
BEGIN (*principal*)
IniciaSemaforo (critica, 1);
IniciaSemaforo (vacios, n);
IniciaSemaforo (llenos, 0);
COBEGIN
Productor;
Consumidor;
COEN÷;
EN÷. (*PRO÷UCTOR_Y_CONSUMI÷OR*)
Barbero ÷ormilón
Program Barbero_÷ormilon; procedure cliente;
var barbero,cliente,critica:semaforo begin
Esperando:Integer P(critica);
Ejecucion:Boolean;
If esperando<Cantidad_Sillas;
Procedure Barbero;
then begin
begin
while ejecucion do
Esperando:=Esperando+1;
begin
P(clientes); V(clientes);
P(critica); V(critica);
Esperando=Esperando-1; P(barbero);
V(Barberos);
V(critica); Obtener_corte_de_pelo;
Cortar_el_pelo; end
end else V(critica);
end;
end;
Barbero ÷ormilón
BEGIN (*principal*)
IniciaSemaforo (clientes,0);
IniciaSemaforo (barbero,0);
IniciaSemaforo (critica,1);
COBEGIN
Barbero;
Clientes;
COEN÷
EN÷.
Problema
Cenicienta y el Príncipe se quieren divorciar. Para dividir sus propiedades,
han acordado el siguiente algoritmo. Cada mañana uno de ellos debe
enviar una carta al abogado del otro para solicitar un elemento de su
propiedad. Puesto que una carta tarda un día en ser entregada, han
acordado que si ambos descubren que han solicitado el mismo artículo el
mismo día, al día siguiente enviarán una carta para cancelar la solicitud.
Entre sus propiedades están su perro Woofer, su perrera, su canario Piolín
y la jaula del canario. Los animales aman sus casas, por lo cual han
acordado invalidar cualquier división de la propiedad que separe a un
animal de su casa, por lo que la división deberá volver a iniciarse desde
cero. Tanto Cenicienta como el príncipe desean de forma desesperada a
Woofer. Ambos se van de vacaciones (separados) y cada uno de ellos
programa una computadora personal para manejar la negociación. Al
regresar de sus vacaciones, las computadoras continúan negociando. ¿Por
qué? ¿Es posible el bloqueo? ¿Es posible la inanición? Explique.
Solución
Tanto Cenicienta como el Príncipe se pueden asociar con dos procesos de igual
prioridad que hacen petición de un conjunto de recursos (objetos de exclusión
mutua) que representan el perro, la perrera, el pájaro y su jaula. Las peticiones que
se efectúan por carta, son totalmente sincronías, por lo cual no hay forma de
determinar la prioridad de la petición según el orden de llegada. Como ambos
procesos piden primero al perro (desean de forma desesperada a Woofer)
Al efectuar ambos la petición del perro como primera petición, dicha solicitud será
cancelada al día siguiente como se acordó en un principio. En caso de que se
asigne el perro a cualquiera de los dos entes (procesos), existe la posibilidad de
que el otro proceso se adjudique la casa del mismo. Esta transacción se anulara
también, y se comenzara desde cero puesto que se acordó que no será valida
ninguna partición donde algún animal quede sin su casa. Al reiniciarse el algoritmo,
si no se usa un elemento aleatorio, existe el riesgo de interbloqueo, y por ende de
inanición.
Una posible solución es que las peticiones no sean síncronas, o que exista un
manejo de las prioridades de los procesos por parte del abogado (Sistema
Operativo) para la asignación de los recursos.