Home UC3M
Home IT

Laboratorio 6

Gestión de memoria

 OBJETIVOS

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.


 INTRODUCCIÓN


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.
Estructura de la tabla

Se pide implementar en el fichero reverseTable.c (del que se ofrece su estructura básica) los siguientes apartados:
  • Definición de la estructura de datos para almacenar la tabla inversa de páginas. La definición debe incluir una documentación detallada del contenido de sus campos.
  • Función int searchFrame(int pid, int page) : Dado el PID de un proceso y un número de página, devuelve el número de marco (o frame) asociado a este par. Si este par (pid, page) no existe en la tabla de páginas invertida se solicita un nuevo marco (o frame) y se crea una nueva entrada en la tabla con estos datos.
    El sistema utiliza searchFrame para encontrar el espacio de memoria física (marco) asociado a un cierto espacio de memoria lógica (página).

  • Función void removePages(int pid): Borra todas las entradas en la tabla que corresponden al identificador de proceso dado.
    El sistema utiliza esta función cuando un proceso libera memoria, al finalizar su ejecución. En este instante su espacio de memoria lógica (página) ya no se necesita, por lo que su espacio físico asociado (marco) se libera para que otro proceso pueda utilizarlo.

     
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.
 GESTOR DE MARCOS

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.

  • La funcionalidad de estas funciones debe considerar que el número de marcos (o frames) está definido por la constante NUM_FRAMES en el fichero frames.h.
     APLICACIÓN A DESARROLLAR

    La estructura de la aplicación a desarrollar se ilustra en la siguiente figura:
    Estructura de la aplicacion
    Los ficheros auxiliares consideran el número de marcos (o frames) tal y como está definido por la constante 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
    $ pagetable 4 512 20000
    $ pagetable 6 512 20000
    $ pagetable 8 512 20000
    $ pagetable 4 2048 20000
    $ pagetable 4 4096 20000
    $ pagetable 4 8192 20000
     ENVÍO

    Solo debe subirse un fichero, reverseTable.c Deadline: 11/12/2012 17:00
    Los nombres de los autores y sus NIAS deben indicarse en el comentario que aparece en sumList.c de la siguiente forma:
    /* AUTHORS: NIA1;Name1;NIA2;Name2 */
    Las prácticas no deben ser entregadas por las dos personas de una misma pareja de prácticas. Basta con que la entregue uno de ellos en Aula Global 2