Logo Studenta

Resumen SO Gestion de memoria

¡Estudia con miles de materiales!

Vista previa del material en texto

Objetivos del sistema de gestión de memoria:
El sistema de gestión de memoria tiene como objetivo gestionar la memoria disponible en el sistema de manera eficiente (tiene que ver con la asignación inteligente de espacios de memoria), para que los procesos puedan acceder a la memoria que necesitan para su ejecución. Para lograr esto, el sistema de gestión de memoria debe gestionar la memoria compartida entre procesos, asignar y liberar memoria para los procesos, y garantizar la protección de la memoria de los procesos. A su vez tratar de mantener la mayor cantidad de procesos cargados en memoria (aumentar el nivel de multiprogramación).
Definiciones:
La MMU (Unidad de Gestión de Memoria, por sus siglas en inglés): es un componente hardware que se encarga de traducir las direcciones virtuales utilizadas por los programas en direcciones físicas reales en la memoria del sistema. En un esquema de MMU, se suma un valor de reubicación a todas las direcciones generadas por el proceso para garantizar que las direcciones virtuales se correspondan con las direcciones físicas reales. El programa de usuario solo utiliza direcciones virtuales, sin conocer la ubicación exacta de los datos en la memoria física, y la MMU se encarga de realizar la traducción necesaria para acceder a los datos. La MMU es un componente clave en la gestión de memoria de un sistema operativo, permitiendo un acceso eficiente y transparente a la memoria.
Reubicación: En sistemas multiprogramados, la memoria principal se comparte entre varios procesos y es necesario permitir que los programas se muevan en la memoria principal debido al intercambio o swap, lo que hace necesario el proceso de reubicación de memoria. Este proceso implica que los programas pueden ser cargados en diferentes áreas de la memoria y se deben ajustar las direcciones del programa para reflejar la nueva ubicación.
En resumen, la reubicación de memoria es un proceso importante en sistemas multiprogramados que permite que los programas se muevan en la memoria principal debido al intercambio o swap. Este proceso implica ajustar las direcciones del programa para reflejar la nueva ubicación y el sistema operativo y el hardware del procesador deben poder realizar la traducción necesaria para acceder a los datos de manera transparente para el programa.
Protección: La protección de memoria es un requisito importante en la gestión de memoria del sistema operativo para garantizar que un proceso esté protegido contra interferencias no deseadas por parte de otros procesos. Esto significa que los programas de otros procesos no deben ser capaces de referenciar posiciones de memoria de un proceso sin permiso, tanto en modo lectura como escritura. Además, un proceso de usuario no puede acceder a cualquier porción del sistema operativo, ni al código ni a los datos, y un programa de un proceso no puede saltar a una instrucción de otro proceso.
Para garantizar la protección de memoria, los mecanismos que dan soporte a la reubicación también dan soporte al requisito de protección. Es necesario comprobar en tiempo de ejecución que todas las referencias de memoria generadas por un proceso se refieren solo al espacio de memoria asignado a dicho proceso. El procesador debe ser capaz de abortar instrucciones que intenten acceder a memoria no permitida en el punto de ejecución.
Es importante destacar que los requisitos de protección de memoria deben ser satisfechos por el procesador (hardware) en lugar del sistema operativo (software). Esto se debe a que el sistema operativo no puede anticipar todas las referencias de memoria que un programa hará y la evaluación de la permisibilidad de una referencia solo es posible en tiempo de ejecución. Por tanto, el hardware del procesador debe tener la capacidad de garantizar la protección de memoria.
Compartición: Es importante permitir que varios procesos accedan a la misma porción de memoria principal para permitir la compartición de recursos y evitar la duplicación innecesaria de datos. El sistema de gestión de memoria debe permitir el acceso controlado a áreas de memoria compartidas sin comprometer la protección esencial. Los mecanismos utilizados para dar soporte a la reubicación también proporcionan capacidades para la compartición y permiten que varios procesos accedan a la misma copia de un programa o a la misma estructura de datos. En resumen, la compartición de memoria es un aspecto importante en la gestión de la memoria del sistema operativo que permite la colaboración y el uso eficiente de los recursos del sistema.
Organización Lógica: La memoria principal y secundaria de un computador se organizan como un espacio de almacenamiento lineal o unidimensional, pero la mayoría de los programas se organizan en módulos. Si el sistema operativo y el hardware del computador pueden tratar los programas de usuarios y los datos en la forma de módulos, se pueden lograr varias ventajas, como la posibilidad de escribir y compilar módulos independientemente, proporcionar diferentes grados de protección y permitir la compartición de módulos entre procesos. La herramienta que más adecuadamente satisface estos requisitos es la segmentación, que es una técnica de gestión de la memoria explorada en este capítulo.
Organización física: La memoria del computador se organiza en al menos dos niveles, la memoria principal y la memoria secundaria. La memoria principal proporciona acceso rápido pero es volátil, mientras que la memoria secundaria es más lenta, más barata y no volátil. La organización del flujo de información entre ambos niveles supone una de las principales preocupaciones del sistema. Los programadores no pueden asignar la tarea de mover información entre los dos niveles de memoria porque la memoria principal disponible podría ser insuficiente y en un entorno multiprogramado, no se sabe cuánto espacio estará disponible o dónde se localizará. Por tanto, la tarea de mover información entre los dos niveles de memoria debe ser responsabilidad del sistema, lo que se conoce como gestión de la memoria.
Particionamiento fijo:
 En la gestión de la memoria, el sistema operativo ocupa una porción fija de la memoria principal y el resto está disponible para múltiples procesos. El esquema más simple para gestionar la memoria disponible es dividirla en regiones con límites fijos, lo que se conoce como particionamiento fijo.
