Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Gestion de Memoria PDF
Gestion de Memoria PDF
Procesos
...
... Micro Memoria Dispositivos
... Procesador Principal Entrada/Salida
...
...
El procesador leerá de la memoria la instrucción y los datos que debe tratar y escribirá en
ella el resultado. La velocidad a la que se realicen estas lecturas y escrituras condicionará la
rapidez y eficacia del ordenador.
1. Direccionamiento.
La memoria física puede verse como una sucesión de bytes o palabras, cada uno con su
propia dirección. Cuando se desarrolla el hardware de un ordenador se define el esquema de
direccionamiento que éste podrá utilizar. Si las direcciones que genera son de 16 bits podrá
direccionar como máximo 64k (potencia 16 de 2) y éste será el tamaño máximo del espacio de
direcciones del ordenador. Aunque tuviera instalado, por ejemplo 128k de memoria sólo podría
acceder a las primeras 64 k.
El hardware también impone la unidad mínima de información direccionable. Si esa
unidad es la palabra, las posiciones sucesivas de memoria corresponderán a palabras sucesivas y
el ordenador será direccionable por palabra. Si a lo mínimo que podemos acceder es a un octeto
(byte) el ordenador será direccionable por octeto. Cada palabra de memoria contendrá uno o
mas bytes dependiendo del diseño.
Se denomina tiempo de acceso a la memoria al que transcurre entre el inicio y el fin de
una operación de lectura o escritura sobre la misma. Otro parámetro característico es el tiempo
de memoria, que marca el retraso que impone el hardware entre el fin de una operación y el
inicio de la siguiente.
Ambos factores se utilizan como indicadores de la velocidad de la memoria principal. Sus
valores pueden varias de decenas a cientos de nanosegundos.
Punto de carga
ENLAZADOR/CARGADO
(Dirección inicio)
R
Una vez enlazado (link), el cargador podrá colocarlo en memoria asignándole el cero
relativo una dirección de carga real, y al resto de sentencias y campos los desplazamientos
correspondientes. Habrá transformado las direcciones relativas en absolutas o reales.
Memoria Memoria
Principal Caché
Memoria o
Almacenamiento
Secundario
3. Gestión de memoria.
Un recurso tan caro e influyente en el rendimiento general del ordenador deberá
gestionarse de la forma más eficaz posible. Por ello, el sistema operativo dedica una parte
importante de su software (el gestor de memoria) a su gestión, buscando la utilización mas
adecuada al servicio que debe dar (BATCH, tiempo compartido, tiempo real, etc.).
3.1.- Monoprogramación.
La memoria dedicada. Los primeros ordenadores utilizaban en régimen
dedicado. El programador disponía por completo del hardware y utilizaba la memoria a su
antojo. No existía sistema operativo ni gestor de la memoria. De esta manera la utilización de la
memoria es ineficaz y se obliga a un conocimiento profundo del hardware utilizado. El
programador tenía que dedicar gran parte de su esfuerzo a gestionar el hardware, desviándolo de
su principal objetivo(procesar determinada información).
Registro
frontera
Mem
HD
Swapping
Usuario Región
de
swapping
Monitor
3.2.- Multiprogramación.
La necesidad de utilizar más eficazmente los ordenadores, conduce a introducir la técnica
de la multiprogramación.
Para poder repartir el procesador entre varios procesos o usuarios, necesitamos tenerlos
en memoria. Por ello la memoria se divide en trozos, llamados particiones o regiones, dónde se
cargarán los diferentes procesos. El número de particiones indicará el grado de
multiprogramación del sistema.
Protección de la memoria. Si tenemos varios procesos en memoria, deberemos
proteger sus respectivas particiones de accesos indeseados. El mecanismo de protección elegido
tendrá que actuar ante cada referencia de memoria generada y deberá ser, por tanto,
especialmente rápido, de lo contrario produciría una degradación importante. Esta exigencia
explica la utilización del hardware para esta función, se puede hacer de dos formas:
A. Dos registros fijos: se pueden utilizar dos registros hardware Registro limite , de forma que
sus contenidos apunten al límite superior e inferior de la partición de que se trate. Cada
dirección generada deberá estar comprendida entre dichos valores.
Esta técnica exige que las direcciones generadas por los procesos sean absolutas,
asignadas bien durante la compilación o bien durante la carga del programa. En ambos casos
será una asignación estática, ya que la variación del contenido de los registros límite (para
cargar el programa en otra partición, por ejemplo) exigiría una nueva compilación o carga.
B. Un registro fijo y uno variable: es una solución mas flexible, consiste en cargar un registro
con la dirección del comienzo de la partición u otro con el tamaño de la misma,
denominándose Registro Base y Límite, ahora ya es posible asignar dinámicamente las
direcciones, ya que bastará actualizar el contenido del registro base para apuntar a otra zona
de memoria. Cada dirección generada por el proceso deberá ser menor que el contenido del
registro límite, y si se le sumara el contenido del registro base para obtener la dirección
absoluta correspondiente. Los programas podrán cargarse en cualquier partición de tamaño
adecuado bastará cambiar el registro de base.
Particiones contiguas de tamaño fijo Se puede dividir la memoria en
particiones contiguas de tamaño fijo. El número de estas y sus tamaños se definirá al iniciar el
sistema y quedarán fijados para toda la sesión.
Cuando tenga que iniciar un programa, el sistema le asignará una partición que pueda
contenerlo. Será necesario que los programas declaren sus necesidades de memoria al sistema.
Memoria
128K
128K
128K
128K
Particiones Fijas
Todos los programas se colocan en cola única de espera, y será el sistema el encargado de
seleccionar cual cargar en la partición disponible en un momento dado. El planificador de
trabajos del sistema es el componente encargado de hacer dicha selección, y los puede hacer
respetando el orden de llegada de los programas. De esta forma para una partición libre se elegirá
el primer programa de la cola si cabe en ella, en caso contrario quedará desocupada y el resto de
los programas deberán esperar que se libere una partición de tamaño adecuado para el primero.
Este criterio de selección (FIFO) es simple de programar pero puede provocar cierta
infrautilización de la memoria. El planificador puede lograr mayor eficacia si cada vez que debe
seleccionar un trabajo, analiza la cola de espera buscando:
* El trabajo de tamaño mas adecuado a la partición libre
* El primero que quepa en la partición disponible.
Los sistemas que vayan a procesar trabajos de tamaños similares podrán utilizar
algoritmos FIFO, que son más fáciles de codificar y provocan menor sobrecarga. Por el
contrario, si deben tratar trabajos con necesidades distintas de memoria deberán recurrir a
técnicas complejas, como el intercambio.
Intercambio: Se pueden mejorar el rendimiento si se le añaden técnicas de
intercambio a la gestión de particiones. Los programas pendientes de un evento o interrupción se
pueden llevar a almacenamiento secundario, cargando en su lugar otro programa disponible.
Analizando la utilización de las particiones aparece otro aspecto negativo. Si nuestro
sistema posee tres particiones de 14k, 10k y 6k, un programa de 11 k se deberá cargar en la
primera partición desaprovechando durando su ejecución 3k. Se produce Fragmentación interna
(queda un trozo de memoria sin utilizar) de la memoria. Si en el mismo ejemplo suponemos
ocupadas las particiones de 14k y 10k y existen trabajos de 7k, 8k y 9k esperando, nos
encontraremos con una partición inutilizable aún habiendo necesidad de memoria. Se ha
producido Fragmentación externa (el programa que se quiere cargar es mayor que el espacio
disponible en la partición de memoria) de la memoria.
Rendimiento: El desarrollo de particiones contiguas de tamaño fijo
representó un gran avance, sin embargo su eficacia quedaba condicionada por la elección del
tamaño y número de las particiones en relación con las características de los programas a tratar.
Particiones contiguas de tamaño variable. Los inconvenientes de la técnica
anterior nacen de la dificultad de definir unas particiones de tamaño adecuado para todos los
trabajos que se deben tratar, pero desarrollando una técnica de gestión que asigna dinámicamente
la memoria a los trabajos de acuerdo con su tamaño se soluciona el problema.
El sistema operativo mantendrá una tabla interna donde registrará las zonas de memoria
disponible o huecos, a cada trabajo le asignará una partición del tamaño solicitado, descontando
dicha cantidad de la citada tabla. Esta es la técnica de particiones contiguas de tamaño variable.
Si queda alguna parte de la memoria libre que no quepa el siguiente trabajo se produce
una Fragmentación externa. Cada trabajo irá terminando en un tiempo determinado e irán
entrando otros trabajos en su lugar, siempre que quepan en la partición desocupada. Cuando se
creen fragmentaciones el gestor de memoria unificará todos estos huecos contiguos con el fin de
disponer de huecos mayores, esto se conoce como compactación.
Compactación: Es la técnica utilizada por algunos sistemas para combatir
el proceso de fragmentación que sufre la memoria. La idea es recolocar las zonas de memorias
utilizadas para lograr un único hueco de memoria disponible. Pero la puesta en práctica de esta
idea no es tan sencilla, pues los programas se pueden mover de formas diferentes quedando el
hueco al final o en el medio, mirando siempre la forma que menos Kb se tengan que desplazar,
ya que su coste en tiempo puede ser considerable.
Esta técnica exige que los trabajos sean reubicables y por tanto, solo será utilizable en
aquellos sistemas en los que las direcciones de memoria se asignen durante la ejecución.
Rendimiento: Utilizando particiones variables: se logra un mejor
aprovechamiento de la memoria, pero la fragmentación continúa siendo un problema importante.
Su rendimiento, esta condicionado por la selección que se haga de los trabajos a cargar en
memoria. Para ello se necesitan nuevas técnicas de gestión de la memoria para sistemas
multiprogramación y multiusuario. Estas son la gestión de memoria virtual.
3.3.- Paginación.
Frames
...
...
Prof.: Justo Sáez Arenas ... 8
Sistemas Informáticos Multiusuario y en Red
T-8. – Gestión de Memoria.
Utilizando p como índice el sistema recorrerá toda la Tabla de paginas (Tpg) hasta
localizar dicha página, a continuación sumará el desplazamiento a la dirección de carga
correspondiente y obtendrá la dirección real adecuada.
Cada programa se subdivide en páginas y estas se cargan en frames libre que no tienen
que ser contiguos. La arquitectura del ordenador establece el tamaño de las páginas y por tanto
de los frames, que suelen ser en potencia de 2.
El sistema analizará cada nuevo trabajo para conocer el número de páginas que ocupa y
buscará en su lista de frames libres un número igual de frames. Si encuentra suficientes, cargará
en ellas las páginas del programa y construirá la correspondiente tala de páginas, actualizando la
lista de frames libres. Cada trabajo en memoria poseerá su propia Tpg apuntada por el bloque de
control del propio trabajo, accesible mediante instrucciones privilegiadas por el sistema. De esta
manera se logra evitar la fragmentación externa, ya que cualquier frame libre es asignable a un
trabajo que necesite memoria.
Rendimiento. Memoria Caché. Para agilizar la conversión de direcciones el sistema
mantiene en memoria la Tpg de cada uno de los trabajos activos, y utiliza un registro especial
llamado Registro Base de Tabla de Páginas, que indica la dirección de la Tpg del trabajo en
ejecución en ese momento. De forma que, cuando deba conmutar a otro trabajo, además de
restaurar el contador de programa y demás indicadores, cargará en dicho registro la dirección de
la Tpg correspondiente.
Para transformar cada dirección lógica (p,d) generada por el procesador en su dirección
real, el sistema deberá acceder primero a la tabla de páginas correspondiente (registro base + p) y
posteriormente a la dirección real(frame +d). De esta manera cada dirección provoca dos accesos
a memoria y se duplican los tiempos de ejecución.
Se ha logrado mejorar la utilización de la memoria pero a costa de una mayor duración de
los procesos. Para solventar este problema se recurrió a memorias pequeñas de muy alta
velocidad (y muy costosas) donde mantener las entradas de la Tpg mas utilizadas. Esta
memoria, conocida como Memoria caché , que es funcionalmente como la memoria principal
pero mucho más rápida, con lo que se reduce notablemente el retraso debido a la paginación.
En caso de sistemas pequeños, con tablas de paginas de pocas entradas se puede utilizar
un grupo de registros de hardware para contener la Tpg, llamados Registros asociativos, cada
uno de ellos dividido en una parte de clave y otra con contenido. La búsqueda de una entrada de
la Tpg por clave, se realiza a la vez en todos los registros y se obtiene inmediatamente su
dirección de frame. Los algoritmos que se emplean en el reemplazamiento de página son FIFO
(primero en entrar, primero en salir).
Páginas compartidas. Esta técnica de la paginación permite que varios procesos o
usuarios compartan páginas cargadas en memoria. Esta posibilidad es especialmente positiva
para los sistemas de tiempo compartido.
Puesto que es muy común utilizar páginas que son comunes para varios procesos, el
contenido de estas debe permanecer inalterado, por lo que deben ser protegidas contra todo
intento de escritura, para ello se añaden a las entradas de la tabla de páginas una serie de bits de
protección que van a indicar si dicha página puede ser sólo leída, o puede ser modificada, etc. De
tal forma que si el sistema operativo detecta que se quiere escribir en una página de memoria que
tiene su bit de protección activado contra escritura no lo permitirá.
3.4.- Segmentación.
Segmentación. Los programas se desarrollan, generalmente en torno a un cuerpo central
desde el que se bifurca a otras partes, rutinas, o se accede a zonas de datos (tablas, pilas matrices,
etc.). Desde este punto de vista el programa es un conjunto de componentes lógicos de tamaño
variable, un conjunto de segmentos.
De esta manera el espacio lógico de direcciones se puede considerar como un conjunto de
segmentos, cada uno definido por su tamaño y número.
Toda dirección lógica se expresará mediante dos valores: número de segmento, s, y
desplazamiento dentro del segmento.
La segmentación del programa la realizará el compilador. En general es similar a la
paginación, teniendo en cuenta que ahora si tiene sentido emplear una técnica para determinar la
colocación de los segmentos en memoria, pudiendo ser la del mejor ajuste la que se emplee.
Puesto que la memoria física se direcciona linealmente con un número, será necesario
transformar cada dirección ól gica (s, d) en una dirección real unidimensional (r). Esta conversión
la realiza un dispositivo especial de hardware consultando la tabla de segmentos correspondiente.
Esta técnica permite reducir la fragmentación interna, ya que se asigna a cada programa
la cantidad de memoria que requiere.
La carga de programa en memoria exige la búsqueda de los huecos adecuados a sus
segmentos intentando ajustar lo más posible.
Al igual que la paginación la segmentación requiere el uso de memorias caché y también
permite utilizar segmentos compartidos.
* Puesto que cada programa ocupa menos memoria real, se puede elevar el índice de
multiprogramación y, por tanto, la eficiencia del sistema.
* Al cargar menos cantidad de cada programa se necesitan menos operaciones de e/s para
las operaciones de carga e intercambio de los mismos.
Esta técnica surgió con la finalidad de permitir que pudiesen trabajar muchos usuarios
simultáneamente en el ordenador, a pesar de contar con una cantidad escasa de memoria. Su en
un sistema multiusuario y multiprogramación hay muchos usuarios que desean ejecutar sus
programas, parece claro que aunque pongamos mucha memoria es seguro que se terminará
llenando y habrá usuarios que no puedan ejecutar sus programas y tengan que esperar a que
terminen los afortunados que consiguieron entrar a tiempo. Esto tiene mas significación
actualmente ya que los programas cada vez son mayores, y muchos de ellos ni siquiera se
podrían ejecutar aunque tuvieran disponible toda la memoria del ordenador.
Imaginemos un programa que se está ejecutando, lógicamente empezaría por la primera
instrucción e iría ejecutándose una tras otra hasta terminar. Pero a lo largo de su ejecución no
siempre es necesario tener todas las instrucciones del programas. Así cuando comienza, las
instrucciones del final no son en absoluto necesarias ya que todavía tardará en llegar a ellas para
ejecutarlas. Por ello el sistema operativo podría tomar solo la parte de instrucciones y de datos
que son realmente necesarios y copiarlos en la memoria, dejando el resto en el disco. Solo
cuando necesite las partes que están en el disco las traería a la memoria y devolvería al disco lo
anterior que ya no es necesario, es decir, sustituirá unos trozos del programa por otros según se
vayan necesitando.
El usuario no notará nada especial, quizás que se ejecuta algo mas lento (debido al tiempo
necesario para leer del disco el trozo y copiarlo en la memoria, que no sería necesario si
estuviese todo el programa en memoria), pero parecería que está todo en memoria ejecutándose
normalmente. Es decir el usuario tienen la ilusión de que todo su programa está en memoria, de
ahí el nombre de gestión de la memoria Virtual.
Las diferentes partes de un programa se van cargando en memoria a medida que se
necesitan, por lo que debemos considerar los siguientes conceptos:
A. Carga: las funciones del programa se cargaran cuando se necesiten en respuesta a una
“petición de página” o bien cargarlo por adelantado que se conoce como
“anticipación o prepaginación”.
B. Colocación: cuando se utiliza segmentación al cargar un nuevo segmento se deberá
decidir en que hueco colocarlo.
C. Sustitución: lo normal será tener toda la memoria ocupada y cuando se necesita cargar
una nueva parte de programa hay que sacar otra de la memoria y realizar lo que se
denomina “reemplazo de página”.
páginas”, que será un punto clave a la hora de diseñar el sistema, puesto que puede producir un
retraso adicional en la ejecución de los programas.
Cuando la memoria principal está llena de páginas y es necesario cargar una nueva
deberemos seguir algún criterio para sacar una de las que ya están cargadas, esto conlleva una
sobrecarga importante.
La rutina del sistema que gestiona la falta de páginas trabaja de la siguiente forma:
1. Encontrar la página solicitada en el almacenamiento secundario.
2. Encontrar un frame libre, y si existe utilizarlo.
3. Si no hay un frame libre utilizar un “algoritmo de reemplazamiento” para seleccionar
la página a reemplazar.
4. Salvar la página reemplazada en el almacenamiento secundario actualizando las
tablas que correspondan.
5. Llevar la página solicitada al frame libre y actualizar la tabla que corresponda.
La situación optima sería poder prever que páginas serán pedida, lo cual es imposible,
pero podemos prever en cierta medida el comportamiento del sistema partiendo de la experiencia
del pasado, viendo las necesidades que han ido teniendo los procesos.
Los algoritmos que se han ideado para controlar el reemplazamiento serán mas o menos
eficientes en función de dos factores:
A. Número de falta de páginas que provoca, es decir, numero de veces en que no se
encuentra en memoria la página solicitada.
B. Coste de su utilización, es decir, la sobrecarga que se produce en el sistema al utilizar
dicho algoritmo.
- Algoritmo FIFO: el más sencillo, cuando se necesita sustituir una página se elige aquella que
lleve más tiempo en memoria. Algoritmo fácil de programar que produce poca sobrecarga en
el sistema pero su eficacia es relativa sobre todo en sistemas de tiempo compartido.
- Algoritmo LRU (Least Recently Used): se basa en sustituir aquella página que haya sido
usada menos recientemente. En este caso la utilización del tiempo de uso es un criterio que
refleja mucho mejor el comportamiento de los procesos en su utilización de memoria.
Ponerlo en práctica es relativamente complicado ya que se debe contabilizar el tiempo en el
que se produce cada referencia a memoria para poder clasificas las páginas según su uso.
Esto se puede realizar de varias formas:
A. Contadores de Hardware: la solución más simple es incorporar un contador de
referencias a memoria y añadir un campo a las entradas de la tabla de páginas que
pueda almacenar el valor de dicho contador. Para reemplazar una página el sistema
busca el valor del contador registrado que sea menor.
B. Matrices de hardware: si se dispone de n frames, el hardware debe mantener una
matriz de n * n bits inicializados a cero. Cuando se quiere acceder a una página se
ponen a uno todos los bits de la fila de esa página y a cero los de la columna (menos
4. Consideraciones de diseño.
Al diseñar la gestión de un sistema operativo una parte muy importante es elegir los
algoritmos de asignación de página, de asignación de frames y reemplazamiento de paginas. Pero
hay otros aspectos a tener en cuenta, una de los más importantes es el tamaño de las paginas que
afecta notablemente al rendimiento del sistema. Este factor esta limitado por las características
de la propia maquina y decidir su tamaño no es sencillo puesto que hay que equilibrar diversos
factores:
1. Tabla de páginas: estas se encuentran en memoria principal y es necesario reducir su
tamaño lo que nos condiciona a diseñar páginas grandes y así conseguir tablas de
páginas más pequeñas.
2. Fragmentación: el tamaño de los programas no suele ser múltiplo exacto de paginas,
loo que nos produce la ya comentada fragmentación externa e interna. Ello nos
recomienda páginas pequeñas.
3. Transferencia: llevar una página del almacenamiento secundario a memoria y
viceversa conlleva la mayor parte de consumo de tiempo de un sistema. Desde este
punto de vista es bueno que las páginas sean grandes para hacer menos intercambio
con el almacenamiento secundario.
4. Falta de página: a mayor tamaño de pagina menos faltas de páginas.
El tamaño de las páginas es siempre una potencia de dos pudiendo variar entre 512 y
4096 bytes dependiendo de cada fabricante.
La gestión de la memoria debe posibilitar también compartir páginas entre procesos
(páginas compartidas). Las cuales llevarán un indicativo (por ejemplo, un bit) que les asegure un
tratamiento especial.
5. Tendencias actuales.