E. U. de Informática Examen Final de Sistemas Operativos I Departamento de Informática Aplicada 19 de Septiembre de 2000 Apellidos ......................................................................................................................... Nombre ........................................................................................................................... Nº de Matrícula ................................ EJERCICIO 3 (4 puntos) Nº Orden S.O. I Tiempo estimado: 75 min. Dado que el mecanismo de los semáforos requiere de la existencia de variables compartidas, su utilización se limita a sistemas con memoria común con uno o varios procesadores. Esto no impide que el comportamiento abstracto de los semáforos pueda simularse en cualquier sistema operativo multiproceso. La simulación consistiría en implementar el tipo de datos Semáforo y las llamadas al sistema INIT, SUBIR y BAJAR haciendo uso de las llamadas al sistema disponibles en el sistema operativo en cuestión. Se pide: Exponer de manera convincente (sin que sea imprescindible llegar al nivel de codificación en un lenguaje de programación) cómo podría simularse el mecanismo de comunicación mediante semáforos en un sistema operativo multiproceso sin memoria compartida, con sistema de comunicación por paso de mensajes, con comunicación directa y asimétrica, y siendo los buzones de capacidad nula. Además siendo fijo el tamaño de los mensajes, de forma que cada mensaje permite tan sólo la transmisión de un único número entero. La idea de partida a desarrollar es que cada vez que se crea un semáforo (llamada al sistema INIT) debe crearse un proceso nuevo que gestiona internamente una variable contador. En las llamadas al sistema SUBIR y BAJAR se deberán realizar, haciendo uso del sistema de paso de mensajes, las peticiones adecuadas al proceso gestor del semáforo, quien deberá estar programado para servirlas de la forma adecuada. E. U. de Informática Departamento de Informática Aplicada Examen Final de Sistemas Operativos I EJERCICIO 3 19 de Septiembre de 2000 HOJA DE RESPUESTAS Paso 1) Implementación del tipo Semáforo. Indica qué tipo de datos utilizarías para implementar el tipo Semáforo, partiendo tan solo de los tipos de datos que se encuentran en cualquier sistema operativo multiproceso. Paso 2) Implementación de la llamada al sistema: INIT ( Sem : out Semáforo ; N : in NATURAL ) Supóngase que el código del proceso gestor del semáforo (que habrá que determinar en el Paso 5) está incluido en un procedimiento sin parámetros denominado ServidorDeSemáforo, y que lo primero que hace ese procedimiento es recibir un mensaje que le indica el valor N con el cual debe inicializar una variable local que juega el papel de contador del semáforo. Supóngase que la forma de la llamada al sistema CrearProceso disponible en el sistema operativo es la siguiente: CrearProceso ( P : in ProcedimientoSinParámetros ) RETURN IdProceso ; y que la forma de las primitivas de envío y recepción (simétrica y asimétrica) de mensajes es: Enviar ( IdP : in IdProceso ; Mensaje : in INTEGER ) ; Recibir ( IdP : in IdProceso ; Mensaje : out INTEGER ) ; -- simétrica RecibirAny ( IdP : out IdProceso ; Mensaje : out INTEGER ) ;-- asimétrica Paso 3) Implementación de la llamada al sistema: SUBIR ( Sem : in out Semáforo ) Paso 4) Implementación de la llamada al sistema: BAJAR ( Sem : in out Semáforo ) Paso 5) Implementación del procedimiento sin parámetros ServidorDeSemáforo No hay que olvidarse de declarar las variables y estructuras de datos locales utilizadas. En caso de tener que manejar colas de (identificadores de) procesos supóngase que está disponible el tipo de datos ColaDeProcesos, con las operaciones: EstáVacía ( C : in ColaDeProcesos ) RETURN BOOLEAN ; MeterEnCola ( IdP : in IdProceso ; C : in out ColaDeProcesos ) ; SacarDeCola ( IdP : out IdProceso ; C : in out ColaDeProcesos ) ; La declaración de una variable de tipo ColaDeProcesos inicializa automáticamente dicha variable como una cola de procesos vacía. E. U. de Informática Examen Final de Sistemas Operativos I Departamento de Informática Aplicada 19 de Septiembre de 2000 Apellidos ......................................................................................................................... Nombre ........................................................................................................................... Nº de Matrícula ................................ EJERCICIO 3 (4 puntos) Nº Orden S.O. I Tiempo estimado: 75 min. Dado que el mecanismo de los semáforos requiere de la existencia de variables compartidas, su utilización se limita a sistemas con memoria común con uno o varios procesadores. Esto no impide que el comportamiento abstracto de los semáforos pueda simularse en cualquier sistema operativo multiproceso. La simulación consistiría en implementar el tipo de datos Semáforo y las llamadas al sistema INIT, SUBIR y BAJAR haciendo uso de las llamadas al sistema disponibles en el sistema operativo en cuestión. Se pide: Exponer de manera convincente (sin que sea imprescindible llegar al nivel de codificación en un lenguaje de programación) cómo podría simularse el mecanismo de comunicación mediante semáforos en un sistema operativo multiproceso sin memoria compartida, con sistema de comunicación por paso de mensajes, con comunicación directa y asimétrica, y siendo los buzones de capacidad nula. Además siendo fijo el tamaño de los mensajes, de forma que cada mensaje permite tan sólo la transmisión de un único número entero. La idea de partida a desarrollar es que cada vez que se crea un semáforo (llamada al sistema INIT) debe crearse un proceso nuevo que gestiona internamente una variable contador. En las llamadas al sistema SUBIR y BAJAR se deberán realizar, haciendo uso del sistema de paso de mensajes, las peticiones adecuadas al proceso gestor del semáforo, quien deberá estar programado para servirlas de la forma adecuada. E. U. de Informática Departamento de Informática Aplicada Examen Final de Sistemas Operativos I EJERCICIO 3 19 de Septiembre de 2000 HOJA DE RESPUESTAS Paso 1) Implementación del tipo Semáforo. Indica qué tipo de datos utilizarías para implementar el tipo Semáforo, partiendo tan solo de los tipos de datos que se encuentran en cualquier sistema operativo multiproceso. Está claro que a cada semáforo hay que asociarle un proceso, que queda completamente determinado por su identificador de proceso. Dado que el contador y la cola de procesos del semáforo pueden ponerse como variables locales del proceso asociado al semáforo, la implementación quedaría: type Semáforo is IdProceso ; Paso 2) Implementación de la llamada al sistema: INIT ( Sem : out Semáforo ; N : in NATURAL ) Supóngase que el código del proceso gestor del semáforo (que habrá que determinar en el Paso 5) está incluido en un procedimiento sin parámetros denominado ServidorDeSemáforo, y que lo primero que hace ese procedimiento es recibir un mensaje que le indica el valor N con el cual debe inicializar una variable local que juega el papel de contador del semáforo. Supóngase que la forma de la llamada al sistema CrearProceso disponible en el sistema operativo es la siguiente: CrearProceso ( P : in ProcedimientoSinParámetros ) RETURN IdProceso ; y que la forma de las primitivas de envío y recepción (simétrica y asimétrica) de mensajes es: Enviar ( IdP : in IdProceso ; Mensaje : in INTEGER ) ; Recibir ( IdP : in IdProceso ; Mensaje : out INTEGER ) ; -- simétrica RecibirAny ( IdP : out IdProceso ; Mensaje : out INTEGER ) ;-- asimétrica PROCEDURE INIT ( Sem : out Semáforo ; N : in NATURAL ) BEGIN Sem := CrearProceso(ServidorDeSemáforo) ; Enviar(Sem, N) ; END INIT ; Paso 3) Implementación de la llamada al sistema: SUBIR ( Sem : in out Semáforo ) Vamos a emplear un mensaje especial para solicitar al proceso que gestiona el semáforo que realice las operaciones correspondientes a un SUBIR. En nuestro caso es apropiado que ese mensaje sea –1, por lo que definiríamos a nivel global la constante: MsgSUBIR : constant INTEGER := -1 ; PROCEDURE SUBIR (Sem : in out Semáforo ) ; BEGIN Enviar(Sem, MsgSUBIR) ; END SUBIR ; Paso 4) Implementación de la llamada al sistema: BAJAR ( Sem : in out Semáforo ) Igual que en para SUBIR, se define un tipo de mensaje especial con el fin de solicitar al servidor del semáforo que lleve a cabo las acciones correspondientes a un BAJAR. Tras enviar el mensaje en este caso es necesario esperar a que el servidor complete la operación, lo que puede ocurrir tras una larga espera si el contador del semáforo vale cero. Por eso en este caso es necesario añadir una llamada al sistema para la recepción del mensaje de fin de operación procedente del gestor del semáforo. MsgBAJAR : constant INTEGER := -2 ; PROCEDURE BAJAR (Sem : in out Semáforo ) ; MsgFinBAJAR : INTEGER ; BEGIN Enviar(Sem, MsgBAJAR) ; Recibir(Sem, MsgFinBAJAR) ; END SUBIR ; Paso 5) Implementación del procedimiento sin parámetros ServidorDeSemáforo No hay que olvidarse de declarar las variables y estructuras de datos locales utilizadas. En caso de tener que manejar colas de (identificadores de) procesos supóngase que está disponible el tipo de datos ColaDeProcesos, con las operaciones: EstáVacía ( C : in ColaDeProcesos ) RETURN BOOLEAN ; MeterEnCola ( IdP : in IdProceso ; C : in out ColaDeProcesos ) ; SacarDeCola ( IdP : out IdProceso ; C : in out ColaDeProcesos ) ; La declaración de una variable de tipo ColaDeProcesos inicializa automáticamente dicha variable como una cola de procesos vacía. PROCEDURE ServidorDeSemáforo ; IdP : IdProceso ; Cliente : IdProceso ; Contador : NATURAL ; ColaDeEspera : ColaDeProcesos ; MsgFinBAJAR : constant INTEGER ; -- Inicialmente vacía -- Mensaje de sincronización -- Su valor es irrelevante BEGIN RecibirAny(Cliente, Contador) ; -- Inicialización del semáforo LOOP RecibirAny(Cliente, Petición) ; IF Petición = MsgBAJAR THEN -- Petición para BAJAR el sem. IF Contador > 0 THEN Contador := Contador – 1 ; Enviar(Cliente, MsgFinBAJAR) ; ELSE MeterEnCola(Cliente, ColaDeEspera) ; END IF ; ELSIF Petición = MsgSUBIR THEN -- Petición para SUBIR el sem. IF EstáVacia(ColaDeEspera) THEN Contador := Contador + 1 ; ELSE SacarDeCola(IdP, ColaDeEspera) ; Enviar(IdP, MsgFinBAJAR) ; -- Se desbloquea IdP END IF ; END IF ; END LOOP ; END ServidorDeSemáforo ;