Requisitos De La Gestion De Memoria
Enviado por • 9 de Enero de 2014 • 2.548 Palabras (11 Páginas) • 709 Visitas
REQUISITOS DE LA GESTIÓN DE MEMORIA
Al realizar un estudio de los diversos mecanismos y políticas relacionadas con la gestión de
memoria, vale la pena tener en mente los requisitos que se intentan satisfacer: A.M.
Lister, R.D. Eager proponen cinco requisitos:
• Reubicación
• Protección
• Compartición
• Organización lógica
• Organización física
Reubicación
En un sistema multiprogramado, la memoria disponible se encuentra normalmente
compartida por varios procesos. En general, el programador no puede conocer por
adelantado qué otros programas residirán en memoria en el momento de la ejecución del
programa. Además, se busca poder cargar y descargar los procesos activos en la memoria
principal para maximizar el uso del procesador, manteniendo una gran reserva de
procesos listos para ejecutar. Una vez que un programa haya sido descargado al disco, se
limitará a declarar que, cuando vuelva a ser cargado, debe situarse en la misma región de
memoria principal que antes.
De este modo, se sabe antes de tiempo dónde debe situarse un programa y hay que
permitir que el programa pueda moverse en memoria principal como resultado de un
intercambio. Esta situación plantea algunos asuntos técnicos relativos al
direccionamiento, tal y como se muestra en la figura 1, que representa la imagen de un
proceso. Por simplicidad, se supondrá que la imagen del proceso ocupa una región
contigua de la memoria principal. Sin duda, el sistema operativo tiene que conocer la
ubicación de la información de control del proceso y de la pila de ejecución, así como el
punto de partida para comenzar la ejecución del programa para dicho proceso. Puesto
que el sistema operativo gestiona.
Fig. 1. Requisitos de direccionamiento para un proceso.
la memoria y es responsable de traer el proceso a memoria principal, estas direcciones
deben ser fáciles de conseguir. Además, el procesador debe ocuparse de las referencias a
memoria dentro del programa. Las instrucciones de bifurcación deben contener la
dirección que haga referencia a la instrucción que se vaya a ejecutar a continuación. Las
instrucciones que hagan referencia a datos deben contener la dirección del byte o de la
palabra de datos referenciada. De algún modo, el hardware del procesador y el software
del sistema operativo deben ser capaces de traducir las referencias a memoria
encontradas en el código del programa a las direcciones físicas reales que reflejen la
posición actual del programa en memoria principal.
Compartición
Cualquier mecanismo de protección que se implemente debe tener la flexibilidad de
permitir el acceso de varios procesos a la misma zona de memoria principal. Por ejemplo,
si una serie de procesos están ejecutando el mismo programa, resultaría beneficioso
permitir a cada proceso que acceda a la misma copia del programa, en lugar de tener cada
uno su propia copia aparte.
Los procesos que cooperan en una tarea pueden necesitar acceso compartido a la misma
estructura de datos. El sistema de gestión de memoria debe, por tanto, permitir accesos
controlados a las áreas compartidas de la memoria, sin comprometer la protección básica.
De nuevo, se verá que los mecanismos empleados para respaldar la reubicación forman
parte básica de las capacidades de compartición.
Organización Lógica
De forma casi invariable, la memoria principal de un sistema informático se organiza como
un espacio de direcciones lineal o unidimensional que consta de una secuencia de bytes o
palabras. La memoria secundaria, a nivel físico, se organiza de forma similar. Si bien esta
organización refleja fielmente el hardware de la máquina, no se corresponde con la forma
en la que los programas están construidos habitualmente. La mayoría de los programas se
organizan en módulos, algunos de los cuales no son modificables (sólo lectura, sólo
ejecución) y otros contienen datos que se pueden modificar. Si el sistema operativo y el
hardware del computador pueden tratar de forma efectiva los programas de usuario y los
datos en forma de módulos de algún tipo, se conseguirá una serie de ventajas, tales como:
1. Los módulos pueden escribirse y compilarse independientemente, mientras que el
sistema resuelve durante la ejecución todas las referencias de un módulo a otro.
2. Con un escaso coste adicional, pueden otorgar‘_ varios grados de protección (sólo
lectura, sólo ejecución) a los distintos módulos.
3. Es posible introducir mecanismos por medio de los cuales los procesos puedan
compartir módulos. La ventaja de ofrecer compartición a nivel de módulo es que esto se
corresponde con la visión del problema que tiene el usuario y, por tanto, es fácil para el
usuario especificar la compartición que desea.
La herramienta que más fácilmente satisface estas necesidades es la segmentación, que es
una de las técnicas de gestión de memoria estudiadas en este capítulo.
Organización Física
Recordemos que la memoria de la computadora se organiza en, al menos, dos niveles:
memoria principal y memoria secundaria. La memoria principal ofrece un acceso rápido
con un coste relativamente alto. Además, la memoria principal es volátil; esto es, no
proporciona almacenamiento permanente. La memoria secundaria es más lenta y barata
que la memoria principal y, normalmente, no es volátil. De este modo, una memoria
secundaria de gran capacidad puede permitir un almacenamiento a largo plazo de
programas y datos, al tiempo que una memoria principal pequeña mantiene los
programas y datos de uso actual.
En este esquema a dos niveles, la organización del flujo de información entre la memoria
principal y la secundaria tiene un gran interés en el sistema. La responsabilidad de este
flujo podría asignarse al programador, pero esto es impracticable e indeseable, debido a
dos razones:
1. La memoria principal disponible para un programa y sus datos puede ser insuficiente.
En este caso, el programador debe emplear una práctica que se conoce como
superposición (overlaying), en la cual el programa y los datos se organizan de tal forma
que puede haber varios módulos asignados a la misma región de memoria, con un
programa principal responsable del intercambio de los módulos según se necesite. Incluso
con la ayuda de herramientas de compilación, la programación superpuesta malgasta el
tiempo del programador.
2. En un entorno multiprogramado, el programador no conoce durante la codificación
cuánto espacio habrá disponible o dónde estará este espacio. Resulta claro entonces que
la tarea de mover información entre los dos niveles de memoria debe ser responsabilidad
del sistema. Esta tarea es la esencia de la gestión de memoria.
Paginación Simple
Tanto las particiones de tamaño fijo como las de tamaño variable hacen un uso ineficiente
de la memoria; las primeras generan fragmentación interna, mientras que las segundas
originan fragmentación externa. Supóngase, no obstante, que la memoria principal se
encuentra particionada en trozos iguales de tamaño fijo relativamente pequeños y que
cada proceso está dividido también en pequeños trozos de tamaño fijo y del mismo
tamaño que los de memoria. En tal caso, los trozos del proceso, conocidos como páginas,
pueden asignarse a los trozos libres de memoria, conocidos como marcos o marcos de
página. En este apartado se verá que el espacio malgastado en memoria para cada
proceso por fragmentación interna consta sólo de una fracción de la última página del
proceso. Además, no hay fragmentación externa.
Fig.2 Paginación Simple
En un instante dado, algunos de los marcos de memoria están en uso y otros están libres.
El sistema operativo mantiene una lista de los marcos libres. El proceso A, almacenado en
disco, consta de cuatro páginas. Cuando llega el momento de cargar este proceso, el
sistema operativo busca cuatro marcos libres y carga las cuatro páginas del proceso A en
los cuatro marcos. El proceso B, que consta de tres páginas y el proceso C, que consta de
cuatro, se cargan a continuación. Más tarde, el proceso B se suspende y es expulsado de
memoria principal. Después, todos los procesos de memoria principal están bloqueados y
el sistema operativo tiene que traer un nuevo proceso, el proceso D, que consta de cinco
páginas. Supóngase ahora, como en este ejemplo, que no hay suficientes marcos sin usar
contiguos para albergar al proceso. ¿Impedirá esto al sistema operativo cargar D? La
respuesta es negativa, puesto que se puede emplear de nuevo el concepto de dirección
lógica. Ya no será suficiente con un simple registro base. En su lugar, el sistema operativo
mantiene una tabla de páginas para cada proceso. La tabla de páginas muestra la posición
del marco de cada página del proceso.
Dentro del programa, cada dirección lógica constará de un número de página y de un
desplazamiento dentro de la página. Recuérdese que, en el caso de la partición simple,
una dirección lógica era la posición de una palabra relativa al comienzo del programa; el
procesador realizaba la traducción a dirección física. Con paginación, el hardware del
procesador también realiza la traducción de direcciones lógicas a físicas.
Ahora, el procesador debe saber cómo acceder a la tabla de páginas del proceso actual.
Dada una dirección lógica (número de página, desplazamiento), el procesador emplea la
tabla de páginas para obtener una dirección física (número de marco, desplazamiento).
Continuando con el ejemplo, las cinco páginas del proceso D se cargan en los marcos
4, 5, 6, 11 y 12. La siguiente figura muestra las distintas tablas de páginas en este instante.
Cada tabla de páginas contiene una entrada por cada página del proceso, por lo que la
tabla se indexa
Fig.3 Estructura de datos para el ejemplo de la figura anterior en el periodo de tiempo
(f)
fácilmente por número de página (comenzando en la página 0). En cada entrada de la
tabla de páginas se encuentra el número de marco en memoria, si lo hay, que alberga la
página correspondiente.
Además, el sistema operativo mantiene una lista de marcos libres con todos los marcos
de memoria que actualmente están vacíos y disponibles para las páginas.
Así pues, se puede comprobar que la paginación simple, tal y como se describe, es similar
a la partición estática. Las diferencias están en que, con paginación, las particiones son
algo más pequeñas, un programa puede ocupar más de una partición y éstas no tienen
por qué estar contiguas.
Para aplicar convenientemente este esquema de paginación, el tamaño de la página y, por
tanto, el tamaño del marco, deben ser una potencia de 2. En este caso, la dirección
relativa, definida en relación al origen del programa y la dirección lógica, expresada como
un número de página y un desplazamiento, son las mismas. En la figura 4 se muestra un
ejemplo, donde se emplean direcciones de 16 bits y el tamaño de página es de 1K = 1024
bytes. La dirección relativa 1502 es 0000010111011110 en binario. Con un tamaño de
página de 1K, se necesitan 10 bits para el campo de desplazamiento, dejando 6 bits para el
número de página. De este modo, un programa puede estar formado por un máximo de 2
6 = 64 páginas de 1Kb cada una. Como muestra la figura 4 La dirección relativa 1502 se
corresponde con un desplazamiento de 478 (0111011110) en la página 1 (000001), lo que
genera el mismo número de 16 bits, 0000010111011110. 0000010111011110.
Dos son las consecuencias de usar un tamaño de página potencia de dos. Primero, el
esquema de direccionamiento lógico es transparente al programador, al ensamblador y al
montador. Cada dirección lógica de un programa (número de página, desplazamiento) es
idéntica a su dirección relativa. Segundo, resulta relativamente sencillo realizar una
función hardware para llevar a cabo la traducción de direcciones dinámicas durante la
ejecución. Considérese una dirección de n + m bits, en la que los n bits más significativos
son el número de página y los m bits menos significativos son el desplazamiento. En el
ejemplo (figura 6.9), n=6 y m=10. Para la traducción de direcciones hay que dar los
siguientes pasos:
• Obtener el número de página de los n bits más significativos de la dirección lógica.
• Emplear el número de página como índice en la tabla de páginas del proceso para
encontrar el número de marco k.
• El comienzo de la dirección física del marco es k x 2 m y la dirección física del byte
referenciado es este número más el desplazamiento. No hace falta calcular esta dirección
física, sino que se construye fácilmente concatenando el número de marco con el
desplazamiento.
En el ejemplo, se tiene la dirección lógica 0000010111011110, que se corresponde con el
número de página 1 y desplazamiento 478. Supóngase que esta página reside en el marco
de memoria principal 6 = 000110 en binario. Entonces la dirección física es el marco 6,
desplazamiento 478 = 0001100111011110 (figura 5).
Resumiendo, mediante la paginación simple, la memoria principal se divide en pequeños
marcos del mismo tamaño. Cada proceso se divide en páginas del tamaño del marco; los
procesos pequeños necesitaran pocas páginas, mientras que los procesos grandes
necesitarán más.
Cuando se introduce un proceso en memoria, se cargan todas sus páginas en los marcos
libres y se rellena su tabla de páginas. Esta técnica resuelve la mayoría de los problemas
inherentes a la partición.
Fig 4. Direcciones Lógicas
Segmentación Simple
Otro modo de subdividir el programa es la segmentación. En este caso, el programa y sus
datos asociados se dividen en un conjunto de segmentos. No es necesario que todos los
segmentos de todos los programas tengan la misma longitud, aunque existe una longitud
máxima de segmento. Como en la paginación, una dirección lógica segmentada consta de
dos partes, en este caso un número de segmento y un desplazamiento.
Como consecuencia del empleo de segmentos de distinto tamaño, la segmentación
resulta similar a la partición dinámica. En ausencia de un esquema de superposición o del
uso de memoria virtual, sería necesario cargar en memoria todos los segmentos de un
programa para su ejecución. La diferencia, en comparación con la partición dinámica,
radica en que, con segmentación, un programa puede ocupar más de una partición y éstas
no tienen por qué estar contiguas. La segmentación elimina la fragmentación interna,
pero, como la partición dinámica, sufre de fragmentación externa. Sin embargo, debido a
que los procesos se dividen en un conjunto de partes más pequeñas, la fragmentación
externa será menor.
Mientras que la paginación es transparente al programador, la segmentación es
generalmente visible y se proporciona como una comodidad para la organización de los
programas y datos Normalmente, el programador o el compilador asigna los programas y
los datos a diferentes segmentos. En aras de la programación modular, el programa o los
datos pueden ser divididos de nuevo en diferentes segmentos. El principal inconveniente
de este servicio es que el programador debe ser consciente de la limitación de tamaño
máximo de los segmentos.
Otra consecuencia del tamaño desigual de los segmentos es que no hay una
correspondencia simple entre las direcciones lógicas y las direcciones físicas. De forma
análoga a la paginación, un esquema de segmentación simple hará uso de una tabla de
segmentos para cada proceso y una lista de bloques libres en memoria principal. Cada
entrada de tabla de segmentos tendría que contener la dirección de comienzo del
segmento correspondiente en memoria principal. La entrada deberá proporcionar
también la longitud del segmento para asegurar que no se usan direcciones no válidas.
Cuando un proceso pasa al estado Ejecutando, se carga la dirección de su tabla de
segmentos en un registro especial del hardware de gestión de memoria. Considérese una
dirección de n + m bits, en la que los n bits más significativos son el número de segmento
y los m bits menos significativos son el desplazamiento. En el ejemplo (figura 6.9c), n=4y
m= 12. Así pues, el máximo tamaño de segmento es 2 12 = 4096. Para la traducción de
direcciones hay quedar los siguientes pasos:
• Extraer el número de segmento de los n bits más significativos de la dirección lógica.
• Emplear el número de segmento como índice en la tabla de segmentos del proceso para
encontrar la dirección física de comienzo del segmento.
• Comparar el desplazamiento, expresado por los m bits menos significativos, con la
longitud del segmento. Si el desplazamiento es mayor que la longitud, la dirección no es
válida.
• La dirección física buscada es la suma de la dirección física de comienzo del segmento
más el desplazamiento. En el ejemplo, se emplea la dirección lógica 0001001011110000,
que se corresponde con el número de segmento 1 y desplazamiento 752. Supóngase que
dicho segmento está en memoria principal y comienza en la dirección física
0010000000100000. Entonces la dirección física será 0010000000100000 + 001011110000
= 0010001100010000.
En definitiva, con segmentación simple, un proceso se divide en varios segmentos que no
tienen por qué ser del mismo tamaño. Cuando un proceso se introduce en memoria, se
cargan todos sus segmentos en regiones de memoria libres y se rellena la tabla de
segmentos.
Fig. 5 Ejemplos de traducción de dirección lógica a física.
...