Sistemas operativos Tema 8: Memoria virtual Memoria virtual Conjunto de técnicas que permiten ejecutar procesos que no se encuentran completamente cargados en memoria. ► Principio de cercanías: las referencias a memoria tienden a agruparse. ► Ejecución de instrucciones en secuencia, acceso a tablas, bucles, etc. Direcciones accedidas localidad(t1) ► t1 t Muchos programas contienen código para opciones poco utilizadas, que no hay por qué tener siempre en memoria. Memoria virtual ► Las partes de un proceso que no se estén utilizando en un momento dado pueden guardarse en almacenamiento secundario (típicamente, en un disco duro). Se cargan y descargan partes según sea necesario. ► Cada proceso ocupa menos memoria Æ se puede incrementar el grado de multiprogramación y el aprovechamiento de la CPU. En teoría, para ejecutar un proceso llega con tener en memoria la siguiente instrucción y los datos que ésta vaya a utilizar. En la práctica, se intenta aproximar la localidad del proceso. Conjunto residente: parte del espacio lógico de un proceso que se encuentra en la memoria principal. Memoria virtual ► Los procesos no están limitados por el tamaño de la memoria principal. Antes, para ejecutar procesos muy grandes se recurría a la programación de superposiciones (overlays). ► Esta técnica ha quedado relegada a sistemas empotrados y/o de tiempo real. ► Al no tener que cargar o intercambiar procesos enteros, se reduce la carga de E/S. Inconvenientes ► Complejidad elevada: ¿Cómo repartir la memoria entre los procesos? ¿Cuántos procesos pueden residir en memoria simultáneamente? ¿Qué partes de los procesos cargar o descargar? ► Rendimiento: Los accesos a disco son un cuello de botella. Esquemas de memoria virtual ► Se puede implementar memoria virtual con cualquier esquema de reubicación dinámica y asignación no contigua. Más fácil con esquemas que paginan la memoria. Los algoritmos se complican con segmentos de tamaño variable. ► El esquema más frecuente es la paginación bajo demanda. Paginación bajo demanda Paginación bajo demanda ► Paginación + paginador perezoso. No se carga una página en memoria hasta que una instrucción necesita acceder a ella. Proceso MP Disco A B A C D A C E D Memoria virtual paginada E B C Soporte hardware ► La traducción de direcciones lógicas sigue el mismo esquema que la paginación… … sólo que puede haber más bits en el campo p de la dirección lógica. ► Las páginas en memoria y las que están en disco se distinguen con el bit de validez: 1 Æ página válida y cargada en memoria. 0 Æ página inválida o válida pero no cargada. Soporte hardware Proceso A B C D E Tabla de páginas 1 1 0 - 1 3 0 - 0 - 0 - 0 - 0 - MP Disco A A C D B C E Al encontrar V=0, el SO comprueba si se trata de un acceso inválido o un fallo de página en la rutina de atención a la TRAP. ► A menudo, las entradas con V=0 contienen la dirección de disco donde se almacena la página correspondiente. ► Tamaño de la tabla de páginas ► Con memoria virtual, la tabla de páginas puede volverse extremadamente grande. Ejemplo: memoria virtual de 64GB, páginas de 4KB y 4 bytes por entrada Æ tablas de 64MB (en memoria real) por proceso. ► Posibles soluciones: Paginación multinivel: ► Sólo tiene que estar siempre en memoria la tabla de páginas externa. ► Las tablas de páginas internas pueden alojarse en disco mientras no se utilizan. Segmentación paginada: ► Sólo tiene que estar siempre en memoria la tabla de segmentos. ► Las tablas de páginas de cada segmento pueden alojarse en disco mientras no se utilizan. Tabla de páginas invertida: ► El SO debe mantener tablas con información sobre las páginas que no están en memoria. El fallo de página ► Ante un fallo de página, hay que localizar la página solicitada en el disco, cargarla en memoria y reiniciar la instrucción. Es un proceso de duración potencialmente muy larga y variable, principalmente por las operaciones de E/S. ► El repertorio de instrucciones puede plantear ciertos desafíos, por la dificultad de deshacer los efectos de una instrucción parcialmente ejecutada. MOV (R1)+,DIR: copiar en DIR el contenido de la posición de memoria apuntada por R1, e incrementar R1. ► Si ocurre un fallo de página al intentar acceder a DIR, hay que devolver R1 a su valor anterior. Rendimiento ► tac: ► ► ► tiempo de acceso sin memoria virtual (en paginación, doble del tiempo de acceso a una palabra de la memoria). p: probabilidad de fallo de página. tfp: tiempo medio de atención a un fallo de página. Tiempo de acceso efectivo medio: tef=(1-p)×tac+p×(tfp+tac) ► Para tac=1μs y tfp=10ms, una degradación inferior al 10% requiere p<10-5. Un fallo de página cada 100000 referencias. Soporte software ► En la rutina de atención al fallo de página interviene una cantidad de software considerable: Reemplazo: si no hay marcos libres cuando se produce un fallo de página, hay que desalojar alguna de las que residen en memoria principal. Gestión del conjunto residente: decidir cuántos marcos se asignan a cada proceso. Control de carga: decidir cuántos procesos se pueden mantener en memoria simultáneamente. Reemplazo Reemplazo ► Se trata de seleccionar una página víctima para descargar de la memoria, de entre un conjunto de candidatas. Pueden ser páginas del mismo proceso (reemplazo local) o de cualquiera (reemplazo global). ► Los distintos algoritmos se evalúan sobre cadenas de referencias, fijando el número de marcos disponibles. Intuitivamente, a mayor número de marcos, menor número de fallos de página. Algoritmo FIFO ► FIFO (First In, First Out): se reemplaza la página que lleva más tiempo en memoria. Ejemplo: con 3 marcos disponibles, la cadena de referencias (5,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,5,0,1) produce 15 fallos de página. 5 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 5 0 1 M0 5 5 5 2 2 2 2 4 4 4 0 0 0 0 0 0 0 5 5 5 M1 - 0 0 0 0 3 3 3 2 2 2 2 2 1 1 1 1 1 0 0 M2 - - 1 1 1 1 0 0 0 3 3 3 3 3 2 2 2 2 2 1 Algoritmo FIFO ► Ventaja: muy fácil de implementar. ► Inconvenientes: El instante de carga no es una medida de uso: la página sacrificada podría volver a necesitarse pronto. Anomalía de Belady: existen cadenas de referencias tales que con m marcos se producen menos fallos de página que con m+1. La anomalía de Belady ► ► ► Con 3 marcos, la cadena (1,2,3,4,1,2,5,1,2,3,4,5) produce 9 fallos de página. Con 4 marcos, en cambio, produce 10. Los algoritmos que no exhiben este comportamiento se denominan algoritmos de pila. 1 2 3 4 1 2 5 1 2 3 4 5 M0 1 1 1 4 4 4 5 5 5 5 5 5 M1 - 2 2 2 1 1 1 1 1 3 3 3 M2 - - 3 1 1 2 2 2 2 2 4 4 1 2 3 4 1 2 5 1 2 3 4 5 M0 1 1 1 1 1 1 5 5 5 5 4 4 M1 - 2 2 2 2 2 2 1 1 1 1 5 M2 - - 3 3 3 3 3 3 2 2 2 2 M3 - - - 4 4 4 4 4 4 3 3 3 Algoritmo óptimo ► Idealmente, se debería reemplazar la página que tardará más tiempo en referenciarse. El objetivo es retardar el fallo de página todo cuanto sea posible. En el mismo ejemplo de antes se producen 9 fallos de página. 5 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 5 0 1 M0 5 5 5 2 2 2 2 2 2 2 2 2 2 2 2 2 2 5 5 5 M1 - 0 0 0 0 0 0 4 4 4 0 0 0 0 0 0 0 0 0 0 M2 - - 1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 Algoritmo óptimo ► El algoritmo óptimo garantiza la tasa de fallos de página más baja posible para un número de marcos dado. ► Sin embargo, es difícilmente implementable, porque requiere conocer cadenas de referencias futuras. ► Se utiliza como patrón para la evaluación de otros algoritmos. Algoritmo LRU ► LRU (Least Recently Used): se reemplaza la página que lleva más tiempo sin referenciarse. Por el principio de cercanías, se toma el pasado reciente como una aproximación del futuro inmediato. En el ejemplo se producen 12 fallos de página. 5 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 5 0 1 M0 5 5 5 2 2 2 2 4 4 4 0 0 0 1 1 1 1 1 1 1 M1 - 0 0 0 0 0 0 0 0 3 3 3 3 3 3 0 0 0 0 0 M2 - - 1 1 1 3 3 3 2 2 2 2 2 2 2 2 2 5 5 5 Algoritmo LRU ► LRU es un algoritmo de pila, que suele dar una buena aproximación del algoritmo óptimo. ► Inconveniente: implementaciones costosas. Contador de referencias a página: ► En cada referencia, el valor del contador se copia en la entrada correspondiente de la tabla de páginas. ► Se reemplaza siempre la página cuya entrada en la tabla tiene el valor más pequeño. ► El desbordamiento provoca transitorios de rendimiento muy pobre Æ aumentar el número de bits del contador. Pila de referencias: ► En cada referencia se extrae la página correspondiente de la pila y se pone en la cima. ► Se reemplaza siempre la página que está en la base de la pila. Algoritmo de la 2ª oportunidad ► Aproximación de LRU por medio de 1 solo bit. Cada vez que se referencia una página, se pone R=1 en la entrada correspondiente de la tabla de páginas. ► 2ª oportunidad = FIFO + bit R. Al recorrer la cola, se examina el bit R: ► Si R=0, se reemplaza la página. ► Si R=1, se pone R=0 y se pasa la página al final de la cola. ► Si R=1 en todas las páginas, el algoritmo de la 2ª oportunidad degenera en FIFO. Aún así, el rendimiento suele ser considerablemente mejor. Dirty bit ► Se puede añadir un bit M (dirty bit), que se activa cuando se modifica el contenido de la página correspondiente. ► Para valores iguales del bit R, es mejor sacrificar una página con M=0 porque no hay que escribirla en disco. Algoritmo de la 2ª oportunidad mejorado: 1. Con FIFO como base, se selecciona para reemplazo la primera página que tenga R=0 y M=0. 2. Si no existe tal página, se busca la primera página con R=0 y M=1. • Durante la búsqueda, se pone R=0 en todas las entradas que se recorren y se envían al final de la cola. 3. Si aún no se ha encontrado víctima, se repiten los pasos 1 y 2. Gestión del conjunto residente y control de carga Gestión del conjunto residente y control de carga ► ¿Cuántos marcos asignar a un proceso? El mínimo lo determina el repertorio de instrucciones. ► E.g. ADD /DIR1,/DIR2,/DIR3 puede necesitar 4 marcos: 1 para la propia instrucción, 1 para cada sumando y 1 para el resultado. El máximo lo fija el tamaño de la memoria principal. Políticas de asignación: ► Fija: la asignación se decide en el momento de la carga. Requiere reemplazo local. ► Variable: la asignación se decide dinámicamente. Reemplazo local o global. ► ¿Cuántos procesos mantener simultáneamente en memoria? Hiperpaginación (thrashing) Si un proceso no dispone de marcos suficientes para su localidad, pasa más tiempo en fallo de página que ejecutándose Æ hiperpaginación. ► Con asignación fija, la hiperpaginación afecta a procesos aislados. ► Con asignación variable y reemplazo global, se produce a nivel de sistema cuando la suma de las localidades de todos los procesos no cabe en la memoria. ► Utilización de la CPU En ese caso, la utilización de la CPU cae drásticamente. hiperpaginación Grado de multiprogramación Hay que suspender procesos, descargando su conjunto residente. Modelo del conjunto de trabajo define el conjunto de trabajo (working set, WS) de un proceso como el conjunto de páginas en sus últimas Δ referencias a memoria. ► Se 2 0 1 3 4 3 2 3 5 1 6 6 1 1 1 5 5 6 6 5 5 Δ WS={0,1,2,3,4} Δ WS={5,6} WS una aproximación de la localidad del proceso. Se puede aproximar con interrupciones periódicas, a partir de los bits R de la tabla de páginas. Modelo del conjunto de trabajo ► Gestión del conjunto residente: Supervisar el conjunto de trabajo de cada proceso y asignar un número suficiente de marcos. Descargar las páginas que dejen de pertenecer al conjunto de trabajo. ► Control de carga: Si la demanda total de marcos (Σ WSi) supera el número de marcos de la memoria, se suspenden procesos. En caso contrario, se pueden cargar procesos nuevos. Frecuencia de fallos de página ► Solución más directa a la hiperpaginación. ► En vez de supervisar el conjunto de trabajo, se observa la frecuencia de fallos de página (FFP) de cada proceso. ► Gestión del conjunto residente: Si la FFP excede un umbral superior, se asignan más marcos al proceso. Si la FFP se reduce por debajo de un umbral inferior, se le quitan marcos al proceso. ► Control global. de carga: ídem, sólo que a partir de la FFP Fin