miércoles, 18 de noviembre de 2015

Unidad 3 Administración de memoria.

3.1 Política y filosofía.
Filosofía:
La memoria principal puede ser considerada como un arreglo lineal de localidades de almacenamiento de un byte de tamaño. Cada localidad de almacenamiento tiene asignada una dirección que la identifica.
Una de las funciones básicas que debe implementar un SO es la Administración de la Memoria para tener un control sobre los lugares donde están almacenados los procesos y datos que actualmente se están utilizando.
Sea cual sea el esquema de organización del almacenamiento que se adopte para un sistema específico, es necesario decidir qué estrategias se deben utilizar para obtener un rendimiento óptimo. Las estrategias de administración del almacenamiento determinan el comportamiento de la administración de memoria cuando se siguen ciertas políticas: 
  • ¿Cuándo se toma un nuevo programa para colocarlo en memoria? 
  • ¿Se toma el programa cuando el sistema lo solicita específicamente o intenta anticiparse a las peticiones del sistema? 
  • ¿En qué lugar del almacenamiento principal se coloca el programa por ejecutar? 
  • ¿Se colocan los programas lo más cerca unos de otros en los espacios disponibles de la memoria principal para reducir al mínimo el desperdicio de espacio, o se colocan los programas lo más rápido posible para reducir al mínimo el tiempo de ejecución? 
  • Si se necesita colocar un nuevo programa en el almacenamiento principal y éste está lleno, ¿Cuál de los otros programas se desaloja?

Políticas:
Organización de la memoria.
Forma de considerar este almacenamiento: ¿se coloca un solo programa de usuario o varios? Si se encuentran varios programas de usuario:
  • ¿se les concede la misma cantidad de espacio o particiones de diferente tamaño?
  • ¿se usa un esquema rígido de número y tamaño de particiones o un esquema dinámico y adaptable?
  • ¿se requiere que los trabajos funcionen en una partición específica o en cualquiera donde quepan?
  • ¿se requerirá o no que cada trabajo sea colocado en un bloque contiguo de memoria?
Independiente del esquema de organización hay que decidir las estrategias que se usarán para optimizar el rendimiento.

3.2 Memoria real.
Cantidad de memoria principal con que cuenta un equipo
Memoria secundaria auxiliar.- la soportada generalmente en discos.
Para que un programa pueda ser ejecutado, él y sus datos deben estar en memoria principal. Para mejorar el rendimiento del cpu se pueden repartir sus servicios entre varios programas que necesitan estar cargados simultáneamente en memoria “compartiéndola”.
La memoria real o principal se considera el recurso central, ya que tanto el cpu como los dispositivos e/s la acceden para leer o grabar.
Hay 2 parámetros relacionados con la velocidad de r/w en memoria real: 
  • Tiempo de acceso.- Tiempo que transcurre del inicio al fin de una operación r/w. 
  • Tiempo de ciclo de memoria.- Retraso que impone el hardware entre una operación y otra.
3.2.1 Administración de almacenamiento.
Direccionamiento
La memoria se puede ver como una sucesión de bytes, cada uno con su dirección y se puede acceder a ellos indicando dicha dirección.
Asignación de direcciones
¿En qué direcciones cargar los datos y programas? El programador diseña su programa sin saber dónde se cargará. Simplemente definirá una sentencia de inicio que marcará el comienzo de sus instrucciones y a partir de ella describirá el resto del programa. El compilador traducirá a lenguaje máquina y asignará a las instrucciones y variables un desplazamiento respecto a la sentencia inicial (cero relativo). Esta operación se llama asignación de direcciones relativas. Cuando el programa se enlaza, el linker lo colocará en memoria asignando el cero relativo a una dirección real y el resto de direcciones basadas en los desplazamientos (Transformación de direcciones relativas a absolutas o reales)

