Gestión de Memoria Gestión de Memoria Capítulo 7 Requisitos de Gestión de Memoria • Reubicación – Los programadores no saben dónde estará el programa en memoria cuando se ejecute – Mientras el programa se ejecuta, puede ser movido al disco y devuelto a memoria principal en una posición diferente (reubicado) – Se deben traducir las referencia a memoria del código a las direcciones físicas reales • Dividir la memoria para alojar múltiples procesos • La memoria necesita ser asignada eficientemente para alojar tantos procesos como sea posible Requisitos de Gestión de Memoria • Protección – Los procesos no deberían ser capaces de referenciar el espacio de memoria de otro procesos sin permiso – Es imposible comprobar las direcciones absolutas de los programas puesto que éstos pueden ser reubicados – Deben ser traducidas durante la ejecución Requisitos de Gestión de Memoria • Compartición – Permitir a varios procesos acceder a la misma zona de memoria – Es mejor permitir a cada proceso (persona) acceso a la misma copia del programa que tener cada uno su copia individual • El sistema operativo no puede anticipar todas las referencias de memoria que un programa puede generar Requisitos de Gestión de Memoria • Organización Lógica – Los programas son escritos en módulos – Los módulos se pueden escribir y compilar por separado – A los módulos se les puede dar diferente grado de protección (sólo lectura, sólo ejecución) – Módulos compartidos Requisitos de Gestión de Memoria • Organización física – La memoria disponible para un programa y sus datos puede ser insuficiente • El solapamiento permite asignar la misma zona de memoria a diferentes módulos – El programador no sabe cuanto espacio habrá disponible Particionamiento Fijo • Particiones del mismo tamaño – cualquier proceso de tamaño menor o igual al de una partición puede ser cargado en una partición disponible – si todas las particiones están ocupadas, el S.O. puede mover a disco un proceso de una partición – un programa puede no caber en una partición Particionamiento Fijo • El uso de la memoria principal es ineficiente. Un programa, no importa como de pequeño sea, ocupa una partición entera. Esto se conoce como fragmentación interna. • el programador debe diseñar el programa con overlays Algoritmo de Ubicación con Particiones • Particiones del mismo tamaño – como todas las particiones tienen el mismo tamaño, no importa qué partición asignar • Particiones de diferente tamaño – se puede asignar a cada proceso la partición más pequeña en la que cabe – cola para cada partición – los procesos se asignan de manera que se minimiza la memoria desperdiciada de una partición Particionamiento Dinámico • El tamaño y el número de particiones es variable • Al proceso se le asignar exactamente la cantidad de memoria que necesita • Aparecen huecos en la memoria. Esto se conoce como fragmentación externa • Se debe realizar una compactación para desplazar a los procesos de forma que esté juntos y todo el espacio libre esté en un solo bloque Efecto del Particionamiento Dinámico Efecto del Particionamiento Dinámico Particionamiento Dinámico Algoritmo de Ubicación • El sistema operativo debe decidir qué bloque libre asignar a un proceso • Algoritmo del mejor ajuste (best fit) – Elige el bloque que tiene el tamaño más cercano al solicitado – Peor rendimiento de todos – Como se busca el bloque más pequeño por proceso, se produce el menor volumen de fragmentación, pero hay que compactar más a menudo Particionamiento Dinámico Algoritmo de Ubicación • Algoritmo del siguiente ajuste (Next-fit) – A menudo se asigna un bloque de memoria en la última parte de la memoria donde está el mayor bloque – El mayor bloque de memoria se parte en pequeños bloques – Se necesita compactar para obtener un bloque grande en la última zona final memoria Particionamiento Dinámico Algoritmo de Ubicación • Algoritmo del primer ajuste (first fit) – Es el más rápido – Puede haber muchos procesos cargado en la zona inicial de la memoria, que debe ser examinada cuando se busca un bloque libre Buddy System • La memoria disponible completa es tratada como un bloque individual de 2U • Si una petición de tamaño s es tal que 2U-1 < s <= 2U, se le asigna el bloque completo – Si no, el bloque se divide en dos trozos iguales (buddies) – El proceso continúa hasta generar el bloque más pequeño que es mayor o igual a s Reubicación • Cuando se carga un programa en memoria se determina la ubicación real (absoluta) • Un proceso puede ocupar diferentes particiones durante la ejecución (swapping) lo que significa diferentes direciones absolutas • La compactación también provoca que un programa ocupe diferentes particiones que da lugar a direcciones absolutas diferentes Direcciones • Lógicas – referencias a posiciones de memoria independientes de la asignación vigente de datos en memoria – la traducción se realiza a dirección física • Relativas – las direcciones se expresan como posiciones relativas a algún punto conocido • Físicas – es la dirección absoluta o ubicación real en memoria principal Registros Usados durante la Ejecución • Registro base – dirección de comienzo de un proceso • Registro de límites (bound) – dirección final de un proceso • Estos valores se establecen cuando se carga el proceso o bien cuando es intercambiado hacia memoria (swap) Registros Usados durante la Ejecución • Se suma el valor del registro base a la dirección relativa produciendo una dirección absoluta • La dirección resultante se compara con el registro de límite • Si la dirección está fuera de los límites, se genera una interrupción al sistema operativo Paginación • Partición de la memoria en pequeños pedazos del mismo tamaño (chunks) y dividir cada proceso en trozos del mismo tamaño • Los trozos (chunks) de un proceso se llaman páginas y los de la memoria se llaman marcos de página (frames) • El sistema operativo mantiene una tabla de página para cada proceso – contiene la ubicación del marco de página (frame) de cada página del proceso – la dirección de memoria consiste en un número de página y un desplazamiento (offset) dentro de la página Ejemplo de Tabla de Páginas Segmentación • Todos los segmentos de todos los programas no tienen porqué ser del mismo tamaño • Hay un tamaño máximo de segmento • El direccionamiento consta de dos partes – un número de segmento y un desplazamiento dentro de éste (offset) • Como los segmentos no son iguales, la segmentación es similar al particionamiento dinámico