Memoria Real
La memoria real o principal es en donde son ejecutados los programas y procesos de una computadora y es el espacio real
que existe en memoria para que se ejecuten los procesos.
Por lo general esta memoria es de mayor costo que la memoria secundaria, pero el acceso a la información contenida en
ella es de mas rápido acceso.
Los términos “memoria” y “almacenamiento” se consideran equivalentes.
Los programas y datos deben estar en el almacenamiento principal para:
Poderlos ejecutar.
Referenciarlos directamente
Solo la memoria cache es mas rápida que la principal, pero su costo es a su vez mayor.
Cuando no existe memoria virtual no hay diferenciación entre el espacio de direcciones y la memoria real; el espacio de
direcciones que puede ser usado en los programas tiene idéntico tamaño al espacio de memoria real posible. Si se utiliza
memoria virtual, el espacio de direcciones disponibles para los programas es aquel determinado por el tamaño de la
memoria virtual implementada y no el espacio de direcciones provisto por la memoria real disponible (el espacio de la
memoria virtual sera mayor que el de la memoria real).
La organización y administración de la “memoria principal”, “memoria primaria” o “memoria real” de un
sistema ha sido y es uno de los factores mas importantes en el diseño de los S. O.
Memoria auxiliar
La memoria secundaria o auxiliar es en un ordenador el conjunto de
dispositivos que permiten almacenar datos complementarios a aquellos que se
archivan en la memoria principal.
En informática y para un ordenador típico, existen dos tipos de memoria: la principal y
la secundaria. Se considera memoria principal a la que usualmente es parte inherente
del sistema, consiste en un disco rígido o duro que se ubica en el interior del CPU o
Unidad Central Procesadora y puede (o no) ampliarse a discreción del usuario. Estas
memorias a menudo tienen una capacidad de más de 100GB y permiten almacenar
buena parte de los archivos y datos que un usuario emplea habitualmente.
Por otro lado, la memoria secundaria funciona como un dispositivo complementario y
suele ubicarse por fuera del ordenador, como uno o más periféricos que cuentan con
espacio adicional para almacenar más datos que los que entran en el disco duro de
la computadora. Si bien a menudo se trata de memorias más lentas o con menor
capacidad, son una buena opción de complemento a la hora de ampliar
la disponibilidad de espacio de un ordenador cualquiera.
Si se habla de memoria auxiliar, puede hacerse referencia a los antiguos
diskettes, un disco o CD-ROM, DVDs, unidades de memoria flash, discos Zip y
otras alternativas. Cada una de ellas presenta diversas características que la adecuan
a uno u otro propósito. Además, en la mayoría de los casos pueden adquirirse con
distintos tamaños, de acuerdo con las necesidades del usuario.
Los dispositivos de memoria auxiliar se vinculan al ordenador por medio de puertos USB
o en casos se relacionan directamente con la memoria principal, conformando un sub-
sistema. Además, muchas de ellas permiten la movilidad del dispositivo, transportando
información de un ordenador a otro con facilidad y rapidez. Así, se amplía
la experiencia del usuario en trabajo en red.
¿Qué es la memoria virtual y para qué
sirve?
Hoy queremos responder a las posibles dudas que surjan en torno a qué es la memoria virtual y para
qué sirve. No descubrimos nada afirmando que la memoria de nuestros equipos, en sus diferentes
formas, es una de las piezas cruciales del mismo.
A través de esta memoria, las piezas clave para el procesamiento y transformación de la información de
nuestros ordenadores obtienen los datos que necesitas; mientras que, en el caso de la memoria
persistente, también nos ayuda a mantener dentro de nuestras máquinas todo nuestro trabajo, recuerdos
y aficiones. Existen muchos tipos de esta memoria, pero una de las más desconocidas es, sin duda, la
memoria virtual.
Índice de contenidos
Entendiendo a la memoria virtual
Cuál es el origen de este tipo de “memoria”
Qué problemas entraña el uso de memoria virtual
Entendiendo a la memoria virtual
Cuando hablamos de memoria virtual, no estamos hablando de un módulo de RAM que podamos
visualizar entre las piezas de nuestro equipo. Hablamos de una técnica de gestión de la memoria del
equipo, cuyo uso reside en la utilización conjunta de la memoria principal del sistema y nuestra unidad de
almacenamiento, como un disco duro. Es decir, es una técnica que usa el sistema para emplear parte de
nuestro almacenamiento como un módulo más de memoria; como, por poner un ejemplo que
podamos localizar rápido, la memoria RAM.
Gracias a la memoria virtual nuestro sistema puede usar parte del almacenamiento
como si se tratara de memoria adicional.
Esto sucede porque la memoria de nuestro equipo no son un conjunto de módulos físicos, sino un
sistema interconectado que opera a diferentes niveles. La memoria virtual es, generalmente, el último nivel
de acceso; ya que su clasificación depende de su velocidad, latencia y facilidad de acceso. Pero también es
la de menor tamaño, por lo que, gracias a su uso, podemos “descargar” gran parte de la información de la
memoria principal para dejar paso a más datos. Su integración con el sistema es completa, por lo que no
nos debería suponer ningún tipo de impedimento para con el uso normal de nuestro equipo.
Cuál es el origen de este tipo de “memoria”
Aunque ahora es normal ver equipos con memorias RAM que superan los 16 gigabytes, y cachés de varios
niveles que llegan a los megas de capacidad; en el pasado, la memoria era uno de los recursos más
limitados de nuestros equipos. Cualquier forma de “ahorrar” o descargar memoria era válido para operar
con gran cantidad de datos, ya que si nos quedamos sin memoria se nos imposibilita la capacidad de
ejecutar programas de forma normal.
Adquirir un módulo de RAM podía ser terriblemente caro antiguamente
La memoria virtual surgió como uno de estos métodos de ahorro y descarga, permitiéndonos hacer más
en equipos con poca memoria disponible, sin necesidad de adquirir más unidades de memoria
adicionales. Generalmente caras en el pasado. Era una medida muy útil en casos de necesidad, o para
llevar a cabo trabajos que no podríamos hacer en un equipo con cierta cantidad de memoria.
Debido a su utilidad, es una función que seguimos viendo aún hoy en sistemas operativos modernos,
aunque con tamaña cantidad de memoria que manejan los equipos modernos, no solemos requerir de la
ayuda de la memoria virtual para agilizar la capacidad del equipo.
Qué problemas entraña el uso de memoria virtual
Aunque la integración de la memoria virtual en nuestro equipo es completa, y el sistema trata a este
espacio adicional como memoria adicional; la velocidad que alcanzan nuestros sistemas de
almacenamiento, así como la latencia de estas, no puede equipararse a la de una memoria preparada
como la memoria RAM.
Los equipos que requieran el acceso a información ubicada en la memoria virtual porque el resto de
memoria del sistema esté en uso se verán afectados por este hecho; siendo más lentos a la hora de tratar
estos datos que en un equipo que disponga de más espacio “físico” en su memoria.
La memoria virtual no puede sustituir a la memoria física preparada para su
cometido. A la hora de la verdad, una ampliación de RAM será más útil.
Aún hoy, con la existencia de unidades SSD de alta velocidad, estos dispositivos y tecnologías no pueden
equipararse a velocidad a la memoria tradicional. Es normal, pues su cometido es almacenar información
incluso antes de leerla, moverla y escribirla; como sí sucede con otros tipos de memoria.
Te recomendamos la lectura de nuestra guía sobre las mejores memoria RAM
A pesar de esto, la memoria virtual sigue siendo un recurso de utilidad del que no deberíamos
prescindir en nuestros equipos por si, llegado el momento, requerimos de su utilidad una vez más.
Administración de memoria:
Simple:
Particionada:
Relocalizable:
Paginada:
En sistemas operativos de computadoras, los sistemas de paginación de memoria dividen los programas en
pequeñas partes o páginas. Del mismo modo, la memoria es dividida en trozos del mismo tamaño que las páginas
llamados marcos de página. De esta forma, la cantidad de memoria desperdiciada por un proceso es el final de su
última página, lo que minimiza la fragmentación interna y evita la externa.
En un momento cualquiera, la memoria se encuentra ocupada con páginas de diferentes procesos, mientras que
algunos marcos están disponibles para su uso. El sistema operativo mantiene una lista de estos últimos marcos, y
una tabla por cada proceso, donde consta en qué marco se encuentra cada página del proceso. De esta forma, las
páginas de un proceso pueden no estar continuamente ubicadas en memoria, y pueden intercalarse con las
páginas de otros procesos.
En la tabla de páginas de un proceso, se encuentra la ubicación del marco que contiene a cada una de sus
páginas. Las direcciones lógicas ahora se forman como un número de página y de un desplazamiento dentro de
esa página (conocido comúnmente como offset). El número de página es usado como un índice dentro de la tabla
de páginas, y una vez obtenida la dirección del marco de memoria, se utiliza el desplazamiento para componer la
dirección real o dirección física. Este proceso se realiza en una parte del computador específicamente diseñada
para esta tarea, es decir, es un proceso hardware y no software.
De esta forma, cuando un proceso es cargado en memoria, se cargan todas sus páginas en marcos libres y se
completa su tabla de páginas.
Veamos un ejemplo:
Número de
Programa.#página Dirección física
marco
0 Programa A.0 1000:0000
1 Programa A.1 1000:1000
2 Programa A.2 1000:2000
3 Programa D.0 1000:3000
4 Programa D.1 1000:4000
5 Programa C.0 1000:5000
6 Programa C.1 1000:6000
7 Programa D.2 1000:7000
La tabla de la derecha muestra una posible configuración de la memoria en un momento dado, con páginas de
4Kb. La forma en que se llegó a este estado puede haber sido la siguiente:
Se tienen cuatro procesos, llamados A, B, C y D, que ocupan respectivamente 3, 2, 2 y 3 páginas.
1. El programa A se carga en memoria (se le asignan los marcos 0, 1 y 2)
2. El programa B se carga en memoria (se le asignan los marcos 3 y 4)
3. El programa C se carga en memoria (se le asignan los marcos 5 y 6)
4. El programa B termina, liberando sus páginas
5. El programa D se carga en memoria (se le asignan los marcos 3 y 4 que usaba el proceso B y el marco 7
que permanecía libre)
De esta forma, las tablas simplificadas de cada proceso se ven de esta forma:
Proceso A
Página Dirección física
0 1000:0000
1 1000:1000
2 1000:2000
Proceso B
Página Dirección física
- -
- -
Proceso C
Página Dirección física
0 1000:5000
1 1000:6000
Proceso D
Página Dirección física
0 1000:3000
1 1000:4000
2 1000:7000
Ahora consideremos qué sucede cuando un programa quiere acceder a su memoria. Si el programa A contiene una
referencia a la memoria con dirección 20FE, se realizará el siguiente procedimiento. 20FE es 0010000011111110
en notación binaria (en un sistema de 16 bit), y en el ejemplo se están usando páginas de 4Kb de tamaño. Cuando
la petición de la dirección de memoria 20FE es realizada, la Unidad de Gestión de memoria se ve de esta forma:
0010000011111110 = 20FE
|__||__________|
| |
| v
| Posición de memoria dentro de la página (0FE)
v
Número de página (0010 = 2)
Tabla de paginación
Entrada a la tabla de
páginas
n = @ página física V P L E M
* n = bits de la @ lógica -log2(número de palabras de una página).
* V: bit de validez.
* P: bit de persistencia.
* L: bit de derecho a lectura.
* E: bit de derecho a escritura.
* M: bit de modificación.
Al usar páginas de 4096 bytes, todas las ubicaciones dentro de una página pueden ser representadas por 12 bits,
en el sistema binario (212=4096), lo que deja 4 bits para representar el número de página. Si las páginas hubieran
sido de la mitad del tamaño (2048) se podrían tener 5 bits para el número de página, lo que significa que a menor
tamaño de página se pueden tener tablas con más páginas.
Cuando el pedido de acceso a memoria es realizado, la MMU busca en la tabla de páginas del proceso que realizó
el pedido por la relación en memoria física. En nuestro ejemplo, la página número 2 del proceso A corresponde al
marco número 2 en memoria física, con dirección real 1000:2000, por lo tanto, la MMU devolverá la dirección del
marco en memoria física, con el desplazamiento dentro de esa página: 1000:20FE.
Segmentación:
Es un esquema de manejo de memoria mediante el cual la estructura del programa refleja su división lógica;
llevándose a cabo una agrupación lógica de la información en bloques de tamaño variable denominados segmentos.
Cada uno de ellos tienen información lógica del programa: subrutina, arreglo, etc. Luego, cada espacio de
direcciones de programa consiste de una colección de segmentos, que generalmente reflejan la división lógica del
programa.
La segmentación permite alcanzar los siguientes objetivos:
1. Modularidad de programas: cada rutina del programa puede ser un bloque sujeto a cambios y recopilaciones,
sin afectar por ello al resto del programa.
2. Estructuras de datos de largo variable: ejm. Stack, donde cada estructura tiene su propio tamaño y este puede
variar.
3. Protección: se puede proteger los módulos del segmento contra accesos no autorizados.
4. Comparición: dos o más procesos pueden ser un mismo segmento, bajo reglas de protección; aunque no sean
propietarios de los mismos.
5. Enlace dinámico entre segmentos: puede evitarse realizar todo el proceso de enlace antes de comenzar a
ejecutar un programa. Los enlaces se establecerán solo cuando sea necesario.
Ventajas de la segmentación
El esquema de segmentación ofrece las siguientes ventajas:
El programador puede conocer las unidades lógicas de su programa, dándoles un tratamiento particular.
Es posible compilar módulos separados como segmentos el enlace entre los segmentos puede suponer hasta
tanto se haga una referencia entre segmentos.
Debido a que es posible separar los módulos se hace más fácil la modificación de los mismos. Cambios dentro de
un modulo no afecta al resto de los módulos.
Es fácil el compartir segmentos.
Es posible que los segmentos crezcan dinámicamente según las necesidades del programa en ejecución.
Existe la posibilidad de definir segmentos que aun no existan. Así, no se asignara memoria, sino a partir del
momento que sea necesario hacer usos del segmento. Un ejemplo de esto, serian los arreglos cuya dimensión no
se conoce hasta tanto no se comienza a ejecutar el programa. En algunos casos, incluso podría retardar la
asignación de memoria hasta el momento en el cual se referencia el arreglo u otra estructura de dato por primera
vez.
Desventajas de la segmentación
Hay un incremento en los costos de hardware y de software para llevar a cabo la implantación, así como un
mayor consumo de recursos: memoria, tiempo de CPU, etc.
Debido a que los segmentos tienen un tamaño variable se pueden presentar problemas de fragmentación
externas, lo que puede ameritar un plan de reubicación de segmentos en memoria principal.
Se complica el manejo de memoria virtual, ya que los discos almacenan la información en bloques de tamaños
fijos, mientras los segmentos son de tamaño variable. Esto hace necesaria la existencia de mecanismos más
costosos que los existentes para paginación.
Al permitir que los segmentos varíen de tamaño, puede ser necesarios planes de reubicación a nivel de los discos,
si los segmentos son devueltos a dicho dispositivo; lo que conlleva a nuevos costos.
No se puede garantizar, que al salir un segmento de la memoria, este pueda ser traído fácilmente de nuevo, ya
que será necesario encontrar nuevamente un área de memoria libre ajustada a su tamaño.
La comparticion de segmentos permite ahorrar memoria, pero requiere de mecanismos adicionales da hardware
y software.
Estas desventajas tratan de ser minimizadas, bajo la técnica conocida como Segmentación paginada.
Segmentada:
es una técnica de gestión de memoria que pretende acercarse más al punto de vista del usuario. Los programas se
desarrollan, generalmente, en torno a un núcleo central (principal) desde el que se bifurca a otras partes (rutinas) o
se accede a zonas de datos (tablas, pilas, etc).
Desde este punto de vista, un programa es un conjunto de componentes lógicos de tamaño variable o un conjunto
de segmentos, es decir, el espacio lógico de direcciones se considera como un conjunto de segmentos, cada uno
definido por un identificador, y consistente de un punto de inicio y el tamaño asignado. 1
La segmentación de un programa la realiza el compilador y en ella cada dirección lógica se expresará mediante
dos valores: Número de segmento (s) y desplazamiento dentro del segmento (d).
Una de las implementaciones más obvias y directas de un espacio de memoria segmentado es asignar un
segmento distinto a cada una de las secciones del espacio en memoria de un proceso.
La segmentación también ayuda a incrementar la modularidad de un programa: Es muy común que las bibliotecas
enlazadas dinámicamente estén representadas en segmentos independientes.