3.2.2 Jerarquía.
Nivel 0: Registros
Nivel 1: Memoria caché
Nivel 2: Memoria principal
Nivel 3: Disco duro (con el mecanismo de memoria virtual)
  • Registro:Memoria de alta velocidad y poca capacidad, integrada en el cpu, que permite guardar y acceder a valores muy usados, generalmente en operaciones matemáticas.Están en la cumbre de la jerarquía de memoria, y son la manera más rápida que tiene el sistema de almacenar datos. Se miden generalmente por el número de bits que almacenan; "registro de 8 bits" o "registro de 32 bits". Se implementan en un banco de registrosLos CPU’s tienen además otros registros usados con un propósito especifico, como el contador de programa. 
  • Memoria cache: tipo especial de memoria que se sitúa entre el cpu y la RAM para almacenar datos que se usan frecuentemente. Agiliza la transmisión de datos entre el CPU y la memoria principal. Es de acceso directo y mucho más rápida que la RAM.
  • Memoria principal.- Son circuitos integrados capaces de almacenar información digital, a los que tiene acceso el CPU. Poseen una menor capacidad de almacenamiento que la memoria secundaria, pero una velocidad millones de veces superior. Hay dos tipos: ROM (Read Only Memory) "Memoria de solo lectura" que almacenan códigos de programa grabados de fábrica. (BIOS)
3.2.3 Estrategia de administración de memoria.
Están dirigidas a la obtención del mejor uso posible del recurso de la memoria principal.
Se dividen en las siguientes categorías: “estrategias de búsqueda”.- establecen cuándo obtener el siguiente fragmento de programa o de datos para su inserción en la memoria principal.
o “búsqueda por demanda”.- el siguiente fragmento de programa o de datos se carga a memoria principal cuando algún programa en ejecución lo referencia.
o “búsqueda anticipada”.- puede producir un mejor rendimiento del sistema ya que no espera a que se efectúe la petición, sino que trata de anticiparse a ésta. “estrategias de colocación”.- determinan el lugar de la memoria dónde se colocará (cargará) un programa nuevo. “estrategias de reposición”.- determinan cuál fragmento de programa o datos liberar para dar lugar a los programas nuevos.

3.2.4 Asignación contigua vs no contigua.
“asignación contigua”.- cada programa ocupa un bloque contiguo de localidades de memoria.
“asignación no contigua”.- un programa se divide en varios bloques o “segmentos” que pueden almacenarse en direcciones que no tienen que ser necesariamente adyacentes, por lo que es más compleja pero más eficiente que la asignación continua.

El tamaño de los programas está limitado por la cantidad de memoria principal, pero se puede superar este límite con técnicas de “recubrimientos”, con las siguientes características (Figura 3.3 .): 
  • Si una sección particular del programa ya no es necesaria, se carga otra sección desde la memoria secundaria ocupando las áreas de memoria liberadas por la sección que ya no se necesita. 
  • La administración manual por programa del recubrimiento es complicada y dificulta el desarrollo y el mantenimiento.
Protección en los sistemas de un solo usuario
El usuario tiene un completo control sobre la totalidad de la memoria principal: 
  • La memoria se divide en porciones que contienen el S. O., el programa del usuario y una porción sin usar. 
  • El programa del usuario podría destruir áreas del S. O. que podrían: bloquear el sistema o producir salidas erróneas. 
  • El S. O. debe estar protegido contra el proceso usuario por medio de un “registro de límites o registro frontera”:
3.2.5 Multiprogramación de partición fija, partición variable, con intercambio de almacenamiento.
Multiprogramación de Partición Fija

Los sistemas de un usuario desperdician gran cantidad de recursos computacionales debido a que:
  • Cuando ocurre una petición de e/s el cpu normalmente no puede continuar el proceso hasta que concluya la operación de e/s requerida. 
  • Los periféricos de e/s frenan la ejecución de los procesos ya que comparativamente el cpu es más rápido que los dispositivos de e/s.
