UNIDAD 3: ADMINISTRACIÓN DE MEMORIA
Administración de memoria
Recopilado por: Carolina Gonzalez Vargas, Rubén Mora Meneses y Esteban Ramírez Quirós.
5.1. Fundamentos
La memoria o memoria principal puede ser considerada como una matriz de bytes, cada uno con una dirección. El administrador de memoria es parte del sistema operativo que regula el uso o liberación de la memoria. Una instrucción es una orden que se le da a la computadora para que ejecute una operación. Un proceso es una secuencia de instrucciones que forman parte de un programa en ejecución.
La memoria es un recurso necesario en todo sistema informático y por eso debe ser gestionado con cuidado, esta operación la ejecuta el administrador de memoria o Memory Manager. El administrador de memoria está encargado de asignar la memoria que necesita un proceso, así como liberarla cuando el proceso la haya desocupado. También debe estar al pendiente de qué secciones de la memoria se están utilizando y cuáles no, así como debe tener control sobre cuáles procesos están utilizando la memoria.
Para poder administrar la memoria es necesario poder acceder a ella ya sea para leerla, guardar datos o simplemente reservarla, los bytes de la memoria pueden accederse por medio de direcciones, las cuales pueden ser representadas de diferentes maneras. En un programa fuente se utilizan direcciones simbólicas, que más adelante representan direcciones concretas en un programa ejecutable.
En una computadora la memoria principal es un recurso vital para su funcionamiento ya que no solo los programas pueden modificarla, sino que también los dispositivos de entrada y salida pueden tener acceso a ella y modificarla. El procesador de la computadora es el que debe regular los accesos a a memoria y la velocidad de este para accederla y modificarla (ya sea para escribir o borrar datos) dependerá de la eficiencia del computador.
5.1.1. Hardware básico
El direccionamiento de memoria se refiere a cualquier intento de acceder a la memoria ya sea para leerla, escribir en ella o borrar su contenido, por medio de una dirección.
Los registros del procesador son espacios pequeños de memoria en el procesador que se utilizan, entre otras cosas, para que las instrucciones del procesador tomen de ahí los datos que necesitan para procesarlos.
Al desarrollar el hardware de una computadora, se debe definir la forma en que se va a direccionar la memoria. El máximo direccionamiento que puede tolerar una computadora se define según la cantidad de bits que posean las direcciones a generar, si se toma ése número de bits como exponente de 2 se puede obtener el máximo direccionamiento posible, lo que quiere decir que aunque el computador disponga de más memoria, será imposible accederla, por ejemplo, si se tienen direcciones de 8 bits, solo se podrá acceder hasta 256 bits de memoria. Cuando se define el hardware, también se especifica la menor unidad de memoria direccionable, es decir se escoge una cantidad mínima de bits a direccionar, lo que implica que las siguientes posiciones en memoria tendrán ese tamaño.
Por otra parte, la memoria principal y los registros del procesador son las únicas secciones que pueden ser accesadas directamente, e incluso muchas de las instrucciones de la máquina toman como parámetro el contenido de los registros ya mencionados, pero no hay instrucciones que acepten direcciones de la memoria en disco, lo que implica que si se necesitan datos de la memoria en disco, deben copiarse en los registros o en memoria principal para poder ser utilizados. Es decir que, para poder ejecutar un proceso, es necesario asegurarse de que este posea un espacio en memoria exclusivo para su uso y el rango legal de direcciones de memoria disponibles, esto se hace por medio del almacenamiento de un registro base y un registro límite. El registro base guarda la primera dirección en memoria que corresponde a ese proceso, mientras que el registro límite muestra el rango máximo de memoria que necesita el proceso, por ejemplo, si el registro base equivale a la posición 2000 en memoria y el registro límite tiene un valor de 500, el proceso ocupa un espacio en memoria desde la dirección 2000 hasta la 2500.
Es posible proteger el espacio en memoria para cada proceso, esto se logra haciendo que el CPU compare las direcciones generadas en modo usuario con el contenido de los registros a los que se desea acceder y en cualquier intento de acceder a direcciones que no le correspondan, generar un error fatal.
5.1.2. Reasignación de direcciones
La memoria usualmente aloja varios procesos al mismo tiempo y, de hecho, se busca maximizar el uso del procesador teniendo una reserva de procesos a ejecutar, esta lista se llama cola de procesos.
Como el programador no sabe cuáles otros procesos van a estar en memoria al mismo tiempo que el proceso que desea ejecutar, es necesario mover el programa a otra área de memoria en caso de ser necesario, es decir, si se necesita el espacio de memoria que está utilizando ese proceso, el sistema operativo debe ser capaz de mover el proceso, ejecutar otro y volver a cargar el proceso anterior justo en la instrucción en que había quedado antes de que fuera interrumpido.
Habitualmente se selecciona uno de los procesos de la cola de procesos, este se carga en memoria y luego es ejecutado, cuando este termina, el espacio de memoria en el que fue cargado, se declara libre para ser utilizado por otro proceso. Para hacer esto, el editor de montaje o cargador se encarga de asignar las nuevas direcciones del proceso que se está cargando en memoria y una vez asignadas las nuevas direcciones, poder ejecutar el proceso.
La reasignación de instrucciones y datos en memoria puede hacerse en cualquiera de las siguientes etapas:
- Tiempo de compilación: solamente si se sabe con certeza en dónde va a ser almacenado el programa cuando este sea compilado, se pueden generar direcciones absolutas ya que no va a haber ningún inconveniente con el acceso a la memoria.
- Tiempo de carga: si no se sabe a dónde se alojará el proceso cuando este sea compilado, las direcciones deben ser reubicables, de modo que la asignación de direcciones se retrasa hasta cuando el proceso necesita ser cargado en memoria.
- Tiempo de ejecución:Si no hubiese problema con retrasar la reasignación de direcciones hasta el tiempo de ejecución, es recomendable hacerlo, pero para esto se necesita de un hardware especial, sin embargo, la mayoría de sistemas operativos de propósito general utilizan este método.
5.1.3. Espacios de direcciones lógico y físico
Una dirección lógica o dirección virtual es una dirección generada por el CPU, mientras que unadirección física es una dirección de la unidad de memoria. Las direcciones lógicas que son generadas por un programa son llamadas, como conjunto, espacio de direcciones lógicas, estas generan también elespacio de direcciones físicas, el cual el conjunto de las direcciones físicas homólogas a las direcciones lógicas.
Se tienen también la unidad de gestión de memoria (MMU o memory-management unit)la cual es una parte del hardware que hace la equivalencia entre las direcciones virtuales y físicas en tiempo de ejecución.
También se cuenta con el registro de ubicación, el cual es un sinónimo para el registro base, el cual suma todas las direcciones generadas por un proceso de usuario cuando se está cargando el proceso en memoria.
La memoria de una computadora se organiza en por lo menos dos niveles: principal y secundaria. La memoria principal proporciona un acceso rápido a esta pero el costo es elevado, también es volátil, es decir, su almacenamiento de información no es permanente. Por otra parte, la memoria secundaria, se organiza de una manera similar a la memoria principal sin embargo es lenta, barata y no volátil, lo que permite almacenar información por mucho tiempo, ya sean programas, datos o ambos.
Si el sistema operativo puede administrar de forma correcta y efectiva las memorias disponibles, es capaz de proveer las siguientes ventajas:
- Los módulos pueden compilarse y escribirse de forma independiente.
- Se puede dar varios grados de protección de datos.
- Los procesos podrían compartir módulos.
5.1.4. Carga dinámica
La carga dinámica consiste en cargar las rutinas hasta que sean invocadas, es decir, no se cargan hasta que se necesitan y todas las rutinas se mantienen en un disco en un formato reubicable y también se aplaza el cálculo de direcciones. Cuando una rutina en un proceso necesita convocar a otra, primero revisa si ya está cargada, de lo contrario la busca y la carga en memoria para su uso con el cargador de memoria, esto implica la actualización de las tablas de direcciones del programa para dar evidencia del cambio generado al cargar la rutina.
Esto proporciona como ventaja que si una rutina no se necesita en tiempo de ejecución, nunca será cargada en memoria, por lo tanto ahorrará memoria y resulta útil si se necesita disponer de mucho código para administrar casos poco frecuentes.
5.1.5. Montaje dinámico y bibliotecas compartidas
Para poder comprender el montaje dinámico es importante definir el montaje estático y montaje binario.
El montaje estático se da cuando las bibliotecas del lenguaje utilizado en el sistema son tomadas como un módulo y son integradas en el programa. Por otra parte el montaje binario se da cuando se pospone hasta el tiempo de ejecución el montaje del programa. Sin embargo el montaje dinámicoocurre cuando en el fragmento de código se incluye un stud, una pieza de código que indica cómo encontrar o agregar la rutina deseada en la imagen binaria.
Es decir, el montaje dinámico retrasa el montaje de los módulos externos hasta que el módulo de carga haya terminado de crearse.
Algunos sistemas operativos no permiten el montaje dinámico, sino que solamente el estático.
5.2. Intercambio
Normalmente en los sistemas actuales, tener recursos ociosos o sin utilizar, es considerado un desperdicio de ellos, esto incluye a la memoria, los sistemas de la actualidad suele mantener ocupada un gran porcentaje de ella, esto puede ocasionar situaciones donde no haya suficiente memoria disponible para un proceso que requiere ser ejecutado.
Una de las soluciones ante este problema es el intercambio de procesos, esto consiste en intercambiar temporalmente un proceso que esta en memoria con uno que se encuentre en la cola de procesos, guardando en un almacén de respaldo el proceso que se encuentra en memoria, y volviéndolo a llevar luego a memoria para continuar su ejecución.[1]
Para poder realizar esto, es necesario una cola de procesos, como se mencionó anteriormente. Por ello, el sistema mantiene esta cola de procesos donde se encuentran todos los procesos que estén listos para ser ejecutados, tanto los que se encuentran en el almacén de respaldo como los que se van a ejecutar por primera vez.[1]
Este proceso de intercambio tiene un costo de tiempo relativamente alto, del cual la mayor parte del tiempo es tiempo de transferencia, el cual es directamente proporcional a la cantidad de memoria intercambiada. Por ello la duración de este proceso de intercambio es proporcional al tamaño del proceso a intercambiar.
Para esta operación sea realmente útil, el tiempo de ejecución del proceso que ingresa en memoria debe ser lo suficientemente grande en relación con el costo del tiempo de intercambio, para que este pueda realizar una cantidad de cálculos lo suficientemente grande entre una operación de intercambio y la siguiente.
Normalmente cuando un proceso almacenado, vuelve a ser cargado, este se volverá a cargar en el mismo espacio de memoria que ocupó anteriormente. Esta restricción es impuesta por el método de reasignación de las direcciones. [1]
Pero este proceso de intercambio, no se puede realizar con cualquier proceso que se encuentre en memoria, para poder realizar esto, los procesos deben estar completamente inactivos. por ejemplo si el proceso no podrá ser intercambiado si se está accediendo a donde residen los buffers de E/S en la memoria. ya que aunque el proceso parezca inactivo, realmente no lo está.
Existen ciertas mejoras que se le pueden realizar a este mecanismo, como la utilización de un doble buffer que permita cargar o descargar un proceso mientras otro se encuentra en ejecución; o combinar la técnica con el uso de registros base y límite, para mantener varios procesos simultáneamente en memoria.
También este mecanismo se puede implementar en conjunto con algoritmos de planificación con prioridad. Esto consiste es que si llega un proceso de mayor prioridad y este necesita ser ejecutado, el administrador de memoria puede intercambiarlo por un proceso inactivo de menor prioridad. Cuando el proceso de mayor prioridad haya terminado, puede intercambiarse de nuevo por el proceso de menor prioridad.[1]
En la actualidad, aunque en muchas versiones de UNIX se utiliza una variante de este sistema, el intercambio está normalmente desactivado, por ello en realidad estos mecanismos de intercambio se utilizan en pocos sistemas, ya que en general requieren el costo en tiempo de este mecanismo es muy alto y no logran proporcionar tiempos de ejecución suficientemente largos como para realizar una compensación favorable y que haga de esto una solución razonable de gestión de memoria.
5.3. Asignación de memoria contigua
Como todo proceso que necesite ser ejecutado estar albergado en memoria, esta debe albergar tanto el sistema operativo como los diversos procesos que ejecute el usuario.
Normalmente ambos, el sistema operativo como el espacio del usuario, no comparten el mismo espacio por eso usualmente la memoria esta dividida en 2 particiones, una para el sistema operativo y otra para los procesos que desee ejecutar el usuario. [1]
5.4. Mapeo de memoria y protección
Como los sistemas no utilizan direcciones predefinidas como puede ser direcciones físicas de memoria, sino que utilizan las direcciones absolutas de un programa, las cuales son imposibles de calcular en tiempo de compilación porque no se conoce la ubicación del programa, por lo que no se puede asegurar una protección a la memoria. [2]
Comentarios
Publicar un comentario