lunes, 24 de mayo de 2010

Gestión De Memoria

INTRODUCCION

La memoria es uno de los principales recursos de la computadora, la cual debe administrarse con mucho cuidado. Aunque actualmente la mayoría de los sistemas de cómputo cuentan con una alta capacidad de memoria, de igual manera las aplicaciones actuales tienen también altos requerimientos de memoria, lo que sigue generando escasez de memoria en los sistemas multitarea y/o multiusuario.
La parte del sistema operativo que administra la memoria se llama administrador de memoria y su labor consiste en llevar un registro de las partes de memoria que se estén utilizando y aquellas que no, con el fin de asignar espacio en memoria a los procesos cuando éstos la necesiten y liberándola cuando terminen, así como administrar el intercambio entre la memoria principal y el disco en los casos en los que la memoria principal no le pueda dar capacidad a todos los procesos que tienen necesidad de ella.
Los sistemas de administración de memoria se pueden clasificar en dos tipos: los que desplazan los procesos de la memoria principal al disco y viceversa durante la ejecución y los que no.
El propósito principal de una computadora es el de ejecutar programas, estos programas, junto con la información que accede deben estar en la memoria principal (al menos parcialmente) durante la ejecución.
Para optimizar el uso del CPU y de la memoria, el sistema operativo debe tener varios procesos a la vez en la memoria principal, para lo cual dispone de varias opciones de administración tanto del procesador como de la memoria. La selección de uno de ellos depende principalmente del diseño del hardware para el sistema. A continuación se observarán los puntos correspondientes a la administración de la memoria.


MEMORIA REAL
La memoria real o principal es donde son ejecutados los programas y procesos de una computadora y es el espacio real que existe en memoria para que se ejecuten los procesos. Por lo general esta memoria es de mayor costo que la memoria secundaria, pero el acceso a la información contenida en ella es de más rápido acceso. Solo la memoria cache es más rápida que la principal, pero su costo es a su vez mayor.


GESTIÓN DE MEMORIA CON PARTICIONES FIJAS
Consiste en dividir la memoria libre en varias partes de igual tamaño o de diferentes tamaños. En el caso de la partición fija de partes iguales, se plantean dos dificultades:
• Un programa puede ser demasiado grande para caber en la partición. En este caso, el programador debe diseñar el programa mediante superposiciones, para que sólo una parte del programa esté en memoria principal. Cuando se necesita un módulo que no está presente, el programa de usuario debe cargar dicho módulo en la partición del programa, superponiéndose a los programas y datos que se encuentren en ella.

• El uso de memoria principal es extremadamente ineficiente. Cualquier programa, sin importar lo pequeño que sea, ocupará una partición completa. Supongamos un programa que ocupa 120 Kb y se carga en una partición de 512 Kb, se malgasta el espacio interno de la partición y esto se denomina fragmentación interna.

En el caso de particiones de igual tamaño, si todas las particiones estuvieran ocupadas con procesos que no están listos para ejecutar y necesita cargarse un nuevo proceso, debe determinarse qué partición expulsarse de memoria. Esta decisión es una decisión de planificación, que se verá en un capítulo próximo.
Pero en el caso de particiones de distintos tamaños, debe determinarse en que partición (por cuestiones de tamaño) se cargará el nuevo proceso. La forma más simple es asignar cada proceso a la partición más pequeña en que quepa (sin importar si la partición está cargada o no), lo que necesitará de una cola de expulsados para cada partición. Otra forma es asignar el proceso a la partición más pequeña entre aquellas que están libres (usando una única cola para todos los procesos); y si todas las particiones están ocupadas, se debe tomar una decisión de intercambio.


GESTIÓN DE MEMORIA CON PARTICIONES VARIABLE
En un sistema monoprogramado, la memoria principal se divide en dos partes: una parte para el sistema operativo (monitor residente, núcleo) y otra parte para el programa que se ejecuta en ese instante. La parte de “usuario” de la memoria debe subdividirse para hacer sitio a varios procesos. Esta tarea de subdivisión la lleva a cabo el sistema operativo y se conoce como gestión de memoria



