Administración de memoria
- El administrador de memoria del SO lleva la cuenta de cuáles partes de la memoria están en uso, asigna memoria a los procesos y la desasigna cuando terminan
- Si no hubiera una abstracción de memoria, sólo podría haber un programa en MP a la vez para que no haya conflictos (el resto iría al disco temporalmente)
Espacios de direcciones
- Para que los programas no interfieran entre sí o con el SO, este crea un área de direcciones que un proceso tendrá permiso para usar
- Durante la ejecución, el inicio de esta zona de memoria se cargan los extremos de esta zona de MP en los registros
base
ylimit
del CPU - Luego para acceder a las direcciones, se usa un offset (
direccionBase + direccionRelativa = direccionRealEnMP
)
- Durante la ejecución, el inicio de esta zona de memoria se cargan los extremos de esta zona de MP en los registros
Estrategias de administración
Hay dos estrategias para cargar muchos procesos en RAM (manejar la sobrecarga):
- Intercambio
- La memoria del proceso se carga por completo a RAM en ejecución, y en un bloqueo vuelve en su totalidad al disco
- #Memoria virtual
Si un proceso necesita más espacio en la memoria, debe estar adyacente a un espacio vacío. La memoria libre se puede administrar con:
Con mapa de bits
- La memoria se divide en unidades de asignación, que son referenciadas en un mapa de bits (un array de booleanos donde
0=Libre; 1=Ocupado
)
Con listas ligadas (linked lists)
La memoria se divide de igual forma en los segmentos, pero en lugar de usar un bit por cada segmento, se guarda en una estructura: la ocupación (hueco o proceso), el desplazamiento de inicio y la longitud de esa ocupación.
Esto da lugar a varias maneras de buscar espacio libre para un nuevo proceso:
- Primer ajuste: El administrador de memoria explora la lista hasta encontrar el primer hueco lo suficientemente grande
- Siguiente ajuste: Explora hasta el primer hueco, asigna la memoria, y guarda el índice de la lista para continuar la búsqueda desde allí en la próxima llamada
- Mejor ajuste: Recorre toda la lista y asigna en el hueco más pequeño que sirva para asignar
- Peor ajuste: Idem, pero usa el hueco más grande
- Ajuste rápido: Mantiene listas separadas para los tamaños de asignación más comunes
Segmentación
- La segmentación es una manera de dividir la memoria de trabajo de un proceso
- Es voluntaria, o sea que el programador (o más bien el compilador) se encarga de dividir el programa en trozos de distintos tamaños que tienen distintos tipo de datos
- Habrá un segmento
.text
que contenga los procedimientos del programa - Otro
.data
con las constantes iniciales - Entre otros...
- Habrá un segmento
- Estos segmentos se mapean en memoria, usando un registro
base
yoffset
(desplazamiento) para acceder a ellos en memoria - Esta técnica se usa en conjunto con la #Memoria virtual pues puede ocurrir que un segmento no quepa en la memoria principal en un momento dado
Memoria virtual
- Paginación: Se divide la memoria del proceso en páginas que se intercambian entre MP y disco según lo necesite el proceso
- Distintas páginas del disco se van cargando a marcos de memoria en RAM
- Dirección virtual: Las direcciones relativas que el programa referencia
- Usando memoria virtual, las referencias a direcciones virtuales son interceptadas por la MMU, convertidas a la dirección física, y pasadas a la CPU
- Ocurre un fallo de memoria cuando un proceso necesita una porción de memoria que está guardada en disco (y el SO debe cargar ese fragmento a un marco en RAM)
- En el hardware, un bit de presencia indica cuáles páginas están físicamente en memoria
Tablas de páginas
- Se encuentra en la MMU
- Para asociar direcciones virtuales a físicas la dirección virtual se codifica con un número de página virtual y un desplazamiento (mediante los bits de mayor y menor orden respectivamente)
- CUIDADO: Si el proceso referencia un segmento con un desplazamiento mayor al límite de ese segmento, se crea un error de paginación
Estructura de la tabla de páginas
En esta tabla, una entrada contiene los bits (Orden de der. a izq.):
- Número de marco de página
- Presente (si está cargada en un marco)
- Protección (permisos:
0 = R/W; 1 = RO
) - Modificada/Sucia (dirty)
- Indica si la memoria en esta página fue modificada, para que el SO sepa que debe actualizar la página guardada en el disco antes de borrarla del marco
- Referenciada
- Indica si la página fue usada (para R/W)
- Ayuda a los algoritmos de reemplazo de páginas a saber cuáles páginas son importantes
- Caché deshabilitado
- Importante cuando una página se asocia con registros de dispositivos en lugar de MP
Algoritmos de reemplazo de página
Algoritmo óptimo
- Cada página se etiqueta con la cantidad de instrucciones que se van a ejecutar antes de que se referencie por primera vez y se descarta la de mayor etiqueta
No usadas recientemente
Cuando ocurre un fallo de página, el SO categoriza todas las páginas presentes en:
Clase | Referenciada | Modificada |
---|---|---|
0 | ||
1 | ✔ | |
2 | ✔ | |
3 | ✔ | ✔ |
El algoritmo elimina una página al azar de la menor clase
FIFO
- Primero en entrar, primero en salir.
- Se usa una lista enlazada (linked list) de todas las páginas en memoria, ordenada de la más vieja en la cabeza de la lista (al principio) y la más reciente en la cola (al final)
Segunda oportunidad
- Modificación del FIFO, pero se inspecciona el bit
R
de la página más vieja - Si es 0, se sustituye esta página
- Si es 1, se borra el bit (
R=0
) y se pone al final de la fila (se pone como reciente) y sigue la búsqueda
Reloj
- Se ponen los marcos en una lista circular, y un índice (manecilla) apuntando a la página más antigua
- En el fallo, si la página más vieja no fue referenciada (
R=0
), se desaloja y la manecilla avanza - Si
R=1
, se borra el bit (R=0
), avanza la manecilla y se repite hasta encontrar un marco conR=0
Menos usadas recientemente (LRU)
- Se descarta la página que no se haya usado por la mayor cantidad de tiempo
- Se mantiene una lista enlazada con la página de uso más reciente al frente y la menos usada al final
- Algoritmo del envejecimiento: También se puede usar un contador para cada página, y en cada interrupción de reloj añadirle el bit
R
(0 o 1) y eliminar la página que tenga menor contador
Conjunto de trabajo
WSClock
- Setup similar al #Reloj (lista circular de marcos)
- Mientras se cargan páginas, se agregan a la lista para formar un anillo
- Cada entrada contiene el tiempo de último uso del algoritmo básico del conjunto de trabajo, el bit R y el bit M
- ~
Anexo
Definiciones previas y abreviaturas
MP = Memoria principal (RAM del sistema)
R/W = L/E = Lectura/Escritura
RO = Sólo Lectura
Sobrepaginación: Ocurre cuando un proceso produce fallos de página cada pocas instrucciones
Prepaginación: Cargar las páginas antes de permitir que se ejecute un proceso
Conjunto de trabajo: El conjunto de páginas que necesita el proceso en un momento dado.
Es el conjunto de páginas referenciadas por un proceso en los últimos
El tiempo de CPU que un proceso usó desde que empezó