Tamaños de partición: En el particionamiento fijo, la memoria principal se divide en regiones con límites fijos. Una posibilidad es utilizar particiones del mismo tamaño, lo que permite que cualquier proceso cuyo tamaño sea menor o igual que el tamaño de partición pueda cargarse en cualquier partición disponible. Sin embargo, esto presenta dos problemas: los programas demasiado grandes deben diseñarse con el uso de overlays y la utilización de la memoria principal es ineficiente debido a la fragmentación interna. Para mejorar estos problemas, se pueden utilizar particiones de tamaño diferente, lo que permite acomodar programas más grandes sin overlays y reduce la fragmentación interna para programas más pequeños.
Algoritmo de ubicación: Con particiones del mismo tamaño, la ubicación de los procesos en memoria es simple. Cada proceso se carga en la primera partición disponible y si todas están ocupadas, se debe enviar a swap a algún proceso. Con particiones de tamaño diferente, se pueden asignar los procesos a la partición más pequeña dentro de la cual cabe o utilizar una única cola para todos los procesos, seleccionando la partición más pequeña disponible para cada proceso. El uso de particiones de distinto tamaño es más flexible que las particiones fijas, pero limita el número de procesos activos del sistema y no utiliza eficientemente el espacio de las particiones para trabajos pequeños. El particionamiento fijo es raramente utilizado hoy en día, aunque fue utilizado en sistemas operativos antiguos como el OS/MFT de IBM.
Partición dinámica:
 El particionamiento dinámico utiliza particiones de longitud y número variable, asignando exactamentela cantidad de memoria requerida por un proceso. Sin embargo, esto puede llevar a la fragmentación externa, lo que significa que la memoria que es externa a todas las particiones se fragmenta de forma incremental, lo que reduce la utilización de la memoria. La técnica de compactación se utiliza para eliminar la fragmentación externa, desplazando los procesos en memoria de forma que se encuentren contiguos y se libere un bloque de memoria suficiente para cargar un proceso adicional. Esto requiere la capacidad de reubicación dinámica para mover un programa desde una región a otra en la memoria principal sin invalidar las referencias de la memoria de cada programa.
