Sistemas Informáticos Multiusuario y en Red T-8. – Gestión de Memoria. TEMA 8: GESTIÓN DE MEMORIA. 1. Direccionamiento. ...................................................................................................................... 2 1.1.- Asignación de direcciones. .................................................................................................. 2 2. Jerarquía del almacenamiento. ..................................................................................................... 3 3. Gestión de memoria.................................................................................................................... 3 3.1.- Monoprogramación. ............................................................................................................ 3 3.2.- Multiprogramación.............................................................................................................. 6 3.3.- Paginación. ......................................................................................................................... 8 3.4.- Segmentación. ...................................................................................................................10 3.5.- Sistemas combinados. ........................................................................................................10 3.6.- Memoria Virtual. ...............................................................................................................10 3.6.1. Carga por petición de páginas........................................................................................11 3.6.2. Reemplazamiento de páginas.........................................................................................12 3.6.2.1. Algoritmos de reemplazamiento. .............................................................................12 3.7.- Asignación de memoria. .....................................................................................................13 4. Consideraciones de diseño. ........................................................................................................13 5. Tendencias actuales...................................................................................................................14 El problema se crea al intentar trabajar con varios procesos en memoria simultáneamente. Por ello será necesario hacer una adecuada gestión de la misma. Para poder procesar un programa en un ordenador es necesario que previamente, tanto él como los datos que maneja estén cargados en la memoria principal. Para ello necesitaremos mantener dichos programas simultáneamente en memoria, es decir deberán compartir la memoria. En el funcionamiento de un ordenador, la memoria principal es un recurso central ya que tanto el procesador como los dispositivos de e/s acceden a ella para leer y/o grabar la información que manejan. Procesos ... ... ... ... ... Micro Procesador Memoria Principal Dispositivos Entrada/Salida Fig.1. La memoria como recurso central. 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. Prof.: Justo Sáez Arenas 1 Sistemas Informáticos Multiusuario y en Red T-8. – Gestión de Memoria. 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. 1.1.- Asignación de direcciones. Los programas deben estar cargados en memoria para su ejecución, pero no saben en qué posición o dirección de memoria se deben cargar. El programador tampoco, simplemente definirá una sentencia de inicio de programa y a continuación secuencialmente el resto de sentencias para realizar el proceso deseado. Direcciones Simbólicas (identificadores Programa Fuente COMPILADOR Direcciones Relativas (desplazamiento) Punto de carga (Dirección inicio) Direcciones absolutas Programa Objeto ENLAZADOR/CARGADO R Programa cargable Fig.2.Asignación de direcciones en los programas. Después el compilador, traducirá a lenguaje máquina el programa fuente y les asignará, a las diferentes instrucciones y campos, el desplazamiento correspondiente respecto a ese sentencia inicial, o cero relativo, ósea que asignará direcciones relativas al programa. Prof.: Justo Sáez Arenas 2 Sistemas Informáticos Multiusuario y en Red T-8. – Gestión de Memoria. 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. 2. Jerarquía del almacenamiento. Los primeros ordenadores utilizaban memorias de tipo magnético. Dado el nivel tecnológico del momento, era un hardware muy caro y, por ello, los ordenadores solían tener poca memoria. Se debía utilizar de la forma más eficaz posible. No parecía lógico tener cargados en memora principal aquellos programas y datos que no fueran a ejecutarse, pero tampoco sería práctico compilarlos y enlazarlos cada vez que fuera necesaria su ejecución. El desarrollo de dispositivos rápidos de almacenamiento (tambores, discos y cintas) permitió guardar en ellos dichos programas y datos, transfiriéndose a la memoria principal cuando fueran a procesarse. El SO se encargaría de gestionar también este almacenamiento secundario. En la década de los 60 se desarrollaron memorias mucho mas rápidas que las magnéticas, aunque también mas caras. Estas memorias muy rápidas o cache se comenzaron a utilizar para almacenar los programas y datos mas utilizados, logrando una mejora general del sistema, Su coste forzó a utilizar memorias caché de pequeño tamaño. Memoria Principal Memoria 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). Prof.: Justo Sáez Arenas 3 Sistemas Informáticos Multiusuario y en Red T-8. – Gestión de Memoria. División de la memoria. La introducción de los sistemas operativos para utilizar mejor el hardware dividió la memora principal en dos zonas, una utilizable por el usuario y otra reservada para la parte residente del propio sistema operativo, también llamada monitor que, entre otras funciones, se encargará de gestionar la memoria. Este reparto de memoria produce unos cuantos problemas que hay que resolver. * Cómo asegurar la independencia de ambas zonas (protección). * Cómo asegurar que los programas de usuario no se vean afectados por esta nueva división de la memoria. Protección de la memoria. Ya que el monitor y el programa del usuario van a compartir la memoria, es necesario proteger la zona del sistema operativo contra cualquier intento de acceso ilegal del programa que podría afectar al funcionamiento de dicho monitor. Se establece una dirección de frontera que limita la zona del sistema. Cualquier dirección que genere el programa de usuario se comparará con dicha frontera permitiendo el acceso si es > ó = y denegándolo si es menor. El control lo realiza el propio hardware. Este control provoca un aumento del tiempo de acceso a la memoria, pero el retraso queda compensado por el mejor rendimiento que permite el sistema operativo. Solo será necesario controlar las direcciones generadas por el programa. El monitor debe poder acceder a cualquier punto de la memoria (para cargar programas, pasarles información etc.) y por tanto no es necesario controlar las suyas. Reasignación de direcciones. Una vez inicializado el sistema, el contenido del registro frontera indicará el punto a partir del cual puede cargarse el programa de usuario. Para ello será necesario reasignar las direcciones del programa en función de la frontera. Existen dos formas de hacerlo, una estática y otra dinámica. A. La asignación estática se realiza durante la compilación o bien durante la carga del programa en memoria. De esta manera si hay variación del tamaño del sistema operativo exigirá una nueva compilación o carga del programa. B. La asignación dinámica es la alternativa a la estática para asignar direcciones reales durante la ejecución. Un dispositivo hardware especial interceptará cada dirección lógica generada por el programa y le sumará el contenido del registro frontera. El contenido será la dirección real correspondiente. Cualquiera que sea la técnica elegida impedirá que el usuario pueda manejar direcciones reales. Su programa utilizará direcciones relativas que podrán variar de 0 al máximo permitido por el sistema operativo. Este será el Espacio físico de direcciones. Después el sistema, con la ayuda del hardware, establecerá la correspondencia adecuada con el espacio lógico de direcciones. Espacio que estará limitado por la dirección frontera y el tamaño de la memoria real. Procesador Dirección Relativa Dirección + Memoria Principal Absoluta Registro frontera Prof.: Justo Sáez Arenas 4 Sistemas Informáticos Multiusuario y en Red T-8. – Gestión de Memoria. Fig. Asignación Dinámica Intercambio de almacenamiento (swaping). La necesidad de atender a varios usuarios en los sistemas de tiempo compartido, impulsó el desarrollo de técnicas de Intercambio de almacenamiento o swaping. Consiste principalmente en liberar espacio de memoria extrayendo un programa instalado en ella para que pueda ser ocupado por otro que necesite ejecutarse (y no por salir de memoria sale de cola de preparados). Mem HD Swapping Usuario Región de swapping Monitor Fig. Swapping o intercambio. Cuando el programa cargado en memoria quede a la espera de una operación de entrada/salida, por ejemplo, el sistema lo descargará (swap-out) copiándolo exactamente como está en memoria en dispositivos rápidos de almacenamiento secundario. En su lugar cargará el de otro usuario, traído (swap-in) de dichos dispositivos, que esté preparado para usar el procesador. La eficacia de esta técnica dependerá, principalmente de la velocidad con la que se realice la carga y descarga de los programas y, por lo tanto, de la velocidad de acceso a los dispositivos de almacenamiento secundario. Se puede reducir un impacto del tiempo de intercambio de un programa si lo solapamos con la ejecución de otro. Para ello el sistema divide la zona de usuario en dos partes y, mientras en una está procesándose un programa, en la otra se está intercambiando otro. El sistema deberá encargarse de todas las interrupciones que tengan pendientes los programas sacados (operaciones de e/s, indicadores externos, etc.). Por ejemplo, en un programa que ha iniciado una operación de e/s para leer información de un fichero. Quedará a la espera y el sistema lo sacará al almacenamiento secundario. Si finaliza ahora la operación de e/s no podremos colocar la información recibida en la memoria del programa pues está ocupado por otro . Para evitar estos problemas se realizarán estas operaciones sobre buffers del sistema operativo. Cuando el programa afectado regrese a memoria, el propio sistema le pasará la información. Hasta ahora hemos considerado situaciones en las que, en un momento dado, sólo existe un programa de usuario en memoria principal. Los sistemas correspondientes se denominan, por ello, de monoprogramación. Solapar el intercambio de un programa con la ejecución de otro, introduce una novedad importante; la existencia de varios programas de usuario cargados a la vez en memoria. Prof.: Justo Sáez Arenas 5 Sistemas Informáticos Multiusuario y en Red T-8. – Gestión de Memoria. 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 Prof.: Justo Sáez Arenas 6 Sistemas Informáticos Multiusuario y en Red T-8. – Gestión de Memoria. 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. Prof.: Justo Sáez Arenas 7 Sistemas Informáticos Multiusuario y en Red T-8. – Gestión de Memoria. 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. Memoria Lógica P a g i n a s Tabla de páginas P1 1 P2 2 Memoria Física F0 F1 F1 F2 F4 F3 P3 3 P1 F4 F3 P3 Frames o Marco de página P2 F5 P4 4 F6 F7 F7 P4 (Importante conceptos de frames y pagina) Paginación Es la técnica de gestión que permite asignar la memoria de forma discontinua. Con este fin se divide la memoria física en trozos de tamaño fijo llamados armazones, marcos o frames y la lógica en bloques del mismo tamaño llamados páginas. El So internamente mantiene una Tabla de páginas donde relaciona cada página cargada en memoria principal con el frame que la contenga, o lo que es lo mismo con su dirección inicial en memoria real. Cada dirección que genere el procesador, será interceptada y dividida en dos componentes: - Un número de pagina (p) - Un desplazamiento en la página (d) que indica la posición que ocupa el byte indicado por la dirección, contando desde el principio de la página. procesador Nº.pagina Desplazamiento Frame Desplazamiento Memoria Física Tabla de páginas Prof.: Justo Sáez Arenas Frames ... ... ... 8 Sistemas Informáticos Multiusuario y en Red T-8. – Gestión de Memoria. Fig. Direccionamiento de memoria paginada 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 Prof.: Justo Sáez Arenas 9 Sistemas Informáticos Multiusuario y en Red T-8. – Gestión de Memoria. 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. 3.5.- Sistemas combinados. Algunos sistemas utilizan una técnica de paginación segmentada: consiste en segmentar la tabla de páginas adecuándola al tamaño del programa. Para ello mantiene una tabla de segmentos cuyo tamaño indica la dirección de inicio de cada tabla de páginas y su tamaño. Se utiliza un hardware especial. La serie 370 de IBM utiliza esta técnica. Otros utilizan la Segmentación Paginada utiliza segmentos cuyo tamaño siempre es un numero entero de páginas. Por ejemplo el sistema Multics GE 645 3.6.- Memoria Virtual. Como sabemos los sistemas operativos intentarán gestionar la memoria para poder tener cargados mas de un programa simultáneamente y en ejecución, esto es lo que denominamos memoria virtual, puesto que no todos los programas o sus partes tienen porque estar cargados en memoria física real. La memoria virtual es una técnica de gestión que, combinando hardware y software, permite la ejecución de programas parcialmente cargados en memoria real. Esta forma de trabajar aporta ventajas importantes: * Si los programas se pueden ejecutar por partes, la memoria lógica puede ser mayor que la real disponible. Prof.: Justo Sáez Arenas 10 Sistemas Informáticos Multiusuario y en Red T-8. – Gestión de Memoria. * 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”. 3.6.1. Carga por petición de páginas. Es el mecanismo utilizado más frecuentemente en la técnica de memoria virtual, su funcionamiento es similar al de la paginación por intercambio. Este algoritmo no lleva a memoria todo el programa sino que solo carga aquellas páginas que se le pidan. Cuando el procesador genere una dirección que pertenezca a una página que no se encuentra en memoria la busca y la carga en memoria; esto es lo que se conoce como “falta de Prof.: Justo Sáez Arenas 11 Sistemas Informáticos Multiusuario y en Red T-8. – Gestión de Memoria. 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. 3.6.2. Reemplazamiento de páginas. 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. 3.6.2.1. Algoritmos de reemplazamiento. 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 Prof.: Justo Sáez Arenas 12 Sistemas Informáticos Multiusuario y en Red T-8. – Gestión de Memoria. el de su fila). En cualquier momento la página menos usada es aquella cuya fila tenga el menor valor binario. C. Pilas: se mantiene una pila de números de páginas utilizadas. Cada vez que se utiliza una página su numero se coloca al principio de la pila, en un momento determinado la página menos recientemente utilizada será la del fondo de la pila. Los algoritmos LRU necesitan disponer de hardware especial. -. Otros algoritmos: Dada la dificultad del LRU se intentan otros algoritmos más sencillos como son: • Bit de referencia: se asocia a cada entrada de la tabla de páginas un bit, cada vez que se utiliza esa página activa dicho bit, en un momento dado si necesitamos cargar una página se consultará dicho bit para ver cual es reemplazada. • LFU (Least Frequently Used): se asocia un contador a cada página que se actualiza a intervalos regulares de tiempo. Se reemplazará la página cuyo contador sea menor. • Bit de modificación: algunos algoritmos se complementan utilizando esta técnica que consiste en añadir un bit en la tabla de páginas que indica si una página a variado su contenido o no. Se sustituirán preferentemente aquellas páginas que no se hayan modificado, evitando así tener que guardar su contenido en el almacenamiento secundario con el consiguiente ahorro en tiempo de entrada salida. 3.7.- Asignación de memoria. Al diseñar un sistema operativo se debe afrontar el problema de cuantos frames o marcos a asignar a cada proceso activo. La propia arquitectura del ordenador impone unos mínimos de asignación por proceso que marcaran el mínimo con el que trabajara el sistema operativo (mínimo estructural). Si por cualquier razón un proceso se queda con menos frames que el mínimo estructural el sistema debe sacarlo y suspenderlo (swap-out). Cuando los procesos necesitan tener muchas paginas activas en memoria y esta se encuentra llena se van a producir una gran cantidad de intercambios de paginas entre memoria y almacenamiento secundario lo que conlleva un consumo considerable de tiempo, esto se denomina hiperpaginación o trashing. Para evitar las situaciones anteriores (mínimo estructural e hiperpaginación) es necesario asignar a cada proceso el numero de frames que necesita en cada momento, pero el problema radica en conocer ese numero. Afortunadamente todos los programas están compuestos por varias partes o subrutinas, de forma que su ejecución se realiza por fases, así el proceso direcciona solo una pequeña parte de sus páginas, lo que nos ayudará a conocer más fácilmente el numero de frames que necesita. También una forma de evitar los problemas anteriores se basa en controlar la frecuencia con la que un proceso produce faltas de pagina. Si la frecuencia de falta de pagina de un proceso supera un limite el sistema le asigna mas frames y si cae por debajo de un limite inferior le reducirá su numero de frames asignados. 4. Consideraciones de diseño. Prof.: Justo Sáez Arenas 13 Sistemas Informáticos Multiusuario y en Red T-8. – Gestión de Memoria. 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. Debido al abaratamiento de las memorias los sistemas disponen de gran cantidad de la misma además son más rápidas lo que va a permitir sistemas operativos más potentes. Por otro lado los mecanismos hardware que ayudan a la gestión de la memoria son mucho más sofisticados. Todo ello lleva a la necesidad de mejorar los sistemas operativos con el fin de gestionar una mayor cantidad de procesos simultáneos de forma eficiente y sin problemas entre cada uno de los procesos. Prof.: Justo Sáez Arenas 14