La memoria es uno de los
recursos más valiosos que gestiona el sistema operativo. Uno de los
elementos principales que caracterizan un proceso es la memoria que
utiliza. Ésta está lógicamente separada de la de cualquier otro
proceso del sistema (excepto los threads de un mismo proceso que
comparten normalmente la mayor parte de la memoria que tienen
asignada). Un proceso no puede acceder, al espacio de memoria
asignado a otro proceso, lo cual es imprescindible para la seguridad
y estabilidad del sistema. El direccionamiento es una parte
importante de la gestión de memoria, puesto que influye mucho en la
visión del mismo por parte de un proceso, como en el aprovechamiento
del hardware y el rendimiento del sistema. En Linux, además, un
proceso tiene dos espacios de memoria: el espacio de memoria del
usuario, único para ese proceso, y el espacio de memoria del kernel,
idéntico en todos los procesos.
MEMORIA VIRTUAL.
El tamaño combinado del
programa, datos y pila puede exceder la cantidad de memoria física
disponible. El
sistema operativo guarda aquellas partes del programa
concurrentemente en uso en memoria central y el
resto en disco.
Cuando un programa espera que se le cargue en memoria central de
disco otra parte del
mismo, la CPU se puede asignar a otro proceso.
El sistema operativo
gestiona niveles de memoria principal y memoria secundaria:
• Transferencia de
bloques entre ambos niveles (normalmente basada en paginación).
• De memoria
secundaria a principal: por demanda.
• De memoria principal
a secundaria: por expulsión.
Paginación.
El espacio virtual de
direcciones se divide en unidades llamadas páginas, todas del mismo
tamaño. La
memoria principal se divide en marcos de páginas (page
frames) del mismo tamaño que las páginas virtuales
y son
compartidas por los distintos procesos del sistema (en cada marco de
página se carga una página de un
proceso).
No todo el espacio
virtual de direcciones está cargado en memoria central. Una copia
completa se encuentra
en disco y las páginas se traen a memoria
central cuando se necesitan.
Segmentación.
El espacio de
direcciones se divide en segmentos, cada uno de los cuales
corresponderá a una rutina
(procedimiento, función), un programa o
un conjunto de datos (una entidad lógica). Todo aquello que se
corresponda con sub-espacio de direcciones independientes.
Cada programa contiene
una cierta cantidad de segmentos. Los primeros segmentos se reservan
para
procedimientos, datos y pila, pertenecientes al programa en
ejecución. Los segmentos restantes contienen un
archivo por
segmento, así que los procesos pueden direccionar todos sus archivos
directamente sin tener que
abrirlos ni usar primitivas especiales de
entrada/salida. Cada archivo puede crecer de forma completamente
independiente de los otros, con cada byte direccionado por un par
(segmento, desplazamiento).Por otro lado,
colocando objetos
diferentes en diferentes segmentos, se facilita la compartición de
estos objetos entre procesos múltiples.
Segmentación Paginada.
Como su propio nombre
indica, la segmentación paginada intenta aunar lo mejor de los dos
esquemas. La
segmentación proporciona soporte directo a las
regiones del proceso y la paginación permite un mejor
aprovechamiento de la memoria y una base para construir un esquema de
memoria virtual. Con esta técnica,
un segmento está formado por un
conjunto de páginas, y por tanto, no tiene que estar contiguo en
memoria.
Paginación por
Demanda.
Segmentación pura no es
adecuada para memoria virtual ⇒ Tamaño de segmentos variable.
Paginación y
segmentación paginada sí son para memoria virtual ⇒ (1) Bloque
transferido → Página (2)
Memoria virtual + Paginación →
Paginación por demanda.
Estrategia de
implementación: Uso del bit de validez, donde la página no
residente se marca como no válida.
Acceso a una página
(Excepción de falta de página de la MMU al kernel del sistema
operativo si la página
no está en la MMU): el kernel del sistema
operativo trae la página correspondiente de memoria secundaria
⇒
el kernel del sistema operativo debe diferenciar entre página no
residente y página inválida.
Prepaginación ⇒ Traer
páginas por anticipado (no por demanda): En caso de falta de página
se traen
además otras páginas que se consideran que necesitará el
proceso → Beneficiosa dependiendo de si hay acierto en la
predicción.
Tratamiento de falta de
página (peor de los casos, falta de página puede implicar dos
operaciones de E/S al
disco) ⇒ Tratamiento de la excepción
provocado por la MMU (dirección de fallo disponible en registro).
Algoritmos de Reemplazo
de Página.
Objetivo de los
algoritmos de reemplazo: Minimizar la tasa de fallos de página. Cada
algoritmo tiene versión
local y global: local ⇒ criterio se
aplica a las páginas residentes del proceso, y global ⇒ criterio
se aplica a
todas las páginas residentes. Algoritmos conocidos:
Óptimo, FIFO (First In First Out), Clock (Reloj o segunda
oportunidad) = FIFO + uso del bit de referencia; y LRU (Least
Recently Used). Además estos algoritmos se
utilizan en técnicas de
buffering de páginas.
LRU ⇒ Criterio:
reemplaza la página residente menos usada recientemente. Está
basado en el principio de
proximidad temporal de referencias: si es
probable que se vuelve a referenciar las páginas accedidas
recientemente, entonces la página que se debe reemplazar es la que
no se ha referenciado desde hace más
tiempo. Sutileza en su versión
global: menos recientemente usada en el tiempo lógico de cada
proceso (no
tiempo real).Difícil implementación estricta (hay
aproximaciones) ⇒ Precisaría una MMU específica. Posible
implementación con hardware específico: en entrada de TP hay un
contador, en cada acceso a memoria
MMU copia contador del sistema a
entrada referenciada; y el reemplazo sería para la página con
contador
más bajo.
Buffering de páginas.
Mantiene una lista de marcos de página libres.
(1) Si falta de página
⇒ siempre usa
marco de página libre (no reemplazo);
(2) Si número de marcos
libres < umbral ⇒ “demonio de paginación”
aplica
repetidamente el algoritmo de reemplazo: páginas no modificadas
pasan a lista de marcos de páginas
libres y páginas modificadas
pasan a lista de marcos de páginas modificados (cuando se escriban a
disco
pasan a lista de libres y pueden escribirse en tandas (mejor
rendimiento));
(3) Si se referencia una
página
mientras está en estas listas ⇒ falta de página: dicha
página la recupera directamente de la lista (no E/ S).
Puede darse el caso de
que haya páginas marcadas como “no reemplazables” ⇒ se aplica
a páginas del
propio sistema operativo, también se aplica mientras
se hace DMA sobre una página. Algunos sistemas
operativos ofrecen a
aplicaciones un servicio para fijar en memoria una o más páginas,
pudiendo afectar
positivamente al rendimiento del sistema.
Políticas de Asignación
de Marcos de Página.
Estrategia de asignación
fija ⇒ Número de marcos asignados al proceso (conjunto residente)
es constante.
Puede depender de
características del proceso (tamaño, prioridad, etc.). No se adapta
a las diferentes
necesidades de memoria de un proceso a lo largo de
su ejecución. Comportamiento del procesos es
relativamente
predecible. Sólo tiene sentido usar reemplazo local. La arquitectura
de la máquina impone un
número mínimo de marcos de página que
debe asignarse a un proceso (por ejemplo, la instrucción “move”
requiere un mínimo de 3 marcos de página).
Estrategia de asignación
dinámica ⇒ Número de marcos varía dependiendo de comportamiento
del proceso
(y posiblemente de los otros procesos en el sistema).
Asignación dinámica + reemplazo local → el proceso va
aumentando
o disminuyendo su conjunto residente dependiendo de su comportamiento
(distintas fases de
ejecución del programa) y tiene un
comportamiento relativamente predecible. Asignación dinámica +
reemplazo global → los procesos se quitan las páginas entre ellos,
teniendo un comportamiento difícilmente
predecible.
Operaciones sobre las
Regiones de un Proceso.
Como ya sabemos, el
espacio de direccionamiento de un proceso se compone de varias
regiones de memoria
y cada región de memoria se caracteriza por
varios atributos:
(1) sus direcciones de
inicio y fin;
(2) los
derechos de
acceso que tiene asociados;
(3) el objeto asociado
(por ejemplo, un archivo ejecutable que contiene el código ejecutado
por el proceso).
Las regiones de memoria
contenidas en el espacio de
direccionamiento de un proceso pueden
determinarse mostrando el contenido del archivo maps, situado en el
directorio de cada proceso en el sistema de archivos /proc.
Las
operaciones que el kernel del sistema operativo puede realizar sobre
las regiones de memoria de un
proceso son las siguientes:
(1) Creación de región
⇒ Al crear mapa inicial o por solicitud posterior;
(2)
Liberación de
región ⇒ Al terminar el proceso o por solicitud posterior;
(3) Cambio de tamaño de
región ⇒
Del heap o de la pila (stack);
(4) Duplicado de región
⇒ Operación requerida por el servicio fork.
No comments:
Post a Comment