Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Podemos entender la memoria principal como un inmenso casillero, donde cada casilla está numerada
(con una dirección) y puede almacenar una palabra.
Una palabra es el conjunto de bits que la arquitectura de un ordenador puede manejar como un todo.
Los tamaños de palabra más comunes son de 16, 32 ó 64 bits.
Para que un programa pueda ejecutarse, sus instrucciones y sus datos tendrán que estar presentes en
la memoria principal del sistema, lo que conocemos como memoria RAM. Como hemos visto más
arriba, planificando el uso del procesador, mejoraremos el rendimiento general del sistema, pero esto
implicará la necesidad de compartir la memoria principal entre varios procesos de forma simultánea.
Por lo tanto, una buena administración de la memoria, repercutirá de forma inmediata en el
comportamiento de todo el sistema informático.
El gestor de memoria deberá asignar la porción necesaria de memoria principal a cada proceso que
lo necesite.
Los sistemas operativos modernos son, casi siempre, multiprogramados. Es decir, ejecutan varios
procesos de forma concurrente. Esto significa que la memoria debe dividirse para darles cabida.
Cuanto más eficaz sea ese reparto, más procesos podrán ejecutarse a la vez, lo que redundará en un
mayor rendimiento del sistema (no debemos olvidar que el procesador es el elemento más rápido del
sistema y que el objetivo principal consiste en que siempre tenga instrucciones listas para ser
ejecutadas).
2.2.2.1 Paginación
En la Gestión de memoria con particiones variables, hemos visto que la memoria disponible tiende
a no estar en posiciones contiguas, por lo que se produce una considerable fragmentación externa
(la memoria disponible se dispersa a lo largo del espacio de direcciones.
Para resolver esta circunstancia, se planteó la posibilidad de que el espacio de memoria que usa un
determinado proceso no tuviese que estar en posiciones contiguas. Así, en un esquema de paginación,
la memoria se divide en trozos del mismo tamaño que reciben el nombre de marcos de página (o, en
inglés, frames). Del mismo modo, los procesos se dividen en fragmentos del mismo tamaño
denominados páginas. De este modo, cuando llegue un nuevo proceso, el único problema será
encontrar la cantidad suficiente de marcos de página disponibles en la memoria principal.
Como podrás suponer, este esquema necesita un método que traduzca las direcciones virtuales a
direcciones físicas, teniendo en cuenta la ubicación real de cada marco de página. Este método se basa
en la creación de una tabla de páginas, para cada proceso, en el momento de cargarlo en memoria.
En ella se establecerá el paralelismo entre cada página y su marco de página correspondiente.
Por lo tanto, las direcciones virtuales constarán de un número de página y un desplazamiento dentro
de ella. El número de página actuará como índice en la tabla de páginas.
Además, es frecuente que el sistema operativo mantenga una lista de marcos de página disponibles.
Las direcciones virtuales también suelen llamarse direcciones relativas y suelen asignarse durante la
compilación del programa, siendo relativas al comienzo del mismo (que será la dirección 0 de la
página 0).
Dado que este método implica constantes traducciones de direcciones virtuales a direcciones físicas,
para evitar que el sistema sufra una importante penalización de rendimiento, habrá que recurrir a un
hardware específico para la traducción.
o Con marcos de página pequeños, tendremos poca fragmentación interna y tablas de páginas
grandes.
o Con marcos de página grandes, tendremos más fragmentación interna y tablas de páginas
pequeñas.
Usando la paginación, se pueden seguir aplicando técnicas de intercambio, para mover a memoria
secundaria, los procesos que se encuentran bloqueados en espera de un suceso.
2.2.2.2 Segmentación
Hasta ahora, hemos visto el problema de la gestión de memoria desde el punto de vista del sistema
operativo, donde la asignación de memoria se realiza en función del tamaño total de un proceso o
dividiendo éste en porciones de la misma longitud. Sin embargo, los programadores y los usuarios
necesitan manejar sus datos de un modo más flexible: Tanto las funciones y procedimientos en las
que se dividen los programas, como las estructuras en las que se organizan los datos (como tablas o
pilas), tienen tamaños diversos.
Por lo tanto, podemos decir que un programa es un conjunto de elementos lógicos de tamaños
variables.
Para dar cobertura a este planteamiento, la segmentación plantea que en el momento de compilar un
programa, éste se convierta en un conjunto de segmentos a los que se asignará un identificador, un
punto de inicio y un tamaño. Las direcciones se expresarán mediante un número de segmento y un
desplazamiento dentro de él, y el tamaño asegura que no se realizan referencias a direcciones ilegales
dentro del segmento.
Además, como cada componente lógico del proceso se encuentra en un segmento diferente, podemos
mejorar la protección haciendo que los segmentos que contienen código sean de solo lectura.
También podemos asegurar que un fragmento de código no acceda al código de un fragmento
diferente.
Por otra parte, al encontrarse cada bloque lógico del programa en un segmento distinto, podría
compartirse código entre diferentes programas de un modo sencillo.
Dado que la segmentación ofrece ventajas desde el punto de vista del usuario, pero la paginación
simplifica la perspectiva del sistema operativo, cuando el tamaño de los segmentos es grande, es
frecuente que se utilice una combinación de ambas. La idea es dividir cada segmento en páginas de
longitud fija para su ubicación en memoria.
o Dado que cada segmento tiene su propia tabla de páginas, el espacio destinado al
o Como cada segmento tiene su propia tabla de páginas, podremos tener un marco de páginas
incompleto al final de cada uno de los segmentos asignados a un proceso, lo que implica una
Todos los métodos estudiados hasta el momento suponen que un proceso debe estar completamente
cargado en memoria para poder ejecutarse. Sin embargo, el modelo de Memoria virtual aplica los
mecanismos de intercambio que ya hemos mencionado para que las partes de un proceso que no
estén siendo utilizadas en un momento concreto, puedan residir en memoria secundaria. De esta
forma, se libera una mayor cantidad de memoria principal para albergar un número de procesos
superior. Además, este planteamiento nos permitiría ejecutar procesos que fuesen más grandes que
la memoria física.
Normalmente se implementa a partir de los conceptos de paginación y/o segmentación que hemos
estudiado antes.
Mientras dura toda esta operación, el proceso que originó el fallo de página permanece en estado
Bloqueado.
Para saber qué páginas se encuentran en memoria principal y cuáles están en el disco, la tabla de
páginas puede incluir un bit de presencia.
Este tipo de esquemas consiguen que la memoria se aproveche mucho mejor. Además, al poder cargar
más procesos en la misma cantidad de memoria, el procesador estará mejor aprovechado. Sin
embargo, si se produce una situación que provoque una cantidad elevada de fallos de página, los
accesos a disco se multiplicarán y el rendimiento puede caer de forma considerable. Este fenómeno
recibe el nombre de hiperpaginación.
Los contenidos de este capítulo se encuentran bajo una licencia Creative Commons Reconocimiento – No Comercial –
Sin Obra Derivada 3.0. Puedes encontrar todos los detalles en
http://creativecommons.org/licenses/by-nc-nd/3.0/deed.es