Memory Management

Download Report

Transcript Memory Management

Administración de Memoria
Capítulo 7
1
Requerimientos de un sistema de AM
• Reubicación
– El programador no sabe dónde su
programa será ubicado en memoria
principal cuando éste es cargado y
ejecutado
– Durante su ejecución, el proceso
puede ser swapeado a disco y vuelto a
ser cargado en una ubicación distinta
de memoria
– Las referencias a memoria deben ser
traducidas a direcciones de memoria
física
2
Requerimientos de un sistema de AM
• Protección
– Los procesos no debieran ser capaces de referenciar direcciones de memoria fuera
de su espacio de direccionamiento (excepción: memoria compartida)
– Es imposible chequear direcciones físicas en tiempo de compilación, por lo tanto
el chequeo se hace en tiempo de ejecución
– ¿Qué pasa con memoria dinámica?
– Ya que el SO no puede anticipar todas las referencias a memoria que un programa
hará, es el hardware el que debe proveer los mecanismos de protección
• Compartición
– Se debe permitir que los procesos compartan áreas de memoria
– Sincronización
– Es mejor que compartan memoria a que cada proceso tenga una copia particular
del dato
3
Requerimientos de un sistema de AM
• Organización local
– Los programas son organizados como módulos, por ejemplo: módulo de datos,
módulo de código, etc
– Los módulos se pueden compilar independientemente uno de otros
– Se puede asignar distintos grados de protección a los diferentes módulos (readonly, execute-only)
– Los módulos se pueden compartir entre procesos (visión virtual de los procesos)
– Segmentación
• Organización física
– La memoria se organiza en niveles (por ejemplo: mem física, mem secundaria)
– El movimiento de datos de un nivel a otro es responabilidad del SO
4
Esquemas de particionamiento
• Los sistemas de AM modernos utilizan el concepto de Memoria Virtual
• La MV usa principalmente dos técnicas para subdividir la memoria
– Paginación
– Segmentación
• Antes de estudiar estos sistemas, veremos esquemas simples de
particionamiento de la memoria que NO involucran MV
– Particionamiento fijo
– Particionamiento variable
5
Particionamiento fijo
• La memoria se divide en particiones
del mismo tamaño
• Si tamaño del proceso es menor o
igual que el tamaño de la partición,
y existe una partición libre, entonces
puede ser cargado en memoria
• Si todas la particiones están
ocupadas, el SO podría swapear a
disco un proceso
• Problemas
– ¿Qué pasa si el proceso no cabe?
• Overlays
• Particiones de distinto tamaño, pero
fijas
– Fragmentación interna: espacio
dentro de la partición no usada por
el proceso
6
Algoritmos de posicionamiento con
particiones fijas
• Particiones de igual tamaño
– No importa dónde poner el
proceso
– Si la memoria está llena,
swapear alguno, ¿cuál? 
algoritmos de reemplazo
• Particiones de varios tamaños
– Podría asignar la partición más
pequeña donde quepa el proceso
(best-fit)
– Si usamos una cola para cada
partición  se minimiza
fragmentación interna
– ¿Qué pasa si no hay ningún
proceso de una tamaño dado?
7
Principales ventajas/desventajas
particionamiento fijo
• Método simple de implementar
– Reubicación y protección sencillo
– Mínimo overhead de software
• El número de particiones es fijo y determinado en tiempo de booteo lo cual
limita el nivel de multiprogramación
• Procesos pequeños harán uso ineficiente del espacio
• Siempre puede existir un proceso más grande que la partición más grande
Particionamiento fijo de la memoria no es usado en SO modernos
8
Particionamiento dinámico
• Si existe suficiente memoria, se crea una partición del mismo tamaño que la
del proceso que se quiere cargar
• El número y tamaño de las particiones varía
• Eventualmente la memoria se
llena de espacios pequeños inútiles
• Fragmentación externa
• Usar compactación para crear un
único espacio contiguo
9
Algoritmos de posicionamiento en
particionamiento dinámico
• Best-fit
• First-fit algorithm
– Usa el bloque de memoria
más pequeño entre los
suficientemente grandes
para alojar al proceso
– Peor rendimiento
– El más lento
– Produce alta
fragmentación externa
– Necesidad de compactar
la memoria a menudo
– Busca desde el
comienzo el primer
bloque que sirva
– El más veloz
– Generalmente el que
produce mejores
resultados
• Next-fit
– Busca desde la última
posicion el primer
bloque que sirva
– Rendimiento
marginalmente peor
que First-fit
10
11
Método buddy (pareja)
• Inicialmente, toda la memoria es considerada una partición de tamaño 2U
• Si llega un proceso de tamaño s, tal que 2U-1 < s <= 2U, todo el bloque es
asignado
• Si no, el bloque es divido en 2 buddies de igual tamaño de 2U-1
• Si 2U-2 < s <= 2U-1 se asigna uno de los buddies, si no el proceso de división
continúa hasta que se genera un bloque de tamaño suficiente para alojar el
proceso
• Cuando se libera un bloque de 2U y su buddie está libre, ambos se unen en un
solo bloque de 2U+1
12
13
• Las hojas representan el particionamiento actual de la memoria
•Si dos buddies son hojas, entonces necesariamente uno de ellos está
asignado
14
Tipos de direcciones
• Lógica
– Referencia a una dirección de memoria independiente de la ubicación real en
memoria física
– Se debe traducir en dirección física
• Física
– Dirección absoluta en memoria principal
• Relativa
– Dirección expresada en términos relativos a otra dirección
15
16
Paginación
• La memoria se divide en bloques relativamente pequeños de igual tamaño,
llamados marcos
• Divide los procesos en bloques del mismo tamaño, llamados páginas
• El SO mantiene una tabla de páginas para cada proceso
– Contiene el marco donde cada página fue asignada
– Una dirección de memoria consiste de un número de página y un offset
dentro de la página
• Sólo la última página contiene fragmentación interna
17
Ejemplo
18
Ejemplo (cont)
19
Tablas de páginas del ejemplo
20
Importancia tamaño de página potencia de 2
21
Direccionamiento con paginación
22
Segmentación
• Particiona la memoria en segmentos lógicos desde el punto de vista del
programador
– Programa principal
– Datos
– funciones
• Los segmentos tienen un largo variable y no sufren de fragmentación interna,
pero si de fragmentación externa
• Generalmente existe un tamaño máximo de segmento
• Direccionamiento: número de segmento + offset dentro de segmento
23
Carga y enlazamiento de programas
• La primera etapa en la creación de un proceso es cargar un
programa en memoria principal
• La aplicación puede consistir en uno o más módulos
objetos, los cuales son “linkeados” por el linker.
• El loader carga el módulo linkeado en memoria
24
Carga
• Carga absoluta
–
–
–
–
El módulo de carga siempre es cargado en la misma dirección de memoria
Luego, todas la referencias a memorias son a direcciones físicas (absolutas)
La decisión de dónde se carga el módulo es en tiempo de compilación
Si el módulo se modifica y recompila, las direcciones cambiarían
• Carga reubicable
– En vez de tener referencias absolutas, el compilador genera referencias relativas
las cuales se resuelven en tiempo de carga
– Típicamente la direcciones son relativas al inicio del módulo (dirección cero)
– Luego si el cargador decide cargar el módulo en la dirección x, entonces
simplemente suma x a todas la referencias a memoria
• Carga dinámica
– Ni carga absoluta, ni carga reubicable permite que un proceso sea supendido y
vuelto a carga en memoria
– En carga dinámica el cargador no traduce las referencias relativas al momento de
cargar el módulo
– La referencias son traducidas a direcciones físicas en tiempo de ejecución
25
Carga
26
Linking
• La función de un linker es tomar una
colección de módulos objetos y producir
un módulo de carga
• Cada módulo puede contener
referencias simbólicas a funciones de
otros módulos.
• El linker resuelve estas referencias en
módulo unificado con direcciones
relativas.
• Linking dinámico en tiempo de carga
– La referencias a módulos externos son
resueltas en tiempo de carga
• Linking dinámico en tiempo de
ejecución
– Las referencias a módulos externos son
resueltas en tiempo de ejecución
27