Sie sind auf Seite 1von 6

Programacin Concurrente y Distribuida

Ingeniera Informtica
Facultad de Ciencias
Universidad de Cantabria.









Documento:
Versin bsica (secuencial) de la aplicacin Filsofos
chinos












Autor: Laura Barros


Fecha: 30/09/08
Cena de filsofos chinos

Se celebra una cena de cuatro
filsofos chinos. Son filsofos
porque durante la cena solo hacen
dos cosas: pensar y comer. Son
chinos porque comen con palillos, y
slo pueden comer si disponen de
los dos palillos que necesitan. En el
comedor hay una mesa en la que
cada filsofo tiene su puesto
asignado. Entre cada dos filsofos
hay un palillo que se comparte con
exclusin mutua entre ellos.
Alternativamente, los filsofos
piensan durante un cierto tiempo, y
luego tratan de comer, dirigindose
a su puesto de la mesa y esperando
que los dos palillos que le
corresponden estn libres. Cuando
los consigue, come durante un tiempo, y luego deja los palillos en la mesa y vuelve a
pensar.

Este sistema es un sistema concurrente compuesto por cuatro objetos activos, los
filsofos, y cuatro recursos compartidos, los palillos.

Patologas:
El problema presenta una posibilidad de bloqueo cuando los cinco filsofos se sientan y
simultneamente cogen el palillo de la derecha y permanecen a la espera de que el
palillo de la izquierda quede libre, lo cual nunca ocurrir.

Soluciones del bloqueo:
1) Introducir el concepto de silla, la cual debe ser requerida por cada filosofo al
mayordomo antes de sentarse a la mesa. Si el mayordomo solo proporciona 3 sillas,
se impide que los 4 filsofos se siente simultneamente, y con ello se evita el
bloqueo.
2) Introducir un filsofo zurdo, que primero coja el palillo de la izquierda y luego el de
la derecha.
3) Los filsofos no retienen un palillo si no consiguen tambin el otro inmediatamente.
En tal caso suelta el que haba conseguido y espera a que el que le falta quede libre.


Diseo base de la aplicacin

Clase PruebaSecuencial: Programa principal. Crea la lista de filsofos y el
Comedor. Por cada unos de los comensales, llama cada cierto tiempo a la funcin
actualiza() y termina().

Asociaciones:
listaFilosofos:Filosofo[] => Contiene los filsofos que participan en la
aplicacin.
elComedor:Comedor =>Contiene la instancia de comedor.
Mtodos:
main(args:String[]) =>Mtodo principal que lanza la ejecucin de la aplicacin

Clase Filsofo: Describe a un filsofo que alternativamente piensa y come.

Atributos:
state: EstadosFilosofo =>Estado en que se encuentra el filsofo.
id: int =>Identificador del filsofo. Es un entero entre 1 y el nmero de filsofos
que cenan. Se le asigna en su creacin, y no cambia en toda su vida.
tiempoEnEstado:int =>Tiempo en segundos que lleva el filsofo en el estado
actual.
terminado:bool =>Vale True si se ha ordenado al filsofo que termine la cena.

Asociaciones:
elComedor: Comedor =>El filsofo utiliza el comedor para:
- Localizar el gestor de sillas
- Localizar los palillos que le corresponden
- Para visualizar su estado
El comedor es asignado al filsofo en su creacin.

Constructor:
Filosofo(id:int,tiempoComida:int,elComedor:Comedor) => Constructor de las
instancias de filsofo. En su creacin al filsofo se le asigna:
- Su identidad que es un entero entre 1 y el nmero de platos que hay en
el comedor.
- El comedor del que recaba la informacin que necesita.
- El tiempo que utiliza en comer expresada en segundos. Se considera
que el filsofo piensa durante un tiempo que es el triple de lo que emplea
para comer.
El filosofo siempre se crea en el inicio de su estado PENSANDO.

Mtodos:
actualiza() =>El filsofo actualiza su estado. ste mtodo se utiliza slo en la
versin secuencial de la aplicacin.
termina() =>Se ordena al filsofo que termine la cena.


Comportamiento:



Nota: Para que el filsofo pueda abandonar la cena, debe que haber previamente dejado
los palillos y las sillas.


Clase Palillo: Describe los palillos del comedor.

Atributos:
id: int =>Identificador del palillo. Es un entero entre 1 y el nmero de platos.
Se le asigna en su creacin, y no cambia en toda su vida.
palilloTomado:Boolean =>Indica el estado del palillo. Vale True si el palillo ha
sido tomado por un filosofo.

Asociaciones:
elComedor: Comedor =>Da acceso al comedor. Lo utiliza el palillo para
representar su estado.

Constructor:
Palillo(id:int,elComedor:Comedor) =>Constructor de la instancia palillo. En su
creacin, al palillo se le asigna:
- Su identidad, que es un entero entre 1 y el nmero de palillos que hay
en el comedor.
-El Comedor, del que recaba la informacin que necesita.

Mtodos:
estaLibre():bool=>Indica que el palillo est libre.
coge() =>Lo invoca un filosofo cuando lo coge.
deja() =>Lo invoca un filosofo cuando lo deja.


Clase GestorSillas: Describe el Gestor de Sillas que utilizan los filsofos para coger
una silla para ponerse a comer.

Atributos:
sillasDisponibles: int =>Nmero de sillas disponibles.

Asociaciones:
elComedor: Comedor =>Da acceso al comedor. Es utilizado por el gestor de
silla para visualizar su estado.

Constructor:
GestorSillas(elComedor:Comedor) => Constructor de la instancia. En su
creacin se le asigna un comedor.

Mtodos:
cojoSilla() =>Lo invoca un filosofo cuando coge una silla.
dejaSilla() =>Lo invoca un filosofo cuando deja una silla..


Clase Comedor: Describe la mesa en la que cada filsofo tiene un puesto asignado.
Tambin gestiona la representacin grfica en la que se muestra la evolucin de los
distintos elementos. Esta clase no debe modificarse.

Atributos:
numPlatos: int =>Nmero de platos disponibles en el comedor. Es igual al
nmero de filsofos.
listaPalillos:Palillo[] =>lista de palillos.


Asociaciones:
elGestorSillas: GestorSillas =>Un comedor se compone de un gestor de
sillas. El GestorSillas utiliza el Comedor para mover las sillas.

Constructor:
Comedor(numeroPlatos:int) =>Constructor de la instancia. En su creacin se le
asigna un nmero de platos.

Mtodos:
numeroPlatos():int =>Devuelve el nmero de platos del comedor.
muevePalillo(in id:int, in puesto:boolean)=> Mueve palillo del comedor.
Necesita el identificador del palillo si est o no puesto.
mueveFilosofo(in id:int, in state:EstadoFilosofo)=>Mueve filsofo del comedor.
Debe conocer el identificador del filsofo y su estado.
mueveGestorSillas(in numSillas:int)=>Mueve el nmero de sillas indicado.
miPalilloDerecho(in filosofoId:int):Palillo=> Devuelve al filsofo el palillo
derecho que le corresponde.
miPalilloIzquierdo(in filosofoId:int):Palillo=> Devuelve al filsofo el palillo
izquierdo que le corresponde.
gestorSillas():GestorSillas=>Retorna el gestor de sillas.

Das könnte Ihnen auch gefallen