jueves, 19 de octubre de 2017

05 - Memoria virtual. Técnicas de gestión

Las necesidades de manejar memoria crecen dado que el tamaño de la memoria real estaba limitado, los programas eran cada vez más grandes y los procesadores tenían mayor potencia.

Así surge la Memoria virtual, capaz de manejar mas espacio en memoria que la memoria principal, valiéndose tanto de la memoria principal como de una cantidad determinada de almacenamiento secundario.

Esta estrategia permite utilizar el disco como si fuera RAM, así, cuando un programa es más grande que el tamaño físico de la RAM, lo que se hace es pasar a disco las porciones de RAM que no se estén utilizando en un momento determinado, dejando solo en memoria las partes del programa que se estén ejecutando. Los programas no se dan cuenta de todo lo que esta ocurriendo por debajo, sin embargo como la velocidad de acceso a disco es miles de veces mas lenta que la de la RAM, a la hora de devolver porciones del programa a memoria desde el disco, el sistema puede comportarse de manera más lenta (sobre todo cuando se cargan muchos procesos de forma simultánea).

La clave del concepto de memoria virtual está en la disociación entre direcciones virtuales a las que hace referencia un programa y direcciones reales que son las disponibles en memoria real.

El funcionamiento consiste en lo siguiente:
  • El SO intercambia en memoria principal programas o procesos enteros en particiones de memoria y al mismo tiempo maneja segmentos y páginas, entre memoria real y memoria secundaria.
  • Los procesos hacen referencia a direcciones virtuales pero éstas deben ejecutarse en la memoria, así se produce un proceso de traducción entre direcciones virtuales y reales, mientras el proceso está en ejecución.
  • El proceso de traducción debe ser suficientemente rápido para no degradar el sistema. 

Los métodos más comunes de implementación de memoria virtual son:
  • Técnicas de Paginación.
  • Técnicas de Segmentación.
  • Una combinación de ambas técnicas (Paginación Segmentada o Segmentación Paginada). 

1- Paginación

Técnica que consiste en dividir la memoria en zonas iguales llamadas marcos de página. A su vez los los procesos (un proceso es un programa en ejecución) también se dividen en partes del mismo tamaño, denominadas páginas. El SO se encarga de asignar los marcos de página necesarios a cada proceso y mantiene una estructura llamada tabla de páginas que indica en que marco está cada página y también una lista de marcos libres.
La asignación de los marcos de página a las páginas no tiene que ser consecutiva y un proceso puede estar ubicado en marcos no contiguos.

Uno de los principales inconvenientes de esta técnica es la Fragmentación Interna.

Esquema de paginación de memoria

Nota: El tamaño de los marcos de página se diseña mediante hardware


2- Segmentación

A diferencia de la paginación, en la segmentación la memoria se divide en zonas de tamaño variable denominadas segmentos. El SO mantiene una tabla de segmentos para cada proceso indicando la dirección de carga y la longitud de cada segmento. La asignación de segmentos tampoco tiene que ser contigua.

Uno de los principales inconvenientes de esta técnica es la Fragmentación Externa.



Fragmentación

La fragmentación de la memoria es la memoria que queda desperdiciada al usar los métodos de gestión de memoria. La hay de dos tipos: Externa e Interna


Fragmentación externa e interna
Externa

Existe espacio total de memoria para satisfacer un requerimiento, pero no es contigua. La fragmentación externa se puede reducir mediante la compactación para colocar toda la memoria libre en un solo gran bloque, pero solo es posible si la relocalización es dinámica y en tiempo de ejecución.

Interna

El hecho de asignar memoria en bloques de tamaño fijo y predefinido se traduce en que la memoria asignada puede ser ligeramente mayor que la que realmente se necesita, en cuyo caso se desperdicia cierta cantidad. Se podría evitar permitiendo la asignación exacta de memoria que necesite cada proceso de forma dinámica.

Observación

Una estrategia común para reducir el impacto de la fragmentación es separar las zonas del sistema de archivos que experimenten muchas mas lecturas y escrituras de otras zonas más volátiles donde se crean y borran continuamente archivos. Por ejemplo el SO se compone de carpetas estáticas que se modifican con mucha menor frecuencia que los Perfiles de los usuarios donde se suele estar creando y destruyendo información continuamente. Al separar ambas zonas en particiones independientes logramos que el desfragmentador trabaje de forma mucho más eficiente.