Download Manejo o gestión de memoria - hungria berbesi. Sistemas Operativos
Document related concepts
Transcript
1 Memoria Virtual. ¿Qué podemos hacer si un programa es demasiado grande para caber en la memoria disponible? Una posibilidad es usar superposiciones (overlays), como en MS-DOS: dividimos el programa en trozos independientes, y los vamos cargando de a uno, a medida que se necesiten. Por ejemplo, compilador de dos pasadas: Cargamos primero el código de la primera pasada, la ejecutamos, y después la descartamos para cargar el código de la segunda pasada. Las rutinas comunes y estructuras de datos compartidas entre las dos pasadas las mantenemos en memoria permanentemente. El problema es que agregamos complejidad a la solución. No siempre es fácil dividir un programa grande en unidades independientes, que no interactúan entre sí. Mucho mejor sería poder extender la memoria de manera virtual, es decir, hacer que el proceso tenga la ilusión de que la memoria es mucho más grande que la memoria física (o que el trozo de memoria física que le corresponde, si tenemos multiprogramación). El sistema operativo se encarga de mantener en memoria física los trozos (páginas) que el proceso está usando, y el resto en disco. Ya que el disco es barato, podemos tener espacios de direccionamiento enormes. Manejo o gestión de memoria VIRTUAL Figura 1: Memoria Virtual 2 El propósito de manejar la memoria es optimizar el uso del RAM (Random Access Memory). El RAM consiste de uno o más chips en el motherboard o tarjeta madre que mantiene los datos e instrucciones en forma temporera mientras el procesador los interpreta y ejecuta. El sistema operativo limpia las áreas de memoria que están ocupadas por los datos e instrucciones cuando éstos ya no se están usando. Algunos sistemas operativos usan memoria virtual (Virtual Memory - VM) para optimizar el uso del RAM. Con la memoria virtual, el sistema operativo asigna una porción de un medio de almacenamiento, usualmente el disco duro, para funcionar como RAM adicional. Según se interacciona con un programa, parte de él puede estar en el RAM y el resto del programa está en el disco duro, el que se está usando como memoria virtual. El área que el disco duro usa para memoria virtual es llamada “swap file”, pues intercambia (“swap”) datos, información e instrucciones entre la memoria y el almacenamiento. Una página (page) es la cantidad de datos e instrucciones que se pueden intercambiar en un momento dado. A la técnica de intercambiar entre memoria y almacenamiento se le llama “paging”. Cuando un sistema operativo está mucho tiempo haciendo “paging” en vez de ejecutando una aplicación, se dice que el sistema está “thrashing”. Por ejemplo, cuando se intenta acceder a una página del Internet, la página ya bajó, pero la luz del disco duro sigue encendida. Si el “thrashing” sucede con mucha frecuencia, es posible que la computadora necesite más RAM. QUE ES LA MEMORIA VIRTUAL. La memoria virtual es una técnica que permite ejecutar procesos que no caben totalmente en memoria RAM (memoria física). Esto propicia la creación de programas que sean más grandes que la memoria física. Además, la memoria virtual ayuda a crear un esquema de abstracción de la memoria que la separa de la zona lógica que el usuario ve, esto facilita enormemente la tarea a los programadores puesto que no se han de preocupar por limitaciones de memoria. Los procedimientos de implementación de la memoria virtual se basan en que cuando se ejecuta un programa, éste está parcialmente en memoria, es decir, sólo hay cargada aquella zona de código y datos que se necesitan en ese instante de tiempo, y no el programa completo. 3 La memoria virtual es la separación entre la memoria lógica disponible para el usuario y la memoria RAM, se implementa generalmente con el método de paginación por demanda aunque también se puede implementar en un sistema con segmentación. En el momento en que en el sistema empieza a escasear la memoria, se crea un fichero SWAP (intercambio) en el disco que sirve como ampliación auxiliar de memoria. En el caso de Windows, cuando tenemos muchas aplicaciones en funcionamiento y la memoria RAM se agota, el sistema se apoya en el fichero SWAP para realizar movimientos desde el disco duro a la RAM y viceversa. De ese modo crean espacios en memoria física para ir ejecutando las órdenes. Esto, evidentemente, hace que el sistema vaya más lento. Todo ello permite simular la existencia de 4GB de RAM en el equipo, a pesar de que nadie dispone de 4GB en su ordenador (a excepción de algunos sistemas en empresas y universidades), y dar capacidad de ejecución a múltiples aplicaciones por grandes que sean. QUE ES LA MEMORIA VIRTUAL, EL ARCHIVO DE PAGINACION Y COMO PERSONALIZAR SU TAMAÑO. Como todos sabemos a estas alturas, los programas que se van a ejecutar y sus correspondientes archivos pasan del disco duro (que es donde están almacenados) a la memoria del equipo, que es desde donde se ejecutan. Esto es así porque los sistemas operativos necesitan que todo el programa que se va a ejecutar esté cargado en memoria. Pero los programas no siempre caben íntegramente en la RAM, ni tampoco es necesario que se encuentren íntegramente en ésta. Hay que tener en cuenta que no sólo se trata del programa que vayamos a ejecutar, sino que también se trata de todos los programas que se cargan en el inicio, incluido el propio sistema operativo. Esto afortunadamente no funciona de este modo, ya que si fuera así de poco servirían las capacidades que alcanzan los ordenadores actuales, y mucho menos la posibilidad de trabajar en multisesión, ya que estaríamos obligados a instalar cantidades enormes de memoria RAM. Para evitar esto existe la Memoria virtual. 4 La memoria virtual ha sido definida en muchas ocasiones como una zona del disco duro que se utiliza como si fuera memoria RAM cuando esta es insuficiente o está próxima a terminarse. Esta definición, tal y como está expresada, no es del todo exacta, ya que el tamaño de la memoria virtual es inversamente proporcional a la memoria RAM instalada (que sería lo lógico si esto fuera así), sino que más bien hay una relación de proporcionalidad directa (es decir, a más cantidad de memoria RAM corresponde un tamaño mayor de archivo de paginación). Tampoco existe una relación directa entre la memoria virtual utilizada y la cantidad de memoria RAM disponible, ya que se puede dar el caso de que un proceso necesite muchos segmentos en ejecución inmediata y entonces estos permanecen en la RAM o que tan solo una pequeña parte del programa se va a ejecutar de inmediato, con lo que en la RAM tan sólo quedaría una pequeña parte de éste, es decir, tan sólo unos pocos segmentos. Una definición más real de lo que es la memoria virtual sería la siguiente: Memoria virtual es una zona de almacenamiento temporal utilizado por un equipo para ejecutar programas que necesitan más memoria de la existente, almacenando en ella los segmentos de acceso no inmediato. Esto, aunque pueda parecer lo mismo, no lo es. Para empezar, debemos tener en cuenta que cuando cargamos un programa pasa a la memoria para ejecutarse (como ya hemos dicho), pero todo el programa no se ejecuta al mismo tiempo, sino que realmente se ejecuta por segmentos, pudiéndose llegar (y de hecho se llega) al caso de haber partes del programa que ni tan siquiera se ejecutan. Precisamente es en estos casos cuando vemos la verdadera función de la memoria virtual y como funciona. Vamos a ver de una forma bastante resumida como sería este funcionamiento: Cuando nosotros cargamos un programa, este es leído del disco duro y pasa a la RAM, desde donde se ejecuta, empezando por el propio arranque del programa. Pero no todo el programa se ejecuta a la vez, sino que se ejecuta por segmentos, dependiendo de aquellos que se vayan a utilizar de forma inmediata, empezando por el inicio del programa, definiéndose estos mediante un sistema de paginación. Este sistema, que tiene una explicación bastante más larga y laboriosa, pero que para su fácil comprensión he resumido de este modo, recibe el nombre de segmentación paginada. 5 Dado este sistema de funcionamiento, realmente no es necesario que todo el programa permanezca en la RAM, ya que tan sólo es preciso que permanezcan aquellas partes del programa que son de ejecución inmediata. El resto (que también debe permanecer en memoria) pasa a la memoria virtual, recuperándose aquellas partes (segmentos) que se van a ejecutar en el momento de hacerlo y volviendo a pasar a la RAM, desde donde se ejecutan, y volviendo a la Memoria virtual una vez ejecutadas. Bien, llegados a este punto podemos pensar lo siguiente: Y si la memoria virtual está en el disco duro ¿Cuál es entonces la ventaja que tenemos?, porque visto así puede parecer una simple pérdida de tiempo y de espacio en disco. Pues bien, es cierto que volvemos a copiar una información del disco duro en el disco duro, pero en primer lugar ya hemos dicho que para que un programa se ejecute este debe estar cargado integramente en memoria, y en segundo lugar estamos copiando esta información en un archivo optimizado del disco duro, en el que la información se copia sin ningún tipo de fragmentación (por lo que el acceso a ella es muchísimo más rápido). Este archivo se denomina archivo de paginación. La nombre exacto de este archivo es pagefile.sys, y se trata de un archivo oculto de sistema. ¿Y qué ventaja obtenemos con este sistema? Pues para empezar liberar memoria RAM (y precisamente por esto es por lo que indiqué que la primera definición dada de memoria virtual no era del todo exacta, porque no es necesario que haya poca memoria RAM o esta esté agotándose para que actúe este sistema), ya que en ésta tan solo quedan cargados aquellos segmentos del programa que vamos a utilizar de forma inmediata, permitiendo que otras tareas o incluso otros programas puedan cargarse en la RAM. Además, esto nos da la posibilidad de ejecutar procesos que sean más grandes que la cantidad de memoria física (RAM) que tenemos. Tamaño de la memoria virtual (archivo de paginación): El archivo de paginación, tiene un tamaño asignado, es decir que su tamaño no depende de la información que pueda contener en un momento dado. Vamos a ver qué tamaño es el recomendado para este archivo de paginación. Aunque no existe un tamaño definido, Windows Vista siempre asigna un valor inicial. Este valor, dependiendo de la cantidad de memoria RAM que tengamos instalada, se encuentra entre la cantidad de memoria RAM instalada más 300MB y tres veces la cantidad de memoria RAM instalada. Para equipos con poca memoria RAM instalada y poca capacidad de disco duro el valor mínimo se asignación inicial puede bajar. 6 ¿Y qué pasa si la cantidad asignada a la memoria virtual resulta insuficiente para la ejecución de un proceso determinado? Pues simplemente que Windows nos lo notificará y nos pedirá autorización para aumentar el tamaño de la memoria virtual (es decir, del archivo de paginación). Ahora bien, nosotros podemos personalizar el tamaño de este archivo, dependiendo de nuestras necesidades y de factores tales como el espacio disponible en el disco duro. Personalizar el tamaño de la memoria virtual: Para personalizar el tamaño de la memoria virtual hay que seguir los siguientes pasos: En primer lugar vamos a Equipo y pulsamos con el botón secundario (derecho) del ratón. En el menú contextual que se nos muestra elegimos Propiedades. En el panel izquierdo encontramos la leyenda Configuración avanzada del sistema. Hacemos clic en ella y se nos muestra la siguiente ventana: 7 En dicha ventana vamos a la pestaña Opciones avanzadas, y dentro de estas a Rendimiento. Hacemos clic en el botón de Configuración. 8 En la ventana que se nos muestra vamos de nuevo a la pestaña Opciones avanzadas, donde vemos la información referente a Memoria virtual. Hacemos clic en Cambiar, con lo que se nos muestra la siguiente ventana. 9 Lo primero que tenemos que hacer en esta ventana es desactivar la opción Administrar automáticamente el tamaño del archivo de paginación para todas las unidades. En la imagen podemos ver que se nos muestran tres referencias: El tamaño mínimo permitido (señalado en rojo), el tamaño recomendado (señalado en azul) y el tamaño actual (señalado en verde). En Unidad hacemos clic en la unidad que contiene el archivo de paginación que queremos cambiar de tamaño. 10 Hacemos clic en Tamaño personalizado y escribimos los nuevos valores (en Megabytes), tanto el tamaño inicial (en el cuadro Tamaño inicial) como el tamaño máximo (en el cuadro Tamaño máximo). Podemos modificar sólo uno de estos parámetros. Podemos deshabilitar la memoria virtual, pero esto no es recomendable (por mucha RAM que tengamos instalada), ya que si bien por un lado vamos a ganar espacio en el disco duro, por otro lado toda la información que debería grabarse en este archivo va a permanecer en la RAM, por lo que vamos a estar utilizando una gran cantidad de RAM de una forma totalmente inútil e ineficaz. Por otro lado, un archivo de paginación demasiado grande supone un desperdicio de espacio en el disco duro, lo que tampoco es muy interesante, aunque el precio de MB en éstos sea bastante económico. Si aumentamos el tamaño del archivo de paginación (memoria virtual) no es necesario reiniciar el equipo, pero si lo que hacemos es disminuir este tamaño sí que necesitaremos reiniciarlo para que los cambios surtan efecto. A muchos personalmente este parámetro me gusta dejarlo tal y como viene predeterminado, es decir, dejar que Windows gestione su tamaño. De esta forma suele funcionar bastante bien, por lo que, salvo que tengamos un serio problema de espacio en disco, no recomiendo modificarlo, a no ser que se esté muy seguro de lo que se hace y se sepa muy bien qué valor es el más apropiado para nuestras necesidades y la configuración de nuestro equipo. 11 Hay que tener presente que un tamaño demasiado pequeño del archivo de paginación va a hacer que el ordenador se ralentice y, en el mejor de los casos, que hagamos un uso de la RAM excesivo e innecesario, como ya hemos comentado. Esto último se explica debido a que el acceso de los datos al disco duro es miles de veces más lento que a la memoria RAM. Si una porción de memoria no se encuentra en esta, el sistema necesita tiempo para leerlo y volverlo a la memoria principal, para ejecutarlo. Como ves la memoria se organiza en niveles. Primero las caches del micro que se encargan de tener esos datos que más usas cerca del procesador y después pasamos a la memoria RAM, quedando como último recurso el disco duro. A mayor proximidad al procesador, mayor velocidad pero esa memoria es mucho más cara. ¿Por qué es tan importante? Si nos quedamos sin memoria no podremos ejecutar más programas y los que estamos ejecutando tendrán problemas para trabajar con más datos. Además, el uso de memoria virtual puede hacer que tu equipo funcione más lento si es necesario ir por datos al disco duro. Es siempre un compromiso entre la velocidad y la cantidad de datos que el sistema es capaz de procesar. Jamás una configuración de mayor memoria virtual podrá ser mejor que una ampliación de memoria RAM. Es más, lo ideal sería tener un equipo que no necesitara tener esta característica activada debido a que tiene un exceso de memoria principal. Fallos de página Un fallo de página es la secuencia de eventos que ocurren cuando un programa intenta acceder a datos (o código) que está en su espacio de direcciones, pero que no está actualmente ubicado en la RAM del sistema. El sistema operativo debe manejar los fallos de página haciendo residentes en memoria los datos accedidos, permitiendo de esta manera que el programa continúe la operación como que si el fallo de página nunca ocurrió. En el caso de nuestra aplicación hipotética, el CPU primeramente presenta la dirección deseada (12374) al MMU. Sin embargo, el MMU no tiene traducción para esta dirección. Por tanto, interrumpe al CPU y causa que se ejecute un software, conocido como el manejador de fallos de página. El manejador de fallos de página determina lo que se debe hacer para resolver esta falla de página. El mismo puede: Encontrar dónde reside la página deseada en disco y la lee (este es usualmente el caso si el fallo de página es por una página de código) Determina que la página deseada ya está en RAM (pero no está asignada al proceso actual) y reconfigura el MMU para que apunte a el Apunta a una página especial que solamente contiene ceros y asigna una nueva página para el proceso solamente si este intenta alguna vez escribir a la página especial (esto se llama una 12 página de copia en escritura y es utilizada a menudo por páginas que contienen datos inicializados a cero) Obtener la página deseada desde otro lugar (lo que se discute en detalle más adelante) Mientras que las primeras tres acciones son relativamente sencillas, la última no lo es. Por eso necesitamos cubrir algunos tópicos adicionales. El conjunto de direcciones de trabajo El grupo de páginas de memoria física actualmente dedicadas a un proceso específico se conoce como conjunto de direcciones de trabajo para ese proceso. El número de páginas en el conjunto de direcciones de trabajo puede crecer o reducirse, dependiendo de la disponibilidad general de páginas del sistema. El conjunto de direcciones de trabajo crece si un proceso tiene fallos de páginas. El conjunto de direcciones de trabajo se reduce a medida que existen menos y menos páginas libres. Para evitar que se acabe la memoria completamente, se deben eliminar las páginas del conjunto de direcciones de trabajo y convertirlas en páginas libres, disponibles para un uso posterior. El sistema operativo reduce el conjunto de direcciones de trabajo mediante: Escribiendo las páginas modificadas a un área dedicada en un dispositivo de almacenamiento masivo (usualmente conocido como espacio de intercambio o de paginado) Marcando las páginas sin modificar como libres (no hay necesidad de escribir estas páginas fuera del disco pues no se han cambiado) Para determinar los conjuntos de trabajo apropiados para todos los procesos, el sistema operativo debe hacer un seguimiento de la información de uso de todas las páginas. De esta manera, el sistema operativo determina cuales páginas son usadas activamente (y deben mantenerse en memoria como residentes) y cuales no (y por lo tanto, se pueden eliminar de memoria). En la mayoría de los casos, se utiliza un tipo de algoritmo de "menos usado recientemente" para determinar cuales páginas son elegibles para eliminarse de los conjuntos de trabajo de los procesos. Intercambio Mientras que el hacer intercambio de memoria (swapping, escribiendo páginas modificadas al espacio swap del sistema) es una parte normal de la operación del sistema, es posible experimentar demasiado intercambio. La razón por la que estar atentos ante el excesivo intercambio es que la situación siguiente puede ocurrir fácilmente, y repetirse una y otra vez: Las páginas de un proceso son intercambiadas (swapped) El proceso se vuelve ejecutable e intenta acceder a una página en el espacio de intercambio La página es colocada en memoria (lo más probable forzando a otras páginas de procesos a que sean extraídas de allí) Un momento después, la página es colocada nuevamente fuera de memoria 13 Si esta secuencia de eventos se extiende demasiado, esto se conoce como thrashing y es un indicativo de insuficiente RAM para la carga de trabajo actual. "Trashing" es extremadamente perjudicial para el rendimiento del sistema, pues las cargas de CPU y E/S que se pueden generar en tal situación rápidamente sobrepasa la carga impuesta por el trabajo real del sistema. En casos extremos, puede que el sistema no realice ningún trabajo útil, consumiendo todos sus recursos moviendo páginas dentro y fuera de memoria. Implicaciones de rendimiento de la memoria virtual Mientras que la memoria virtual hace posible que las computadoras manejen más fácilmente aplicaciones más grandes y complejas, como con cualquier otra herramienta, esto viene a un precio. El precio en este caso es el de rendimiento — la memoria virtual de un sistema operativo tiene mucho más que hacer que un sistema operativo sin memoria virtual. Esto significa que el rendimiento nunca es tan bueno con memoria virtual como lo es cuando la misma aplicación esta 100% residente en memoria. Sin embargo, esta no es razón suficiente para abandonar la idea. Los beneficios de la memoria virtual son demasiados para hacer esto. Y, con un poco de esfuerzo, es posible lograr un buen rendimiento. Lo que se debe hacer es examinar aquellos recursos de sistemas impactados por el uso pesado del subsistema de memoria virtual. Escenario de rendimiento del peor caso Por un momento, utilice lo que ha leído en este capítulo y considere qué recursos del sistema son utilizados extensivamente por fallos de páginas y actividad de intercambio: RAM — Obviamente la RAM disponible es poca (de lo contrario no habría necesidad de fallos de páginas o de intercambio de páginas). Disco — Aunque el espacio en disco puede no ser impactado, el ancho de banda de E/S (debido a mucho paginado e intercambio) si lo será. CPU — El CPU está utilizando ciclos haciendo el procesamiento necesario para soportar la administración de memoria y estableciendo las operaciones necesarias de E/S para el paginado e intercambio. La naturaleza interrelacionada de estas cargas hace fácil entender cómo las limitaciones de recursos pueden conducir a problemas graves de rendimiento. Todo lo que se necesita es un sistema con poca RAM, alta actividad de fallos de páginas y un sistema ejecutando casi en sus límites en términos de CPU o E/S de disco. En este punto, el sistema está haciendo trashing, siendo el bajo rendimiento el resultado inevitable. Escenario de rendimiento del mejor caso En el mejor caso, la sobrecarga proveniente del soporte a la memoria virtual representa una carga mínima para un sistema bien configurado: 14 RAM — Suficiente RAM para todos los conjuntos de direcciones de trabajo con suficiente exceso para manejar cualquier fallo de página. Disco — Debido a la actividad limitada de fallos de página, el ancho de banda de E/S de disco será impactado de forma mínima. CPU — La mayoría de los ciclos de CPU realmente están dedicados a ejecutar aplicaciones, en vez de ejecutar el código de manejo de memoria del sistema El punto a tener en mente es que el impacto en el rendimiento de la memoria virtual es mínimo cuando se utiliza tan poco como sea posible. Esto significa que el factor determinante para un buen rendimiento del subsistema de memoria virtual es tener suficiente RAM. Lo siguiente (pero con mucho menos importancia) es suficiente capacidad de E/S de disco y de CPU. Sin embargo, tenga en cuenta que estos recursos solamente ayudan a que el rendimiento del sistema se degrade de una forma más limpia de intensivos fallos de página y del intercambio; pero hacen poco para ayudar el rendimiento del subsistema de memoria virtual (aunque obviamente pueden jugar un papel importante en el rendimiento global del sistema).