Gestión de la memoria

per Victor Carceler darrera modificació 2020-03-25T15:30:34+01:00

En un sistema operativo moderno, la gestión de la memoria corre a cargo de un subsitema básico que se encarga de:

  • Presentar a los procesos un espacio de memoria contiguo, aunque se estén utilizando diferentes espacios (memoria principal y memoria secundaria)
  • Optimizar la manera en la que se utiliza la memoria:
    • Los datos e instrucciones con los que se trabaja deben estar en memoria principal
    • Los datos e instrucciones con los que no se trabaja pueden estar descargados a memoria secundaria
    • Se debe evitar los fallos de página (necesitar algo que está en memoria secundaria, lo que nos obliga a esperar a que se traiga hasta memoria principal)
    • Se debe utilizar la memoria principal disponible para acelerar la entrada/salida (buffers y caché)

 

Entre los problemas que debe solucionar la gestión de memoria se encuentran:

Reubicación:
Como la memoria disponible estará compartida por varios procesos, el programador no puede conocer mientras programa qué área de memoria se asignará al proceso que está programando. Cuando se ejecute el programa, el SO asignará un bloque de memoria libre, que podrá ser diferente en cada ejecución.
Protección:
No resulta conveniente que un proceso pueda acceder (para leer y/o modificar) al espacio de memoria asignado a otro proceso. El SO debe garantizar la protección de memoria, de manera que se eviten accesos indebidos accidentales o intencionados.
Compartición:
En ocasiones algunos procesos necesitan intercambiar datos. Estos procesos pueden querer compartir un área de memoria a la que ambos tengan acceso. El sistema de gestión de memoria debe permitir en estos casos que los procesos autorizados accedan al bloque de memoria que comparten, de manera similar a como el sistema de ficheros permite a través de los permisos que varios usuarios compartan un fichero.
Organización lógica:
Normalmente en un sistema informático la memoria principal está organizada de forma lineal como una secuencia de posiciones de memoria. Del mismo modo la memoria secundaria se puede ver como una secuencia de bloques. Esta organización física no se corresponde con la visión del programador que estructura su programa en diferentes módulos. El sistema gestor de memoria debe permitir organizar lógicamente partes de la memoria para acercarse a la visión del programador. La técnica que más fácilmente sastisface esta necesidad es la segmentación.
Organización física:
Físicamente la memoria está organizada en dos espacios claramente diferenciados:
  • Memoria principal rápida, volátil y escasa
  • Memoria secundaria lenta, persistente y abundante
De manera que el SO debe gestionar el trasvase de información entre los dos espacios descargando al programador de esta tarea.

 

Memoria virtual

Gracias a la memoria virtual, un sistema operativo moderno presenta al usuario un espacio de memoria contiguo que puede ser mayor que la cantidad de memoria principal instalada. Esto se consigue al utilizar dinámicamente memoria secundaria para guardar información que aparentemente está en memoria principal (cuando se necesita dicha información hay que llevarla de nuevo a memoria principal). Al espacio de memoria secundaria que guarda datos que aparentan estar en memoria principal se le llama espacio de trasiego o intercambio, en el caso de GNU/Linux, espacio swap.

El uso de memoria virtual:

  • Permite que la cantidad de espacio dedicado a los procesos no esté limitado por la cantidad de memoria principal instalada. Es posible tener cargados más procesos y es posible cargar procesos más grandes.
  • Reduce la velocidad de ejecución. Cuando se ejecutan procesos que corren en memoria secundaria no se puede igualar la velocidad de proceso que se conseguiría si se utilizase memoria principal.
  • El SO debe gestionar la traducción de direcciones entre el espacio de memoria virtual y físico. Para este fín el SO se apoya en hardware específico como la MMU (unidad de gestión de memoria, normalmente integrada en la CPU).

 

Cercanía de referencias

Cuando se ejecuta un proceso, la práctica demuestra que no todas sus partes tienen el mismo peso. En cualquier proceso hay bucles, las instrucciones que están en un bucle se pueden ejecutar muchas más veces que el resto de instrucciones. Si el SO utiliza memoria virtual, puede mantener en memoria principal, como conjunto residente, la información con la que se trabaja más a menudo. En este caso puede que tener el resto de información del proceso en memoria secundaria no represente una gran pérdida de rendimiento.