PARTICIÓN DE MEMORIA EN VARIABLES
Este método consiste en particiones de memoria de tamaños variable, o sea, a cada proceso se le asigna la cantidad de memoria que necesita (la cantidad exacta y ni un poco más). Tras el ingreso de nuevos procesos y la expulsión de otras, se generarán huecos de memoria inutilizados. Conforme pasa el tiempo, la memoria comienza a estar más fragmentada y su rendimiento decae; este fenómeno se denomina fragmentación externa.


PAGINACIÓN
El concepto de almacenamiento a un sólo nivel, en el que la memoria secundaria aparece como una extensión de la memoria principal, se introdujo por primera vez en el ordenador Atlas de la Universidad de Manchester alrededor de 1960, y desde entonces ha ejercido una profunda influencia en el diseño de los ordenadores.


El almacenamiento a un sólo nivel puede llevarse a cabo mediante una técnica llamada paginación, según la cual el espacio de direcciones virtuales se divide en páginas del mismo tamaño (en el Atlas eran de 512 palabras). La memoria principal se divide también en marcos o páginas físicas del mismo tamaño. Estos marcos son compartidos entre los distintos procesos que haya en el sistema, de forma que en cualquier momento un proceso dado tendrá unas cuantas páginas residentes en la memoria principal (sus páginas activas) y el resto en la memoria secundaria (sus páginas inactivas). El mecanismo de paginación cumple dos funciones:


• Llevar a cabo la transformación de una dirección virtual a física, o sea, la determinación de la página a la que corresponde una determinada dirección de un programa, así como del marco, si lo hay, que ocupa esta página.
• Transferir, cuando haga falta, páginas de la memoria secundaria a la memoria principal, y de la memoria principal a la memoria secundaria cuando ya no sean necesarias.

Con el fin de determinar la página a la que hace referencia un programa, los bits de mayor peso de la dirección se interpretan como el número de página, y los bits de menor peso como el número de palabra dentro de esta página. De ahí que si el tamaño de página es 2n, los n bits finales de la dirección representarán el número de palabra y los bits restantes del principio el número de página. El número total de bits en la dirección es suficiente para direccionar la totalidad de la memoria virtual. Así, por ejemplo, en el Atlas las direcciones de programa tenían 20 bits de longitud, proporcionando una memoria virtual de 220 palabras; el tamaño de la página era de 512 palabras (29), y de ahí que los 9 bits inferiores representasen el número de palabra y los 11 superiores representasen el número de la página. El número total de páginas en la memoria virtual era por tanto de 211 (en contraposición a las 32 páginas físicas de que disponía la memoria principal).


Es de destacar el hecho de que la división de la dirección en número de palabra y número de página, es tarea del hardware, y es transparente al programador: por lo que a él concierne está programando en un espacio secuencial de direcciones muy grande.
La transformación de número de página y de palabra en la dirección física de memoria se realiza a través de una tabla de páginas, cuyo p-ésimo elemento contiene la posición p' del marco que contiene a la página p (la posibilidad de que la p-ésima página no se encuentre en la memoria principal se abordará dentro de un momento).


SEGMENTACIÓN DE MEMORIA
Cuando hablamos de segmentación de memoria nos referimos a un método de administrar el uso de la memoria. Principalmente basándose en la agrupación lógica de la información en bloques de tamaño variable lo que denominamos Segmentos, cada uno de estos bloques de información lógica puede estar conformado por: Subrutinas, Arreglos, Etc.


Este esquema de manejo de memoria obviamente es utilizado en sistemas operativos avanzados o de gran envergadura.


La segmentación alcanza los siguientes objetivos para el manejo de la memoria los cuales son:


• Modularidad De Programas (Rutinas de programas en bloque)
• Estructuras De Datos De Largo Variable (Estructura de tamaño variable)
• Protección (Protección de módulos del segmento)
• Compartición (Dos o más procesos pueden ser un mismo segmento)
• Enlace Dinámico Entre Segmentos. (Evita realizar todo el proceso de enlace, solo cuando sea necesario)

Podemos establecer las siguientes ventajas de la segmentación.


