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