Los sistemas de “multiprogramación” permiten que varios procesos usuarios compitan al mismo tiempo por los recursos del sistema: 
  • Un trabajo en espera de e / s cederá el cpu a otro trabajo que esté listo para efectuar cómputos. 
  • Existe paralelismo entre el procesamiento y la e/s. 
  • Se incrementa el uso del cpu y la capacidad global de ejecución del sistema. 
  • Es necesario que varios trabajos residan a la vez en la memoria principal.
3.3 Organización de memoria virtual.
“Memoria virtual.- capacidad de direccionar un espacio de memoria mucho mayor que el disponible en la memoria primaria.
Los métodos más comunes de implementación son mediante: 
  • Técnicas de “paginación”.
  • Técnicas de “segmentación”. 
  • Combinación de ambas.
Las direcciones generadas por los programas en su ejecución no son necesariamente, las contenidas en la memoria primaria (real), ya que las direcciones virtuales suelen seleccionarse dentro de un número mucho mayor de direcciones que las disponibles dentro de la memoria primaria.

3.3.1 Evolución de las organizaciones de almacenamiento. 
  • Real: Sistemas dedicados a un usuario. 
  • Real: Sistemas de multiprogramación en memoria real:
  • Multiprogramación en partición fija:
  • Absoluta.
  • Relocalizable (reubicable).
  • Multiprogramación en partición variable. Virtual: Multiprogramación en memoria virtual:
  • Paginación pura.
  • Segmentación pura.
  • Combinación paginación / segmentación.
3.3.2 Paginación.
La necesidad de asignar memoria en cantidades contiguas para cada programa es el mayor inconveniente para un buen aprovechamiento de la misma. La paginación es una técnica de gestión que permite asignar la memoria de forma discontinua. La memoria física se divide en trozos de tamaño fijo llamados frames y la lógica en bloques de igual tamaño llamados páginas. El sistema operativo mantiene una tabla de páginas donde relaciona cada página cargada en memoria con el frame que la contenga o sea su dirección inicial en memoria real.

Administración de la memoria.
La paginación es una forma de reasignar direcciones dinámicamente. El sistema analiza cada nuevo trabajo que se disponga a entrar para conocer el número de páginas que ocupa y buscará en su lista de frames libres un número igual de ellos. Si existen, cargará en ellos las páginas del programa y construirá la correspondiente tabla de páginas actualizando la lista de frames libres. Cada trabajo en memoria tendrá su propia tabla de páginas apuntadas por el pcb. Así se logra evitar la fragmentación externa ya que cualquier frame libre es asignable a un trabajo que lo necesite. Seguirá existiendo fragmentación interna porque generalmente los trabajos no ocupan el total de la página. Esta fragmentación se reduce si la página tiene un tamaño pequeño, pero se necesita una tabla de páginas mayor.

Rendimiento. Memoria Caché. Registros asociativos.
Para agilizar la conversión de direcciones el sistema mantiene en memoria la tabla de páginas de los trabajos activos y usa un registro especial llamado registro base, para indicar la dirección de la tabla de páginas del proceso en ejecución. Así cuando se conmute de un trabajo a otro se restaura la dirección de la tabla de páginas correspondiente.
Para transformar cada dirección lógica (p,d) generada por el cpu en su dirección real, el sistema accede en primer lugar a la tabla de página correspondiente (registro base + p) y después a la dirección real (frame + d). Así cada dirección provoca dos accesos a memoria y se duplican los tiempos de ejecución. Se mejora el uso de la memoria pero los procesos son más largos.
Para resolver esto se recurre a memorias pequeñas de muy alta velocidad (muy caras) donde se puedan mantener las entradas a las tablas de páginas más usadas. Esta memoria (caché) es similar a la principal pero con menor tiempo de acceso y con eso se reduce el retraso producido por la paginación.

