Problema 3 (32 puntos) **************************** Se desea implementar la consulta y actualización de los registros de la base de datos de estudiantes de la Facultad de Ingeniería. Hay un grupo de 5 funcionarios que consultan los registros de la base en busca de errores en lotes de 100 registros (compartido entre los 5 funcionarios). Si encuentran un error en un registro deben actualizar el mismo con la información corregida. Se debe permitir que varios funcionarios consulten a la vez el mismo registro. Un funcionario que quiere modificar un registro deberá tener prioridad sobre los que quieren leerlo. Un funcionario A no podrá modificar un registro que haya sido registroModificado por otro funcionario B luego de la lectura de A; en ese caso deberá volver a leer y verificar nuevamente el registro. Un supervisor cambiará el lote de 100 registros periódicamente, para lo cual ningún funcionario deberá estar usando el lote. El supervisor tendrá prioridad sobre los funcionarios para el acceso al lote. Se dispone de las siguientes funciones: • que_registro():{1..100}, que ejecutado por un funcionario retorna el número de registro a verificar. • verificar(int: registro):boolean, que ejecutado por un funcionario retorna si el registro indicado debe ser registroModificado • modificar(int: registro), que ejecutado por un funcionario actualiza el registro con la información corregida • cambiar_lote(), que ejecutado por el supervisor cambia el lote de registros • otras_tareas_supervisor(), que ejecutado por el supervisor realiza otras tareas luego de cambiar de lote de registros Implementar utilizando monitores las tareas Funcionario y Supervisor. No se permiten tareas auxiliares. ******************************* PROGRAMA FACULTAD TYPE Lote = monitores VAR modificar[1..100], leer, supervisor condition; cambiarLote boolean = true; modificandoRegistro array [1..100] of boolean = false; registroModificado[1..100] of int = 0; int cantLeyendo = 0; PROCEDURE ENTRY LeerRegistro( registro) IF cambiarLote or !modificar[registro].emtpy then leer.wait; END IF; cantLeyendo = cantLeyendo + 1; END ----------------------------------------------------------- PROCEDURE ENTRY finLeerRegistro( registro) cantLeyendo = cantLeyendo - 1; IF cambiarLote THEN supervisor.signal; END IF END ------------------------------------------------------------ PROCEDURE ENTRY modificar( registro:in int; numFunc:in int ; ok: OUT boolean) BEGIN if modificandoRegistro[registro] then // mientras alguien este modificandoRegistro pongo las nuevas solicitudes a dormir modificar[registro].wait; end if; IF registroModificado[registro] == 0 OR registroModificado[registro] == numFunc THEN // nadie lo modifico desde la ultima vez que lo lei modificandoRegistro[registro] = true; registroModificado[registro] = numFunc; OK = TRUE; ELSE // fue modificado desde la ultima vez que lo lei OK = FALSE registroModificado[registro] = numFunc; END IF; END ---------------------------------------------------------- PROCEDURE finModificar (registro) BEGIN modificandoRegistro[registro] = false; if !modificar[registro].emtpy then. // SI HAY ALGUIEN ESPERANDO PARA MODIFICAR ESTE REGISTRO LO DESPIERTO modificar[registro].signal; else if !cambiarLote then // SI NO HAY NADIE ESPERANDO PARA MODIFICAR NI SE QUIERE CAMBIAR EL LOTE, DESPIERTO A LOS LECTORES. leer.signal(); leer.signal(); leer.signal(); leer.signal(); leer.signal(); END IF END IF END ---------------------------------------------------------- PROCEDURE ENTRY cambiarLote () BEGIN cambiarLote = true; if cantLeyendo > 0 THEN supervisor.wait; end if; END ----------------------------------------------------------- PROCEDURE ENTRY finCambiarLote() BEGIN cambiarLote = false; leer.signal(); leer.signal(); leer.signal(); leer.signal(); leer.signal(); END **************************************************************** PROCEDURE Funcionario (int numFunc) Boolean OK; BEGIN WHILE TRUE DO Int registro = que_registro(); Lote.leerRegistro(registro); while Verificar(registro) then Lote.modificar(registro,numFunc,ok) If (OK) then Modificar(registro); Lote.finModificar(registro); End if; end while; Lote.finLeerRegistro(); END WHILE End **************************************************************** PROCEDURE Supervisor BEGIN WHILE TRUE DO Lote.cambiarLote(); cambiar_lote(); Lote.finCambiarLote(); otras_tareas_supervisor(); end while End BEGIN COBEGIN Supervisor(); funcionario(1); funcionario(2); funcionario(3); funcionario(4); funcionario(5); COEND End ***************************************************************** TYPE