E - Departamento de Informática Aplicada

Anuncio
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 ;
Descargar