|
Laboratorio 6 |
Gestión de memoria
|
|
En esta práctica se simula un gestor de
marcos de memoria de un sistema operativo. La memoria es reservada,
accedida y liberada por parte de procesos. El objetivo es hacer que el
número de fallos en los accesos a memoria sean mínimos. |
|||
|
En las estructuras de datos internas de un sistema operativo,
cada proceso contiene una tabla de páginas con la correspondencia entre
las páginas del espacio lógico de direcciones, y los marcos del espacio
físico. Pero con esta estrategia, en el sistema no existe una
estructura de datos global con la correspondencia de todos los marcos
del espacio físico con todas las páginas en el espacio lógico de todos
los procesos. El objetivo de esta práctica es precisamente extender la
funcionalidad de este sistema mediante la implementación de una
estructura de datos global que contenga la información de los marcos
físicos de todos los procesos en una única tabla. La siguiente figura representa la tabla de páginas inversa de un Sistema Operativo. Se pide implementar en el fichero reverseTable.c (del que se ofrece su estructura básica) los siguientes apartados:
El identificador de proceso es un número mayor que cero, mientras que el número de página es mayor o igual que cero. |
|
Las funciones searchFrame y removePages()
que gestionan esta tabla de
páginas inversa deben invocar las funciones del gestor de marcos que es
el encargado de registrar los marcos ocupados y libres, así como el PID
y la página lógica correspondiente. Este gestor de marcos se da ya
implementado en el fichero de código objeto con nombre frames.o y la
declaración de las funciones que incluye se encuentran en el fichero
frames.h. La funcionalidad de estas funciones es la siguiente:int getFrame(int pid, int page) : Dado un
par (pid, página) devuelve el índice de un marco que está libre. Las
aplicaciones externas deben cerciorarse de no invocar esta función
cuando no queden marcos libres, pues produce un error y termina la
ejecución.void releaseFrame(int index) : Libera el
marco cuyo índice se pasa como parámetro.int resetFrame(int pid, int page, int
index) : Función que reasigna un marco a un nuevo proceso y
página. Dado
el marco al que apunta el parámetro index , reemplaza su contenido con
el pid y número de página dados como primer y segundo parámetro
respectivamente. Si el marco al que apunta el parámetro index está
libre, se produce un error de ejecución. Esta operación es útil cuando
la tabla global de páginas debe hacer un reemplazo.NUM_FRAMES
en el
fichero frames.h. |
|
La estructura de la aplicación a desarrollar se ilustra en la siguiente figura: NUM_FRAMES en el
fichero frames.h .El fichero main.c genera un conjunto
de llamadas a las
funciones searchFrame y removePages
definidos en
el
fichero a entregar. A su vez,
este fichero devuelve al main , ya sea la información que
tiene
almacenada, o en caso de no ser así obtiene la información necesaria a
través de las llamadas getFrame , releaseFrame
y resetFrame .Los parámetros de ejecución del main son: número de procesos que generan peticiones, número de páginas que pide cada proceso, número de peticiones globales sobre las que iterar. Por ejemplo, la ejecución: pagetable 2 512 10000 genera 10000 accesos a páginas de 2 procesos, y cada uno de ellos accede repetidamente a un conjunto de 512 páginas. Este conjunto va variando conforme avanza la ejecución del main. La tabla de páginas globales representa aquellas páginas que el sistema dispone en memoria física. Toda petición cuya información no esté contenida en esta tabla modela un fallo de página. La función searchFrame es la que contiene la
funcionalidad clave. Debe
buscar en la tabla global la información a devolver a través del PID y
página dados. En caso de que esta información no se encuentre en la
tabla se debe obtener del gestor de marcos. Si la tabla global se
encuentra llena (nótese que hay exactamente NUM_FRAMES
marcos
posibles), la función debe seleccionar una entrada y reemplazar su
contenido con los nuevos datos. Se deja a la elección del alumno el
tipo de algoritmo de reemplazo a implementar. Se sugiere revisar los
apuntes de clase sobre políticas de reemplazo de páginas en los
sistemas operativos.El rendimiento del programa a diseñar se mide con respecto a la suma de fallos de página que produce un conjunto de ejecuciones del main con diferentes parámetros. Esta magnitud la imprime el programa tras haber terminado la ejecución correctamente. La función main en todo momento comprueba que la información devuelta por la tabla global es consistente con la almacenada en el gestor de marcos. Si se detecta alguna inconsistencia a lo largo de la ejecución, ésta se detiene inmediatamente. Para obtener el ejecutable tal y como se utiliza en los juegos de pruebas hay que utilizar la siguiente línea de compilación: gcc -Wall -g -o pagetable main.c frames.o reverseTable.c
libao.a -lm También necesitarás: ao.h Si quieres obtener una versión del ejecutable para depurar y por tanto que no se limite el tiempo de ejecución, debes incluir la opción -DDEBUG
en el comando de compilación (también
aparecerán múltiples
mensajes adicionales de depuración).Los juegos de pruebas se realizan ejecutando la siguiente secuencia de comandos: $ pagetable 2 512 20000
|