La cercanía de referencias es la característica por la cual, en la práctica, las referencias a la información de un proceso está condicionada por restricciones locales. Normalmente, excepto en un salto, tras una instrucción se opera con la siguiente. Del mismo modo, datos contiguos suelen tener más probabilidad de ser accedidos en secuencia que datos dispersos. Así, el sistema gestor de memoria del SO puede tener una idea aproximada de qué datos/instrucciones se van a necesitar a continuación.

 

Segmentación

La segmentación es una técnica de gestión de memoria que divide dinámicamente la memoria en diferentes segmentos.

Un segmento:

  • Tiene un tamaño que se ajusta a lo que va a contener. Cada segmento puede tener un tamaño diferente.
  • Es un área contigua de memoria, tiene una dirección de inicio (base) y determinado tamaño (número de posiciones de memoria que ocupa).

Cuando se utiliza segmentación:

  • No existe la fragmentación interna, pero sí hay fragmentación externa. Pueden ser necesarias operaciones de compactación.
  • El segmento se adapta a la visión del programador. Un módulo se corresponde con un segmento.
  • Es fácil compartir datos entre procesos. A cada segmento se le puede asignar unos permisos diferentes, de manera similar a como se realiza la compartición de información en el sistema de ficheros.

 

Paginación

La paginación es una técnica de gestión de memoria en la que se divide toda la memoria principal en marcos de página. Todos los marcos de página tienen el mismo tamaño (típicamente 4K). Los datos con los que se trabaja están agrupados en páginas, cuando se necesita una página se puede cargar en cualquier marco de página que esté disponible.

Cuando se utiliza  paginación:

  • No existe fragmentación externa, pero sí hay  una pequeña cantidad de fragmentación interna.
  • Las estructuras de control del SO pueden incluir:
    • Por cada proceso una tabla de páginas, con una entrada para cada página correspondiente al proceso.
    • Descriptor de bloques de disco, para cada página hay una entrada que indica dónde está almacenada.
    • Tabla de marcos de página, describe el estado de cada marco en memoria principal.

 

 

Gestión combinada: Segmentación + Paginación

En algunos SO se utiliza una gestión combinada con segmentación y paginación. Se utiliza la segmentación para definir áreas de memoria para los procesos (segmento de código, datos y pila). Dentro de los segmentos se utiliza paginación. De esta manera se consiguen reunir las ventajas de ambas técnicas.

 

Traducción de direcciones

Cuando se utiliza memoria virtual, los procesos utilizan referencias lógicas a otras posiciones de memoria. Sin embargo el SO, para acabar accediendo a los datos correctos, debe traducir las direcciones lógicas en direcciones físicas. La manera en la que se realiza esta traducción depende del esquema de gestión que se utilice. Normalmente el procesador cuenta con hardware específico (la unidad de gestión de memoria, MMU) para realizar este proceso.

 

Dirección lógica:
Una dirección de memoria virtual. Identifica un dato en el espacio de memoria virtual, pero dice muy poco sobre dónde se encuentra realmente este dato.
Dirección física:
Una dirección que identifica una posición de memoria principal.

 

Traducción de direcciones con paginación

 

Una dirección lógica estará compuesta por el número de página y desplazamiento. Para obtener la dirección física, se buscará en la tabla de páginas del proceso la entrada que corresponda a la página buscada, y allí se obtendrá la dirección de memoria física en la que se encuentra cargada la página. Con el desplazamiento se puede acceder a un dato concreto en el interior de la página.

 

Suponiendo que un sistema informático utiliza direcciones lógicas de 16 bits, de los que se dedican 6 bits al identificador de página y 10 al desplazamiento:
  1. Qué máximo número de páginas puede ocupar un proceso (suponiendo que el SO mantiene una tabla de páginas independiente por cada proceso) ?
  2. Cuantas posiciones de memoria forman una página ?
  3. Cuantas posiciones de memoria puede ocupar un proceso ?
  4. Qué cantidad máxima de memoria virtual puede ocupar un proceso ?

 

Traducción de direcciones con segmentación

Cuando se utiliza segmentación, la traducción de direcciones es similar al caso de la paginación, pero como los segmentos tienen una longitud variable en la tabla de segmentos del proceso no sólo se guarda la dirección base del segmento, sinó también su longitud.

 

Buffers y caché

Gracias a la memoria virtual es posible utilizar espacio de disco, memoria secundaria, como si fuese memoria principal. También se puede utilizar la memoria principal para acelerar las operaciones de entrada/salida.

Referencias: