Ingeniero Técnico en Informática de Sistemas


Monitores


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

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

* 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

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)

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




Descargar
Enviado por:Fifo
Idioma: castellano
País: España

Te va a interesar