Algoritmo de ubicación: Existen tres algoritmos de ubicación de memoria: mejor-ajuste (best-fit), primer-ajuste (first-fit) y siguiente-ajuste (next-fit). El mejor-ajuste busca el bloque más cercano en tamaño a la petición, el primer-ajuste selecciona el primer bloque disponible que sea suficientemente grande, y el siguiente-ajuste elige el siguiente bloque disponible que sea suficientemente grande, comenzando desde la última colocación. El algoritmo primer-ajuste es el más sencillo y normalmente es también el mejor y más rápido. El siguiente-ajuste puede llevar a una asignación de un bloque libre al final de la memoria, lo que resulta en la división rápida del bloque más grande de memoria libre en pequeños fragmentos, por lo que puede requerir más frecuentemente la compactación. El mejor-ajuste garantiza que el fragmento que quede sea lo más pequeño posible, pero deja la memoria principal con bloques demasiado pequeños para satisfacer las peticiones de asignación de memoria, por lo que la compactación se debe realizar más frecuentemente que con el resto de los algoritmos. Cuál de estas técnicas es mejor depende de la secuencia exacta de intercambio de procesos y del tamaño de dichos procesos.
Algoritmo de reemplazo: En un sistema multiprogramado con particionamiento dinámico, puede haber momentos en los que todos los procesos en memoria estén bloqueados y no haya suficiente memoria para un nuevo proceso, incluso después de la compactación. En este caso, el sistema operativo intercambiará algunos procesos entre la memoria principal y el disco para hacer espacio para un nuevo proceso o para un proceso en estado Listo-Suspendido. El sistema operativo debe decidir qué proceso reemplazar y esto se hace mediante algoritmos de reemplazo. Sin embargo, la discusión detallada de los algoritmos de reemplazo se pospone hasta que se aborden los esquemas de memoria virtual.
Sistema Buddy: El sistema buddy es es un compromiso entre los esquemas de particionamiento fijo y dinámico de la memoria en un sistema multiprogramado. Es un esquema de gestión de memoria que se utiliza en sistemas multiprogramados para asignar y liberar bloques de memoria de tamaño variable. Este sistema divide la memoria disponible en bloques de tamaño potencia de dos y mantiene una lista de huecos (bloques sin asignar) de cada tamaño 2^i. Cuando se realiza una petición de memoria de tamaño s, el sistema busca el bloque más pequeño de tamaño 2^i que pueda satisfacer la petición y lo asigna. Si el bloque es más grande que s, se divide en dos bloques buddy iguales de tamaño 2^(i-1) y se colocan en la lista de huecos de tamaño 2^(i-1). Si no hay un bloque disponible del tamaño solicitado, el sistema busca el siguiente tamaño más grande en la lista de huecos y continúa dividiendo los bloques hasta que se genera un bloque del tamaño adecuado. Cuando se libera un bloque, el sistema verifica si su bloque buddy (el bloque hermano generado en la última división) también está libre. Si es así, se unen en un bloque de tamaño 2^(i+1) y se colocan en la lista de huecos de tamaño 2^(i+1). De esta manera, el sistema buddy evita la fragmentación externa y utiliza la memoria de manera más eficiente que los esquemas de particionamiento fijo. Sin embargo, el sistema buddy tiene una sobrecarga de mantenimiento de la lista de huecos y puede generar fragmentación interna. Por lo tanto, se utiliza principalmente en sistemas de memoria compartida y paralelos donde la eficiencia en la asignación y liberación de memoria es crítica.
Reubicación: En la gestión de memoria, el esquema de particionamiento fijo puede generar problemas de fragmentación y reubicación de los procesos en la memoria, lo que puede causar problemas al referenciar las direcciones de memoria. Para solucionar esto, se utiliza la distinción entre direcciones lógicas, relativas y físicas, y se realiza una traducción en tiempo de ejecución de las direcciones relativas a direcciones físicas mediante un registro especial del procesador. Este esquema permite el intercambio de procesos entre la memoria principal y el disco, proporciona protección y previene accesos no autorizados.
Paginación:
La paginación es una técnica utilizada en la gestión de memoria que se basa en dividir la memoria principal en porciones pequeñas y fijas llamadas marcos, y a cada proceso se le divide en porciones pequeñas y fijas llamadas páginas. Cada página del proceso se asigna a un marco disponible en la memoria principal. El sistema operativo mantiene una tabla de páginas por cada proceso, que muestra la ubicación del marco por cada página del proceso. Cada dirección lógica del proceso se forma de un número de página y un desplazamiento dentro de la página. La traducción de direcciones lógicas a físicas la realiza el hardware del procesador mediante la tabla de páginas del proceso. La paginación resuelve los problemas de fragmentación interna y externa que se presentan en el esquema de particionamiento fijo y variable. El tamaño de página y por tanto el tamaño del marco debe ser una potencia de 2 para que la dirección relativa y la dirección lógica sean lo mismo, lo que hace que el esquema de direccionamiento lógico sea transparente al programador, al ensamblador y al montador. La paginación simple es similar al particionamiento fijo, pero las particiones son pequeñas y no necesitan ser contiguas.
Segmentación:
La segmentación es una técnica utilizada en la gestión de memoria que permite subdividir un programa y sus datos en segmentos de distinto tamaño. Cada segmento se asigna a una región de memoria disponible en la memoria principal y se identifica por un número de segmento y un desplazamiento dentro del segmento. Una dirección lógica utilizando segmentación está compuesta por estos dos valores.
Para la implementación de la segmentación, se utiliza una tabla de segmentos por cada proceso, que muestra la ubicación y el tamaño de cada segmento del proceso en la memoria principal. Cada vez que se necesita traducir una dirección lógica a una dirección física, se extrae el número de segmento de la dirección lógica y se utiliza como índice para acceder a la tabla de segmentos y obtener la dirección física inicial del segmento correspondiente. Luego, se compara el desplazamiento de la dirección lógica con la longitud del segmento para verificar si la dirección es válida. Si el desplazamiento es mayor o igual que la longitud, la dirección no es válida. Finalmente, la dirección física deseada se obtiene sumando la dirección física inicial del segmento y el desplazamiento.
La segmentación elimina la fragmentación interna, pero sufre de fragmentación externa debido a que los segmentos no necesitan ser contiguos. Sin embargo, la fragmentación externa debería ser menor que en el particionamiento dinámico, debido a que el proceso se divide en varias piezas más pequeñas. Por otro lado, el programador o compilador debe ser consciente de la limitación de tamaño máximo de los segmentos, y la relación entre direcciones lógicas y físicas no es tan simple como en la paginación.
En resumen, la segmentación es una técnica útil para la gestión de memoria que permite subdividir un programa y sus datos en segmentos de distinto tamaño, asignar cada segmento a una región de memoria disponible en la memoria principal y traducir direcciones lógicas a direcciones físicas utilizando una tablade segmentos por cada proceso.

Continuar navegando