Páginas compartidas.
La paginación permite que varios procesos compartan páginas en memoria. Esto es bueno para los sistemas de tiempo compartido. Imaginemos un sistema con 20 usuarios que usan un editor de textos, en el sistema se cargará una sola vez el programa correspondiente y éste será usado por todos ellos aunque los datos sean propios de cada uno. Cada usuario contendrá en su tabla de páginas las entradas correspondientes al editor, apuntando todas ellas a los mismos frames y a distintos para los datos.
Es común usar páginas compartidas, su contenido debe permanecer inalterado y tener código reentrante (durante la ejecución no se altera ningún valor interno).
Si el contenido de las páginas compartidas no debe modificarse, deben protegerse contra todo intento de escritura. Se necesita un sistema de protección de páginas en memoria que controle las direcciones a las que se puede acceder y el modo en que se hace dicho acceso. Para ello se añaden a las entradas de la tabla de páginas una serie de bits de protección (dirección de la pagina), el esquema de protección se complementa con otro bit por entrada de la tabla de páginas llamado bit de validez (modo r o w).

3.3.3 Segmentación.
La segmentación es una técnica distinta de gestión de memoria que pretende acercarse más al punto de vista del usuario.
Los programas se desarrollan, generalmente, en torno a un programa principal desde el que se bifurca a otras partes (rutinas) o se accede a zonas de datos (tablas, pilas, etc.).
Desde este punto de vista, un programa es un conjunto de componentes lógicos de tamaño variable o un conjunto de segmentos, es decir, el espacio lógico de direcciones se considera como un conjunto de segmentos, cada uno definido por su tamaño y un número.

3.3.4 Sistemas de paginación-segmentación.
Tanto la paginación como la segmentación, tienen ventajas e inconvenientes, y parece lógico intentar combinar ambas técnicas para aprovechar sus características positivas.
En todo sistema se define, por su arquitectura, un espacio máximo de direcciones lógicas, tamaño máximo de cualquier programa que quiera ejecutarse, e implica un número de páginas. Por esto, algunos sistemas usan una técnica de paginación segmentada consistente en segmentar la tabla de páginas adecuándola al tamaño del programa. Para ello, mantiene una tabla de segmentos cuyas entradas indican la dirección de inicio de cada tabla de páginas y su tamaño. Se usa un hardware especial.
Otros sistemas optan por paginar los segmentos, es decir, usan segmentos cuyo tamaño es un número entero de páginas. Esta técnica se denomina segmentación paginada.
La tabla de segmentos de la segmentación pura cambia de contenido y sus entradas ya no apuntan al inicio del segmento correspondiente indicando su tamaño, sino que apuntan a una tabla de páginas del segmento indicando su longitud.
De esta forma se evita la fragmentación externa propia de la segmentación, pues cualquier hueco será de una página como mínimo, y por tanto usable para cualquier segmento que lo necesite.

3.4 Administración de memoria virtual.
Los sistemas de gestión de la memoria vistos hasta ahora están sujetos a la exigencia de que un programa, para ejecutarse, debe de estar cargado en memoria principal en su totalidad. Sin embargo, no todas las partes del programa se ejecutan a la vez.
El programador diseña rutinas que sólo se ejecutan en determinadas circunstancias. Por ejemplo, las rutinas de error. Así, no parece necesario que todo el programa esté cargado en memoria para poder ser procesado.
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. 
  • 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 entrada/salida para las operaciones de carga e intercambio de los mismos.
3.4.1 Estrategias de administración.
Las diferentes partes de un programa se van cargando en memoria a medida que se necesitan, y por ello, esta técnica debe considerar tres aspectos importantes:
  • Carga. Las porciones del programa se cargan cuando se necesiten (demanda) o se cargan por adelantado (anticipación). 
  • Colocación. Los sistemas de memoria virtual que utilicen segmentación deben decidir, al cargar un nuevo segmento, si lo hacen en el hueco más adecuado (best fit) o bien en el primero posible (first fit). 
  • Reemplazo. Lo normal será que toda la memoria real esté ocupada, y cuando se necesite cargar una nueva parte de un programa habrá que reemplazar alguna de las existentes. Es importante definir la selección de la parte a reemplazar.