• El programador conoce las unidades lógicas de su programa.
• Compilación de módulos separados.
• Modificaciones de módulos más fácilmente, esto no afecta al resto de los módulos.
• Es fácil compartir segmentos.
• Los segmentos crecen dinámicamente dependiendo necesidades del programa en ejecución.
• Posibilidad de definir segmentos que aún no existen.

También tenemos las siguientes desventajas de la segmentación.
• Incremento de los costos de hardware y software.
• Debido a que los segmentos tienen un tamaño variable se pueden presentar problemas de fragmentación externas.
• Se complica el manejo de la memoria virtual.
• Al permitir que los segmentos varíen de tamaño, pueden ser necesarios planes de reubicación.
• La compartición de segmentos permite ahorra memoria, pero requiere de mecanismos adicionales de hardware y software.




MEMORIA VIRTUAL
La memoria virtual es una técnica que permite ejecutar procesos que no caben totalmente en memoria RAM (memoria física).
La memoria virtual es una técnica para proporcionar la simulación de un espacio de memoria mucho mayor que la memoria física de una máquina. Esta "ilusión" permite que los programas se hagan sin tener en cuenta el tamaño exacto de la memoria física.

La ilusión de la memoria virtual está soportada por el mecanismo de traducción de memoria, junto con una gran cantidad de almacenamiento rápido en disco duro. Así en cualquier momento el espacio de direcciones virtual hace un seguimiento de tal forma que una pequeña parte de él, está en memoria real y el resto almacenado en el disco, y puede ser referenciado fácilmente
La memoria virtual también simplifica la carga del programa para su ejecución llamado reubicación, este procedimiento permite que el mismo programa se ejecute en cualquier posición de la memoria física.


  • Ventajas
Entre las Ventajas merece la pena destacar que nos permite utilizar una gran cantidad de software, al mismo tiempo dentro del sistema informático, que de otra forma no se podría utilizar al no tener suficiente memoria y que nos permite utilizar mejor los recursos del sistema informático.


  • Desventajas
El principal Inconveniente que conlleva la memoria virtual es que si existe una excesiva cantidad de páginas se ralentiza considerablemente la velocidad de proceso del sistema informático al tener que acceder constantemente al disco, pudiendo, por ello, causar colapsos en los diferentes procesos.



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. 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.


IMPLEMENTACIÓN DE MEMORIA VIRTUAL.
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.

Muchas aplicaciones requieren el acceso a más información código y datos que se puede mantener en memoria física. Esto es así sobre todo cuando el sistema operativo permite múltiples procesos y aplicaciones ejecutándose simultáneamente. Una solución al problema de necesitar mayor cantidad de memoria de la que se posee consiste en que las aplicaciones mantengan parte de su información en disco, moviéndola a la memoria principal cuando sea necesario. Hay varias formas de hacer esto. Una opción es que la aplicación misma sea responsable de decidir qué información será guardada en cada sitio (segmentación), y de traerla y llevarla. La desventaja de esto, además de la dificultad en el diseño e implementación del programa, es que es muy probable que los intereses sobre la memoria de dos o varios programas generen conflictos entre sí: cada programador podría realizar su diseño teniendo en cuenta que es el único programa ejecutándose en el sistema. La alternativa es usar memoria virtual, donde la combinación entre hardware especial y el sistema operativo hace uso de la memoria principal y la secundaria para hacer parecer que el ordenador tiene mucha más memoria principal (RAM) que la que realmente posee. Este método es invisible a los procesos. La cantidad de memoria máxima que se puede hacer ver que hay tiene que ver con las características del procesador. Por ejemplo, en un sistema de 32 bits, el máximo es 232, lo que da 4096 Megabytes (4 Gigabytes). Todo esto hace el trabajo del programador de aplicaciones mucho más fácil, al poder ignorar completamente la necesidad de mover datos entre los distintos espacios de memoria.

Aunque la memoria virtual podría estar implementada por el software del sistema operativo, en la práctica casi siempre se usa una combinación de hardware y software, dado el esfuerzo extra que implicaría para el procesador.