Anda di halaman 1dari 15

EL PROBLEMA DE LOS

CANIBALES
LOS CANIBALES COMENSALES
INTRODUCCIN

En una tribu de canbales todos comen de la misma olla, la cual puede


albergar N raciones de comida. Cuando un canbal quiere comer,
simplemente se sirve de la olla comn, a no ser que est vaca. En ese
caso, el canbal despierta al cocinero de la tribu y espera hasta que ste
haya rellenado la olla.
EVENTOS SINCRONIZACIN

1. El canbal intenta obtener una racin.


Si un canbal que quiere comer se encuentra con la olla vaca, entonces
se lo notifica al cocinero para que ste cocine. 2. Si no hay raciones en la olla, el canbal despierta al cocinero.

Cuando el cocinero termina de cocinar, entonces se lo notifica al canbal 3. El cocinero cocina y rellena la olla.
que lo despert previamente.
4. El cocinero notifica al canbal.

5. El canbal come.
SOLUCIN
Un posible planteamiento para solucionar este problema podra girar en
torno al uso de un semforo que controlara el nmero de raciones
disponibles en un determinado momento (de manera similar al problema
del buffer limitado). Sin embargo, este planteamiento no facilita la
notificacin al cocinero cuando la olla est vaca, ya que no es deseable
acceder al valor interno de un semforo y, en funcin del mismo, actuar
de una forma u otra.
Una alternativa vlida consiste en utilizar el patrn marcador para
controlar el nmero de raciones de la olla mediante una variable
compartida. Si sta alcanza el valor de 0, entonces el canbal podra
despertar al cocinero.
SEMFOROS: ELEMENTOS

Num_Raciones, variable compartida que contiene el nmero de raciones


disponibles en la olla en un determinado instante de tiempo.
Mutex, semforo binario que controla el acceso a Num_Raciones.
Empty, que controla cuando la olla se ha quedado vaca.
Full, que controla cuando la olla est llena.
SEUDOCDIGO PROCESO COCINERO

En el siguiente listado se muestra el pseudocdigo del proceso cocinero, el cual es


muy simple ya que se basa en esperar la llamada del canbal, cocinar y notificar de
nuevo al canbal.
SEUDOCDIGO PROCESO CANIBAL

El pseudocdigo del proceso canbal es algo ms complejo, debido a que ha de


consultar el nmero de raciones disponibles en la olla antes de comer.
EXPLICACIN DEL PROCESO CANBAL
Como se puede apreciar, el proceso canbal comprueba el nmero de
raciones disponibles en la olla (lnea [4]). Si no hay, entonces despierta al
cocinero (lnea [5]) y espera a que ste rellena la olla (lnea [6]). Estos dos
eventos de sincronizacin guan la evolucin de los procesos involucrados.
Note cmo el proceso canbal modifica el nmero de raciones asignando un
valor constante. El lector podra haber optado porque fuera el cocinero el
que modificara la variable, pero desde un punto de vista prctico es ms
eficiente que lo haga el canbal, ya que tiene adquirido el acceso a la
variable mediante el semforo mutex (lnea [2] y [12]).
Posteriormente, el canbal decrementa el nmero de raciones (lnea [12]) e
invierte un tiempo en comer (lnea [14]).
MONITORES - EJEMPLO
Una tribu de N canbales come de una gran marmita comn con capacidad para 6
comensales simultneos.
Cuando un comensal quiere comer, come de la marmita, a menos que no haya
suficiente comida para l. Si no hay suficiente comida en la marmita, el canbal
despierta al cocinero y espera a que el cocinero haya rellenado la marmita con la carne
de los misioneros capturados (no debe haber notificaciones repetidas). Para rellenar la
marmita el cocinero debe esperar a que todos los comensales que se encuentran
actualmente comiendo terminen. El comensal que avis debe ser el primero en comer.
El cocinero, por su parte, vuelve a dormir cuando ha rellenado la marmita.
Cada cierto tiempo llega el jefe de la tribu el cual debe esperar que todos los
comensales terminen para comer solo, teniendo ste prioridad sobre los nuevos
comensales.
CONSIDERACIONES

No podrn entrar nuevos comensales a la marmita en las siguiente


situaciones:
El jefe est comiendo o esperando para comer.
El cocinero est rellenando o esperando para rellenar.
El jefe se comporta como un comensal ms para el cocinero y tambin
fue el primero en avisarle.
Se supone que la marmita llena dispone de comida para ms de seis
canbales.
FUNCIONES
Hay_suficiente_comida (): boolean
Esta funcin es ejecutada por los comensales (canbales y el jefe) retorna
si hay suficiente comida en la marmita. No puede ser ejecutada por dos o
ms comensales a la vez.
Rellenar (): Esta funcin es ejecutada por el cocinero.
Comer (): Es ejecutado por los comensales.
Ocio (): Ejecutada por los canbales y el jefe cuando no estn comiendo.
CDIGO