TPNº 11 - Resolución del Problema de los Filósofos Comensales

Anuncio
INGENIERIA INFORMATICA
LICENCIATURA EN SISTEMAS
FACULTAD DE INGENIERIA
UNIVERSIDAD NACIONAL DE JUJUY
Trabajo Práctico Nº11
Temas: Resolución del Problema de los Filósofos Comensales usando Pascal Concurrente
Dado el siguiente Problema de los Filósofos Comensales con las características descriptas a continuación:
‰ Cinco filósofos chinos que pueden estar en dos estados únicamente:
¾ Pensando
¾ Cenando
‰ Para comer deben sentarse en una mesa (donde hay un sitio reservado para cada uno).
‰ Entre cada par de posiciones de la mesa hay un palillo (por lo tanto son cinco palillos en total).
‰ Para comer cada filósofo debe tener dos palillos. Sólo usan los palillos a cada lado de su posición.
‰ Consecuentemente, un filósofo no puede comer concurrentemente con su vecino
‰ Los filósofos son entidades activas (procesos) y los palillos son entidades pasivas.
Plantee dos soluciones en Pascal Concurrente, una usando variables compartidas y otra con semáforos
TP11-Año 2.010 Modelos de Desarrollo de Programas y Programación Concurrente
1
INGENIERIA INFORMATICA
LICENCIATURA EN SISTEMAS
FACULTAD DE INGENIERIA
UNIVERSIDAD NACIONAL DE JUJUY
Trabajo Práctico Nº11
Temas: Resolución del Problema de los Filósofos Comensales usando Pascal Concurrente
Dado el siguiente Problema de los Filósofos Comensales con las características descriptas a continuación:
‰ Cinco filósofos chinos que pueden estar en dos estados únicamente:
¾ Pensando
¾ Cenando
‰ Para comer deben sentarse en una mesa (donde hay un sitio reservado para cada uno).
‰ Entre cada par de posiciones de la mesa hay un palillo (por lo tanto son cinco palillos en total).
‰ Para comer cada filósofo debe tener dos palillos. Sólo usan los palillos a cada lado de su posición.
‰ Consecuentemente, un filósofo no puede comer concurrentemente con su vecino
‰ Los filósofos son entidades activas (procesos) y los palillos son entidades pasivas.
1)
Indicar en que caso se da la Exclusión Mutua
Exclusión mutua: cada palillo puede únicamente ser usado por un filósofo (proceso) en un momento dado.
2)
Señale cual será la Sincronización Condicional
Sincronización condicional: un filósofo no puede comer hasta que haya cogido dos palillos.
3)
Mencione cuales serán las variables compartidas y el/los requisitos para compartirlas
Comunicación mediante variable compartida: cada palillo puede ser representado mediante una variable que
comparten filósofos adyacentes.
4)
Justifique si se usarán mensajes. En caso de afirmativo mencione que se comunicará en cada
mensaje
Comunicación por paso de mensajes: los palillos podrían ser pasados directamente de un filósofo a otro.
5)
Especifique en que caso se dará una Espera Ocupada
Espera ocupada: un filósofo sin acceso a un palillo puede examinar continuamente si un vecino ha terminado su
cena.
6)
Especifique en que caso se dará una Espera Bloqueada
Espera bloqueada: un filósofo sin acceso a un palillo puede irse a dormir y encargar al vecino que lo despierte
cuando el palillo está libre.
7)
Plantee tres posibles soluciones (en forma general) para el siguiente problema
Espera activa: una solución de la forma “coger el palillo derecho y espera ocupada hasta disponibilidad del
palillo izquierdo” llevará a livelock si todos los filósofos simultáneamente cogen un palillo.
Interbloqueo: una solución de la forma “coger el palillo derecho y dormir hasta que el izquierdo esté libre”
evitará el progreso de la aplicación si todos los filósofos actúan simultáneamente.
Aplazamiento indefinido: dos filósofos pueden matar de inanición a otro filósofo situado entre ambos si siempre
uno de ellos al menos está comiendo.
8)
Plantee una solución en Pascal Concurrente
program filosofos;
repeat
sleep(random(10)); (*PENSAR*)
const N=5;
pal_cogido := false;
var palillos: array[1..N] of boolean;
I: integer;
repeat
coger_palillo(palillos[pal1], pal_cogido);
procedure coger_palillo(var pal:boolean;
until pal_cogido;
var cogido:boolean);
pal_cogido:=false;
begin
(*coger el palillo si esta disponible*)
repeat
coger_palillo(palillos[pal2], pal_cogido);
(*si disponible cogido:=true*)
until pal_cogido;
(*de otro modo cogido:=false*)
sleep(random(10)); (*COMER*)
end;
dejar_palillo(palillos[pal1]);
procedure dejar_palillo(var pal:boolean);
dejar_palillo(palillos[pal2]);
begin
(*dejar el palillo*)
forever
end;
end;
var filos:array [1..N] of filosofos;
process type filosofos(nombre:integer);
var I: integer;
begin
for I:=1 to N do palillos[I]:= true;
pal1,pal2: integer;
pal_cogido: boolean;
cobegin
for I:= 1 to N do filos[I](I);
begin
pal1 := nombre;
coend
end.
if name = N then pal2:=1 else pal2:= name+1;
TP11-Año 2.010 Modelos de Desarrollo de Programas y Programación Concurrente
2
Descargar