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