Laboratorio 5

Continuamos con el tema de concurrencia. Pero en esta oportunidad en lugar de usar sólo semáforos ahora emplearemos monitores y el resto de constructores que proporciona JBACI.

El manual de C-- es bastante sencillo, después de leerlo trate de implementar los siguientes problemas clásicos usando monitores:

 - El problema del productor consumidor.
 - El problema los lectores y escritores.
 - El problema del barbero dormilón.
    
Adicionalmente resuelva los siguinetes problemas.

Gestión de un recurso con prioridades

Se dispone de un recurso compartido por un conjunto de procesos. Los procesos pueden solicitar el recurso con diferente urgencia: alta, media y baja. Mientras que el recurso esté ocupado, los procesos que lo soliciten deben esperar hasta que este se libere. Si el recurso está libre y no hay procesos esperando, se concede al primer proceso que lo solicite. Cuando el recurso se libere, si hay procesos esperando se concederá a uno de los procesos en espera con la prioridad más urgente.
Se pide escribir un monitor con operaciones para liberar y solicitar el recurso con diferentes prioridades y que se comporte segun se ha descrito previamente.

Problema de los canibales

Una tribu de N caníbales come de una gran marmita común que tiene una capacidad de M raciones de estofado de misionero. Cuando un caníbal quiere comer, se sirve él mismo de la marmita, a menos que esté vacía. Si la marmita está vacía, el caníbal despierta al cocinero y espera a que el cocinero haya rellenado la marmita. Cuando lo ha hecho, y antes de dejar comer a otro caníbal, come él mismo. Después de alguna otra actividad distinta, vuelve a querer comer. El cocinero, por su parte, vuelve a dormir cuando ha rellenado la marmita.

Se pide desarrollar un monitor (MARMITA) con dos procedimientos, uno para que coma un proceso caníbal (COMER) y otro para rellenar la marmita (RELLENAR). La solución debe evitar interbloqueos y debe despertar al cocinero sólo cuando la marmita esté vacía.

Problema de los cigarros y los fumadores

Se tiene un sistema con tres procesos fumadores y un progeso agente. Cada funador está continuamente enrrollando un cigarrillo y después se lo fuma. Para enrrollar y fumar un cigarrilo, el fumador necesita tres ingredientes: tabaco, papel y cerillas. Uno de los procesos fumadores tiene tabaco, otro papel y el tercero cerillas. El agente tiene una cantidad infinita de los tres materiales. El agente deja dos de los ingredientes en una mesa. El fumador que tiene el ingrediente que falta enrrolla y se fuma un cigarrillo, avisándole al agente cuando termina. Entonces, el agente pone otros dos de los tres ingredientes en la mesa y el ciclo se repite. Escribir un programa que sincronice al agente y a los fumadores.

Gestión de recursos

Se tiene un sistema concurrente en el que un conjunto de procesos realizan por petición tres tipos de servicios (S1, S2, S3). El sistema dispone de tres recursos (R1, R2, R3), que necesitan los procesos para ejecutar los servicios, según la relación siguiente:

Cuando se solicita un servicio a un proceso, en primer lugar, éste solicita todos los recursos necesarios y cuando los tiene asignados, ejecuta el servicio. Cuando deja de necesitar alguno de los recursos lo libera. No vuelve a aceptar una petición de servicio (y por tanto solicitar nuevos recursos) hasta que no haya terminado el previo, y por tanto, haya liberado todos los recursos asignados.

Se pide diseñar un monitor para gestionar los recursos, que proporcione sólo las dos operaciones siguientes: