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:
- Para ejecutar S1 se necesita R1 y R2.
- Para ejecutar S2 se necesita R2 y R3.
- Para ejecutar S3 se necesita R3 y R1.
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:
- Solicitar_Recursos(S : T_Servicio): Esta operación permite a un
proceso solicitar los recursos necesarios para realizar un servicio. Si no
está disponible alguno de los recursos necesarios, se bloquea al proceso
solicitante hasta que los dos estén disponibles.
- Liberar_Recurso(R : T_Recurso): Esta operación libera uno
de los recursos necesarios para realizar un servicio. Se debe comprobar
si esta acción puede desbloquear a algún proceso.