MONITORES. Regiones críticas.

Anuncio
MONITORES. Regiones críticas.
Un monitor es una estructura formada por una cabecera que los identifica, un conjunto de variables globales a
todos los procedimientos del monitor, un conjunto de procedimientos y un bloque de inicialización, el cual se
ejecuta una única vez, cuando se crea el monitor.
{ nombre
{ variables globales accesibles desde todos los procedimientos
{ procedimiento A
{ procedimiento B
{
{ inicialización (solo se ejecuta una vez)
El recurso que queremos compartir (S.C.) se declara como monitor y en él se incluyen todas las operaciones
que afecten a dicho recurso. Los procesos que usan el monitor se sitúan de forma independiente y cuando
deseen usar el recurso, llamarán al procedimiento del monitor que implemente la operación que desea
ejecutar. Para resolver la sincronización se utilizan dos instrucciones, wait (bloquea siempre) y signal, y
actúan sobre variables condición que son colas y además no tienen valor.
• cwait (c): suspende la ejecución del proceso que llama bajo la condición c. El monitor está ahora
disponible para ser usado por otros procesos.
• csignal(c): reanuda la ejecución de algún proceso suspendido después de un cwait bajo la misma
condición. Si hay varios procesos, se elige uno de ellos; si no hay ninguno, no hace nada.
En el caso de que dentro de un monitor un proceso se quede bloqueado con un wait por lo cual se bloquea y
no dejaría ejecutarse a otro proceso, el SO despierta a otro proceso cuya última instrucción haya sido un signal
y además vale la condición que hace que se bloqueen los procesos.
Ejercicio de teoria práctica con monitores:
Monitor cajon monitor mesa
Procedure coger haysitio,haysobres:condition
Begin capacidad:integer
Coger_sobre procedure dejar_sobre_mesa
End begin
If sobres=capacidad
Procedure dejar hay_sitio.wait
1
Begin dejar_sobre_mesa_aux
Dejar en mesa sobres=sobres+1
End hay_sobre.signal
End
Procedure coger_sobre_mesa
Begin
If sobres=0 then
Haysobres.wait
Cogersobremesaaux
Sobres=sobres−1
Haysitio.signal
End
; Inicialización
begin
capacidad=10; sobres=0;
end
proceso p_practica proceso p_teoria
begin begin
while true do while true do
begin begin
mesa.coger_sobre_mesa cajon.coger
corregir20examenes corregir20ex
cajon.dejar meterensobre
end mesa.dejar_sobre_mesa
end end
end
2
* Ejercicio de las barcas y los coches.
Se tienen dos puentes levadizos separados 50 metros que cruzan un rio dos veces. Por el rio pasan barcas las
cuales tienen prioridad sobre los coches. Las barcas miden 100 metros.
Buscar una solucion usando monitores, teniendo las barcas prioridad y teniendo en cuenta que los puentes
bajan y suben a la vez.
Monitor puentes
Int numcoches
Bolean Pasando_barca, pasando_coche
Procedure entra_barca
If pasando_barca or pasando_coche or not EsVacia(cola_barcas) then
Colabarcas.wait
Pasando_barca=trae
Procedure entra_coche
If pasando_barca or not EsVacia(colabarcas) or not EsVacia(colacoches) then
Colacoches.wait
Pasando_coche=trae
Numcoches++
Procedure sale_barca
Pasando_barca=false
If not EsVacia(colabarcas) then
Colabarcas.signal
Else colacoches.signal
Procedure sale_coche
Numcoches
If numcoches=0 then pasandocoches=false
If not EsVacia(colabarcas) then
Colabarcas.signal
3
Else colacoches.signal
;Inicialización
numcoches=0; pasando_barca=false; pasando_coche=false
proceso coche [i] proceso barca [i]
puente.entra_coche puente.entra_barca
cruzar cruzar
puente.sale_coche puente.sale_barca
En una universidad se imparte una carrera. Hay alumnos de nuevo ingreso y alumnos nuevos. Solo hay una
secretaria la cual solo puede matricular a un alumno a la vez. Cuando un alumno comienza a matricularse no
es interrumpido hasta que finaliza su matriculación. Usando monitores, desarrollar una solución. Tienen
prioridad los alumnos de nuevo ingreso.
Monitor secretaria
Matriculando:bolean ;variable
Colanuevo,colaantiguo:vbles condicion
Procedure entra_nuevo
Begin
If matriculando or not EsVacia (cola_nuevos)
Cola_nuevo.wait
Matriculando=trae
End
Procedure entra_antiguo
Begin
If matriculando or not EsVacia (colanuevos) or not Espacia (colaantiguos)
Cola_antiguo.wait
Matriculando=trae
End
Procedure Sale_Alumno
If not Espacia(colanuevo)
4
Colanuevo.signal
Else
Colaantiguo.signal.
;Inicialización
matriculando=false
Proceso alumno_antiguo proceso alumno nuevo
Secretaria.entra_antiguo Secretaria.entra_nuevo
Matricularse Matricularse
Secretaria.sale_alumno Secretaria.sale_alumno
Monitores.
1
5
Descargar