3.4.2 Técnicas de reemplazo de páginas.
La técnica de petición de páginas permite reducir la memoria ocupada por cada programa durante su proceso.
Todos los sistemas que usan la técnica de memoria virtual sobreutilizan en mayor o menor medida la memoria física para obtener un mejor rendimiento. Para ello, deben hacerse algo más complejos:
Supongamos que uno de esos programas intenta acceder a una dirección cuya página no está en memoria. El hardware la intercepta y cede el control al sistema operativo que, después de comprobar que es una dirección legal, la trata como una falta de página. Buscará un hueco en memoria. En este punto al analizar la lista de frames libres comprueba que no hay hueco disponible y, como responsable de la gestión de la memoria, debe resolver la situación sin afectar al programa.
Una posible solución es sacar de memoria algún programa cargado y usar los frames que deja libres, pero esto lleva consigo una sobrecarga importante en la operación de intercambio (swap).
La solución adoptada, generalmente, es sustituir alguna de las páginas cargadas (reemplazar páginas). Para ello, la rutina del sistema que gestiona la interrupción de falta de página deberá trabajar de la siguiente manera: 
  • Encontrar la página solicitada en el almacenamiento secundario. 
  • Encontrar un frame libre. 
  • Si existe, usarlo. 
  • Si no existe, usar un algoritmo de reemplazamiento para seleccionar la página a reemplazar. 
  • Salvar la página reemplazada en el almacenamiento secundario, actualizando las tablas afectadas. 
  • Llevar la página solicitada al frame libre y actualizar las tablas correspondientes.
3.4.3 Paginación por demanda.
Este es el esquema de carga más común cuando se usa la técnica de memoria virtual. Su funcionamiento es similar al de un sistema de paginación con intercambio.
Ahora el algoritmo de intercambio no llevará a memoria todo el programa, sino que sólo cargará aquellas páginas que se le pidan.
Cuando el cpu genere una dirección que pertenezca a una página que no se encuentre en memoria <<falta de páginas>>, la buscará, y a continuación, la traerá a memoria desde el correspondiente dispositivo de memoria secundaria.
El tratamiento de las faltas de página introduce un retraso adicional en la ejecución de los programas y afecta por tanto al rendimiento general del sistema. El diseño del software necesario debe ser especialmente cuidadoso en este aspecto.

3.4.4 Paginación anticipada.
El S. O. intenta predecir las páginas que un proceso va a necesitar y a continuación precarga estas páginas cuando hay espacio disponible.
Mientras el proceso ejecuta sus páginas actuales, el sistema carga páginas nuevas que estarán disponibles cuando el proceso las pida, debido a ello, el tiempo de ejecución de un proceso se puede reducir.

3.4.5 Liberación de página.
Un proceso usuario puede emitir una “liberación voluntaria de página” para liberar el frame cuando ya no necesite esa página. Se puede eliminar el “desperdicio” y acelerar la ejecución.
El inconveniente es que la incorporación de mandatos de liberación de páginas dentro de los programas de usuario puede ser peligrosa y retrasar el desarrollo de aplicaciones.
“Los compiladores y S. O. deberían detectar automáticamente situaciones de liberación de página mucho antes de lo que es posible con estrategias de conjuntos de trabajo”.

3.4.6 Tamaño de página.
Decidir el tamaño adecuado no es sencillo puesto que hay que equilibrar diversos factores:
Generalmente la memoria real se divide en frames de tamaño fijo.
Los interrogantes tienen que ver con el tamaño de las páginas, si todas las páginas tendrán igual tamaño, si en caso de usar páginas de diferente tamaño las páginas mayores deben ser o no múltiplos enteros de las menores, etc.

No hay comentarios.:

Publicar un comentario