administración de almacenamiento

82
Administración de Almacenamiento Tania Pérez Miguel Angel Mendoza

Upload: noble-osborne

Post on 01-Jan-2016

31 views

Category:

Documents


0 download

DESCRIPTION

Administración de Almacenamiento. Tania Pérez Miguel Angel Mendoza. ¿Por qué y para quién es importante?. El almacenamiento es un recurso escaso en los sistemas de cómputo. La administración de almacenamiento es una inquietud general tanto para los: Programadores Implementadores y - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Administración de Almacenamiento

Administración de Almacenamiento

Tania Pérez

Miguel Angel Mendoza

Page 2: Administración de Almacenamiento

¿Por qué y para quién es importante?

El almacenamiento es un recurso escaso en los sistemas de cómputo.

La administración de almacenamiento es una inquietud general tanto para los:

• Programadores• Implementadores y• Diseñadores de lenguajes.

Page 3: Administración de Almacenamiento

Diseñadores

Los lenguajes contienen muchas restricciones o características que pueden ser explicadas solamente por el simple deseo de los diseñadores en permitir una u otra técnica en la administración del almacenamiento.

Por ejemplo, FORTRAN no permite llamadas a subprogramas de manera recursiva e hipotéticamente, si esto fuera posible, no habría algún cambio en su sintaxis pero su implementación requeriría de una estructura dinámica que administrara el almacenamiento en tiempo de ejecución.

Pascal esta cuidadosamente diseñado para permitir que la administración del almacenamiento se realice dinámicamente a través de un stack.

LISP por ejemplo, permite la recolección de basura.

Page 4: Administración de Almacenamiento

Implementadores

Cada lenguaje permite el uso de ciertas técnicas en la administración de almacenamiento, los detalles en los mecanismos y su representación en hardware y software, son las tareas del implementador.

Por ejemplo, el diseño de LISP se enfoca en la recolección de basura y el uso de una lista de espacio libre como las bases de la administración de almacenamiento, pero existen una gran cantidad de técnicas que solucionan esta necesidad; así que el implementador deberá escoger la técnica mas apropiada para el HW y el SW disponible.

Page 5: Administración de Almacenamiento

Programadores

Es de suma importancia que los programas usen de manera eficiente el almacenamiento disponible, esto significa que los programadores deberán tener un control directo (aunque mínimo, para evitar interferencias con los administradores de almacenamiento controlados por el sistema) sobre la administración del almacenamiento.

Por ejemplo, PL/1 permite al usuario cierto control en la administración del almacenamiento sobre sus propias estructuras de datos con las operaciones: ALLOCATE y FREE.

PASCAL hace lo propio con las operaciones NEW y DISPOSE.

Page 6: Administración de Almacenamiento

Principales elementos de datos, programas y operaciones que requieren almacenamiento

en tiempo de ejecución

• Segmentos de código que se usan en la traducción de los programas del usuario.

• Programas del sistema que soportan la ejecución de los programas del usuario. 

• Estructuras de datos y constantes definidas por el usuario.• Puntos de regreso de subprogramas.• Entornos de referencia• Asignaciones temporales en evaluación de expresiones.• Asignaciones temporales en el paso de parámetros.• Buffers de entrada y salida.• Datos propios del sistema.• Llamadas a subprogramas y retorno de operaciones.• Operaciones como: creación y destrucción de estructuras de datos.• Operaciones como: inserción y borrado de componentes.

Page 7: Administración de Almacenamiento

Principales elementos que requieren espacio en tiempo de ejecución

• Segmentos de código para los programas de usuario.

 Una gran parte de los bloques de almacenamiento en cualquier sistema debe ser reservada para guardar los segmentos de código que representarán la traducción de los programas de usuario.

 

Page 8: Administración de Almacenamiento

Principales elementos que requieren espacio en tiempo de ejecución

• Programas del sistema en tiempo de ejecución 

Otra parte sustancial del bloque de almacenamiento durante la ejecución debe ser reservada para los programas de sistema que soporten la ejecución de los programas del usuario.

 Estas pueden ser desde simples rutinas de librerías, por ejemplo de funciones matemáticas o funciones que impriman cadenas hasta intérpretes o traductores de software presentes durante la ejecución.

Page 9: Administración de Almacenamiento

Principales elementos que requieren espacio en tiempo de ejecución

• Estructuras de datos y constantes definidas por el usuario

 

Debe de existir espacio disponible para las estructuras que fueron creadas o declaradas por el usuario, incluyendo las constantes.

Page 10: Administración de Almacenamiento

Principales elementos que requieren espacio en tiempo de ejecución

•  Puntos de regreso de subprogramas

 

Como los subprogramas tienen la propiedad de ser invocados desde cualquier parte del programa, debe reservarse memoria para el control de secuencia generada internamente, como los puntos de retorno de estos.

Page 11: Administración de Almacenamiento

Principales elementos que requieren espacio en tiempo de ejecución

• Entornos de referencia

 Conocidos como asociaciones de identificadores. Estos pueden requerir de una gran cantidad de espacio, por ejemplo una lista A en LISP (más adelante se verá lo que es esto).

Page 12: Administración de Almacenamiento

Principales elementos que requieren espacio en tiempo de ejecución

• Asignaciones temporales en evaluación de expresiones.

 Se requiere un espacio de almacenamiento temporal para los resultados intermedios de una evaluación. Por ejemplo, en la evaluación de la expresión (x + y) * (u + v), el resultado de la primera suma debe ser almacenado temporalmente mientras el resto de la evaluación se completa.

Page 13: Administración de Almacenamiento

Principales elementos que requieren espacio en tiempo de ejecución

• Asignaciones temporales en el paso de parámetros

 Cuando un subprograma es llamado, una lista de los parámetros en turno debe de ser evaluada y los resultados almacenados temporalmente hasta que la evaluación de la lista se complete. Cuando la evaluación de algún parámetro de la lista requiera llamadas a funciones recursivas, existe la posibilidad de que se emplee un número ilimitado de almacenamientos temporales sucesivos.

Page 14: Administración de Almacenamiento

Principales elementos que requieren espacio en tiempo de ejecución

• Buffers de entrada y salida (Registros bidireccionales)

 Los buffers sirven como áreas de almacenamiento temporal donde los datos son guardados durante el tiempo de transferencia física hacia el almacenamiento externo, incluso, es posible efectuar operaciones con sus datos. Generalmente cientos de localidades son reservadas para los registros, mas si se trata de arquitecturas tipo RISC.

Page 15: Administración de Almacenamiento

Principales elementos que requieren espacio en tiempo de ejecución

• Datos propios del sistema

En casi todos los lenguajes, se requiere almacenamiento para diversos datos propios del sistema, por ejemplo: la información sobre el status de los registros, estados de banderas, bits contadores de referencia o de recolección de basura.

Page 16: Administración de Almacenamiento

Principales elementos que requieren espacio en tiempo de ejecución

Además de los elementos antes mencionados, es necesario considerar las principales operaciones que requieren almacenamiento en memoria:

•  Llamadas a subprogramas y retorno de operaciones.

Las llamadas a subprogramas, entornos de referencia y otros datos utilizados en subprogramas son la mayoría de operaciones que requieren almacenamiento. La ejecución del retorno desde un subprograma, usualmente requiere la liberación del espacio de almacenamiento utilizado durante su ejecución (información definida por la liga dinámica).

Page 17: Administración de Almacenamiento

Principales elementos que requieren espacio en tiempo de ejecución

• Operaciones como: creación y destrucción de estructuras de datos.

 Si el lenguaje posee operaciones que permiten la creación de nuevas estructuras de datos en puntos arbitrarios durante la ejecución de un programa (no solamente cuando inicia algún subprograma), entonces estas operaciones normalmente requieren disponer de espacio aparte del utilizado cuando inicia el subprograma. Ejemplos de esto son las instrucciones new en pascal o malloc en C. Además el lenguaje debe proveer una operación explícita de destrucción como dispose en pascal o free en C.

Page 18: Administración de Almacenamiento

Principales elementos que requieren espacio en tiempo de ejecución

• Operaciones como: inserción y borrado de componentes

 Si el lenguaje proporciona operaciones de inserción y borrado en una estructura de datos, es necesario definir operaciones de almacenamiento y liberación del espacio para que estas operaciones puedan ser implementadas.

Page 19: Administración de Almacenamiento

¿Cómo y cuándo se asignan los espacios de almacenamiento?

• Inicialmente. Asignación definida antes de la ejecución de un programa.

• Recuperando espacios.

Asignación definida en ejecución.

• Reusando espacios.

Page 20: Administración de Almacenamiento

Fases del manejo de almacenamiento

• Asignación inicial

Al principio de la ejecución cada pieza de almacenamiento debera estar: reservada o disponible. Si inicialmente resulta libre, entonces estará disponible para poder ser reservada dinámicamente durante la ejecución del programa. Cualquier sistema de almacenamiento requiere de alguna técnica para mantener un registro del espacio libre, así como mecanismos para liberar o asignar este espacio libre dependiendo de las necesidades durante la ejecución.

Page 21: Administración de Almacenamiento

  Fases del manejo de almacenamiento

• Recuperación

El almacenamiento que ha sido asignado y usado subsecuentemente debería de ser recuperado por el administrador de almacenamiento para su reuso. El proceso de recuperación puede ser simple, como el reposicionamiento del apuntador de pila, o complejo, como la recuperación de “basura”.

Page 22: Administración de Almacenamiento

  Fases del manejo de almacenamiento

• Compactación y reuso.

En el mejor de los casos, el espacio de almacenamiento recuperado podría estar inmediatamente listo para su reúso. Otras veces podría ser necesaria la compactación, que es la construcción de grandes bloques libres a partir de piezas pequeñas de almacenamiento. El reúso normalmente involucra las mismas técnicas que la asignación inicial.

Page 23: Administración de Almacenamiento

Tipos de Administración del Alamacenamiento

1. Estático. Asignación que permanece fija durante toda la ejecución.

2. Dinámico• Stack• Heap

1. Elementos de Tamaño fijo

2. Elementos de Tamaño Variable

Page 24: Administración de Almacenamiento

Manejo de almacenamiento estático

• Es la manera más sencilla de asignación. El espacio reservado durante la traducción del programa permanece fijo durante la ejecución. No requiere almacenamiento en tiempo de ejecución y por supuesto tampoco provee recuperación y reuso.

• Normalmente el almacenamiento de segmentos de código del usuario y programas del sistema (así como las microinstrucciones) son almacenados estaticamente.

• El manejo de almacenamiento estático es eficiente, ya que no se requiere de tiempo ni de espacio para la administración de almacenamiento durante la ejecución. 

• Para muchos programas la asignación estática es bastante satisfactoria. FORTRAN y COBOL están diseñados para almacenamiento estático.

Page 25: Administración de Almacenamiento

Manejo de almacenamiento basado en el stack.• Es la forma más simple de administración de almacenamiento en

tiempo de ejecución. El espacio libre al inicio de la ejecución consiste en un bloque secuencial de la memoria. Conforme un nuevo espacio es solicitado, este es tomado de localidades sucesivas de este bloque, comenzando por algún extremo. El espacio debe de ser liberado en orden inverso, para que el bloque de espacio liberado quede siempre en la parte alta de la pila. 

• Basicamente lo que se necesita para controlar este tipo de almacenamiento es un stack pointer. Este siempre apuntará a la siguiente localidad disponible del stack.

• El mecanismo de compactación es automático.• Esta es una estructura de llamadas de subprogramas y returnos

anidados del tipo: último en entrar - primero en salir.

Page 26: Administración de Almacenamiento

Manejo de almacenamiento basado en el stack.

PASCAL

La mayoría de las implementaciones de Pascal están basadas en una pila central de registros de activación de subprogramas, junto con un área estáticamente reservada que contiene los programas del sistema y los segmentos de código de subprogramas. 

Page 27: Administración de Almacenamiento

Manejo de almacenamiento basado en el stack.

Organización de la memoria en Pascal en tiempo de ejecución

Page 28: Administración de Almacenamiento

Manejo de almacenamiento basado en el stack.

LISP

Las llamadas a subprogramas son estrictamente anidadas y también el stack es usado para los registros de activación. Cada registro de activación contiene un punto de retorno (liga dinámica) y un espacio temporal para la evaluación de expresiones y el paso de parámetros. Pero las referencias a entornos locales son guardadas en un stack separado representado como una lista de ligas, llamada A-list.

Page 29: Administración de Almacenamiento

Manejo de almacenamiento basado en el stack

Organización de la memoria en LISP durante la ejecución

Page 30: Administración de Almacenamiento

Para colocar un arreglo en el área de heap

Los programadores necesitan hacer esto cuando se obtienen algún error del tipo: “existen muchas variables” o “se esta fuera del rango disponible para datos”.

La solución de esto es colocar la estructura de dato al área de heap. En PASCAL, esto se logra usando un apuntador al arreglo y la definición del arreglo se haría en la sección de TYPE, mas no en la sección de VAR.

Si se escribe un enunciado del tipo:var MyArray: array[0..100] of Char

entonces, se estará asignando espacio de memoria en el segmento de datos, que es lo que se quiere evitar. La solución es definir el arreglo en la sección TYPE y declararlo en la sección VAR.

var MyArray: PMyArray;donde PMyArray es un apuntador a un arreglo.

Page 31: Administración de Almacenamiento

UsesDos,Crt;

TypePMyArray = ^TMyArray; { PMyArray es un apuntador a estructuras del tipo TMyArray }TMyArray = array[0..999] of LongInt; { TMyArray es un arreglo de 1000 elementos }

procedure Pause;begin

FlushKeyBuffer; { Este es un procedure que se asegurar que el buffer de las teclas esté vacío } ReadKey; { Pausa… }

end;Var

MyAry: PMyArray; { MyAry es un apuntador al arreglo TMyArray}i: Integer;

beginClrScr;New(MyAry); { Asigna espacio de memoria en el heap, el tamaño asignado corresponderá al

tamaño de la estructura TMyArray }for i := 0 to 999 do { Llena el arreglo }

MyAry^[i] := i;for i := 500 to 510 do { Escribe algunos elementos del arreglo en la pantalla }

WriteLn(MyAry^[i]);Pause;Dispose(MyAry); { Desaloja la memoria }end.

 Recordar siempre desalojar la memoria asignada con NEW !!!

Page 32: Administración de Almacenamiento

Administración de almacenamiento por heap: Elementos de tamaño fijo.

• El tercer tipo de manejo de almacenamiento es el llamado almacenamiento por heap. Un heap es un bloque de almacenamiento con piezas que son asignadas y liberadas de una manera relativamente estructurada. Aquí los problemas de reservación de espacio, recuperación, compactación y nuevo uso pueden ser difíciles de resolver.

Page 33: Administración de Almacenamiento

Administración de almacenamiento por heap: Elementos de tamaño fijo.

• La necesidad de utilizar un heap surge cuando un lenguaje permite almacenamiento para asignación y liberación en puntos arbitrarios durante la ejecución de un programa.

Page 34: Administración de Almacenamiento

ML

• Por ejemplo en ML dos listas pueden concatenarse para la creación de una tercera

fun append (nil, l) = l  | append (h::t, l) = h :: append (t, l)

Page 35: Administración de Almacenamiento

ML

• El programador puede definir dinámicamente un nuevo tipo de datos.Se activan los mecanismos necesariosCompiler.Control.Lazy.enabled := true;open Lazy;

• Se define un tipo de streams:• datatype lazy 'a stream = Cons of 'a * 'a

stream• La palabra reservada "lazy" indica que los valores de tipo 'a

stream son cálculos pendientes, que al ser efectuados, generan un valor de la forma Cons (x, c), con x un valor de tipo 'a, y c es otro valor de tipo 'a stream, i.e., otro cálculo que depende del primer valor

Page 36: Administración de Almacenamiento

LISP

• Se puede agregar un nuevo elemento a una estructura de lista ya existente en cualquier punto.

• Tambien se puede liberar espacio en puntos impredecibles durante la ejecución.

Page 37: Administración de Almacenamiento

LISP

• > (append '(1 2 3) '(4 5 6)) ;concatenate lists (1 2 3 4 5 6) • > (intersection '(a b c) '(b)) ;set intersection (B) • > (union '(a) '(b)) ;set union (A B) • > (set-difference '(a b) '(a)) ;set difference

Page 38: Administración de Almacenamiento

Almacenamiento por Heap

• Hay que gestionar el almacenamiento dinámico de:

– Elementos de Tamaño fijo– Elementos de Tamaño variable

Page 39: Administración de Almacenamiento

Elementos de tamaño fijo

• Un elemento almacenado en el heap y después liberado ocupa N palabras de la memoria. Generalmente N debe de ser 1 o 2. Suponiendo que el heap ocupa un bloques contiguos de la memoria, conceptualmente podemos dividirlo en una sucesión de K elementos, cada uno de longitud N, así que el tamaño del heap es N*K.

Page 40: Administración de Almacenamiento

Elementos de tamaño fijo

• Inicialmente los K elementos están ligados para formar una lista de espacio libre. Esto quiere decir que la primera palabra de cada elemento en la lista apunta a la primera palabra del siguiente elemento en la lista. Para reservar un elemento, el primer elemento en la lista de espacio libre es removido de la lista y su apuntador es retornado a la operación que solicitó el almacenamiento

Page 41: Administración de Almacenamiento

Elementos de tamaño fijo.Cuando un elemento es liberado, simplemente es ligado a la cabeza de la lista de espacio libre.

Page 42: Administración de Almacenamiento

Recuperación: Contadores de referencia y recolección de basura

• La forma más sencilla de recuperación es la del retorno explícito. Cuando un elemento que estaba en uso está disponible para ser usado nuevamente, este debe ser explícitamente identificado como free y retornado a la lista de espacio libre.

• Cuando los elementos son utilizados por el sistema, cada rutina del sistema es responsable de liberar el espacio.

Page 43: Administración de Almacenamiento

Recuperación

• El retorno explícito es la técnica natural para administrar el almacenamiento en el heap, pero desafortunadamente no siempre es posible emplearla. Hay dos problemas que la inutizan: garbage y dangling references.

Page 44: Administración de Almacenamiento

Recuperación

• dangling references: si una estructura se destruye antes de que todos los accesos a la estructura hayan sido destruidos, cualquier trayectoria restante se convierte en una referencia dangling.

• Garbage: si el último acceso a la estructura es destruido sin que la estructura misma sea destruida, entonces la estructura se convierte en garbage.

Page 45: Administración de Almacenamiento

Recuperación

• El retorno explícito de heaps facilita la creación de garbage y dangling references.

• Ejemplos en C: Garbage:int *p, *q; /* p y q son apuntadores a enteros */...p=malloc(sizeof(int)); /* se almacena un entero */p = q; /* se pierde la dirección de p */ 

Page 46: Administración de Almacenamiento

Recuperación

• dangling: 

int *p, *q; /* p y q son apuntadores a enteros */

...

p=malloc(sizeof(int)); /* se almacena un entero */

q = p; /* se copia a q la dirección de p */

free(p); /* se libero el espacio apuntado por q */

Page 47: Administración de Almacenamiento

Recuperación

En el contexto de la administración de almacenamiento en heap:

• una referencia dangling es un apuntador a un elemento que ha sido retornado a la lista de espacio libre, y cuyo espacio podría ser utilizado para cualquier otro propósito.

• Un elemento garbage es uno que está disponible para su reuso, pero que como no se encuentra en la lista de espacio libre, se convierte en espacio inaccesible

Page 48: Administración de Almacenamiento

LISP

• El sistema enfrenta las mismas dificultades que el usuario. En LISP. Por ejemplo, las listas ligadas son un tipo de estructura de datos básico. Una de las operaciones primitivas de LISP es cdr, la cual, dado un apuntador a un elemento en la lista ligada, retorna un apuntador al siguiente elemento de la lista

Page 49: Administración de Almacenamiento

Función cdr de LISP

Page 50: Administración de Almacenamiento

LISP

• El siguiente elemento al que fue originalmente apuntado podría haber sido ser liberado por la operación cdr, si el único apuntador hacia este es el determinado por cdr . Si cdr no retorna el elemento a la lista de espacio libre, este se convierte en basura.

Page 51: Administración de Almacenamiento

LISP

• Sin embargo, si cdr manda el elemento a la lista de elementos libres y existen otros apuntadores hacia él, entonces estos apuntadores se convierten en dangling references. Si no existe una forma de determinar cuando estos otros apuntadores existen, entonces cdr se convierte en un generador potencial de garbage o de dangling references.

Page 52: Administración de Almacenamiento

Recuperación de espacio

• Existen otras alternativas para la solución de estos problemas en el retorno explicito, una es la de los reference counts y otra la de los garbage colectors.

Page 53: Administración de Almacenamiento

Reference counters

• El uso de un contador de referencia genera un requerimiento mayor de espacio. El contador de referencia indica cuantos apuntadores a un elemento existen. Cuando un elemento es colocado en el espacio libre, su contador de referencia se inicializa en 1. Cuando un se crea un nuevo apuntador al elemento, el contador se incrementa en uno. Cuando éste apuntador es destruido, el contador de referencia se decrementa en uno. Cuando el contador de referencia de un elemento llega a cero, el elemento es libre y regresa a la lista de espacio libre

Page 54: Administración de Almacenamiento

Reference counters

• Cuando el programador utiliza la instrucción erase o free, el contador de referencia también provee protección a la información. Si se emplea la sentencia free, el contador de referencia se decrementa en 1. Si la cuenta llega a cero la estructura regresa a la lista de espacio libre; si por el contrario, el contador de referencia es mayor a cero, esto indica que la estructura sigue siendo accesible y entonces la sentencia free no tiene efecto

Page 55: Administración de Almacenamiento

Función cdr en LISP

Liberar * si la cuenta de referencia es 0

Page 56: Administración de Almacenamiento

Reference Counters

• El problema que genera al utilizar al contador de referencia es el costo que hay que pagar para mantenerlo. Dado que la acción de incrementar y decrementar es llevada a cabo continuamente, la eficiencia de la ejecución disminuye.

Page 57: Administración de Almacenamiento

Reference Counters

• Supongamos el ejemplo de asignar a un apuntador P, el valor de un apuntador Q, esto es:

 

int *P, *Q;

 

P=2;

P=Q;

Page 58: Administración de Almacenamiento

Reference Counters

• Sin el contador de referencia solo era necesario copiar el valor de Q en P; ahora se tienen que llevar a cabo varias tareas:

 • 1. Acceder al elemento apuntado por P y decrementar

su contador en 1.• 2. Verificar el resultado de la operación anterior; si el

resultado es cero, regresar la estructura al espacio libre.• 3. Copiar la liga al valor apuntado por Q en P.• 4. Acceder al elemento apuntado por Q e incrementar

el contador de referencia por 1.

Page 59: Administración de Almacenamiento

Reference Counters

• Esto incrementa substancialmente el costo de esta simple operación. Cualquier operación similar que pueda crear o destruir apuntadores debe de modificar los contadores de referencias también. Además, existe un costo extra de almacenamiento para mantener los contadores de referencias.

Page 60: Administración de Almacenamiento

Recolección de basura

• La filosofía es permitir la generación de basura, o espacio no utilizado, pero que no se encuentra en la lista de espacio libre, con el fin de evitar referencias dangling (desactivadas)

Page 61: Administración de Almacenamiento

Recolección de basura

• El principal problema que genera la acumulación de basura es la cantidad de espacio que queda inutilizable conforme la ejecución del programa avanza.

 

Page 62: Administración de Almacenamiento

Recolección de basura

• La idea del modelo de recolección de basura es simple: cuando el espacio libre es ocupado totalmente y es necesario más espacio para almacenar, el cómputo se suspende temporalmente y un proceso de recolección de basura tiene lugar. Este identifica los elementos inservibles en la estructura y los regresa al espacio libre. Una vez liberado el espacio, el cómputo se reanuda y el proceso de recolección de basura no se vuelve a activar hasta que el espacio libre se haya agotado

Page 63: Administración de Almacenamiento

Recolección de basura

El proceso de recolección de basura se lleva a cabo en dos fases:

•  Marcado. En éste proceso cada elemento activo dentro de la estructura es marcado. Esta marca pone el bit del colector de basura en apagado.

• Barrido. Mediante un proceso secuencial se examinan todos los elementos de la estructura, siendo mandados al espacio libre todos aquellos que posean encendido el bit de recolección de basura; al mismo tiempo que se lleva a cabo el barrido todos los elementos, sus bits de barrido son reestablecidos.

 

Page 64: Administración de Almacenamiento

Recolección de basura

• La parte relativa al marcado es la más difícil del proceso, debido a que como el espacio libre se encuentra agotado, cada elemento dentro de la estructura se encuentra activado, por tanto deberá ser analizado en el proceso. Desafortunadamente, la revisión de cada elemento no puede arrojar como resultado si el elemento debe ser enviado al espacio libre o no, además un apuntador de un elemento a otro dentro de nuestra estructura no precisa que éste elemento se encuentre activo.

Page 65: Administración de Almacenamiento

Recolección de basura

• Para identificar los elementos que se encuentran activos, se buscan ligas que salgan de nuestra estructura, éstos elementos se pueden considerar activos, además de los que tengan ligas con elementos activos.

Page 66: Administración de Almacenamiento

Recolección de basura

• Para realizar este proceso de marcado se asumen las siguientes características:

1. Ningún elemento activo deberá ser alcanzado desde fuera de la estructura por un cambio de apuntadores.

2. Deberá ser posible localizar cualquier apuntador externo que apunte hacia algún elemento de nuestra estructura.

3. Debe ser posible identificar cuando un elemento dentro de la estructura no tiene apuntadores procedentes de otro elemento dentro de la misma.

Page 67: Administración de Almacenamiento

LISP

Page 68: Administración de Almacenamiento

Esta figura será

explicada en los

acetatos siguientes

Asignación de Almacenamiento en LISP

Page 69: Administración de Almacenamiento

Asignación de almacenamiento en LISP

• La relación entre el stack y el heap en LISP se muestra en la figura anterior. En esta figura, se supone que:

El almacenamiento en el heap contiene 15 elementos, de los cuales 9 están actualmente en la lista de espacio libre. (a)

Page 70: Administración de Almacenamiento

Asignación de almacenamiento en LISP

• Las definiciones siguientes han sido introducidas por el usuario:

• (defun f1(x y z) (cons x f2,y,z)))

• (defun f2(v w) (cons v w))

Page 71: Administración de Almacenamiento

Asignación de almacenamiento en LISP

• La ejecución de la expresión (f1 ‘a ‘(b c) ‘(d e)) tiene lugar como sigue:

• 1. Se invoca f1 y los argumentos x y z se agregan al stack usando las 9 entradas de heap disponibles en la lista de espacio libre (b)

• 2. Se invoca f2 con apuntadores a sus argumentos v y w (c)

• 3. La lista de espacio libre está vacía. El recolector de basura marca primero los elementos a los que se apunta desde el stack y luego, en un segundo paso, pone todos los elementos restantes en la lista de libres. (d)

Page 72: Administración de Almacenamiento

Asignación de almacenamiento en LISP

• Se calcula el valor de f2 y se pone en el stack (e)• 5. Se calcula el valor de f1 y se pone en el stack

(f). El sistema de LISP mostraría automáticamente este resultado al usuario

• 6. Todos los elementos del cómputo son ahora basura. Cuando la lista libre vuelva a estar vacía, serán recuperados por la próxima recolección de basura.

Page 73: Administración de Almacenamiento

Heap: Elementos de tamaño variable

• El manejo de estructuras de almacenamiento es complejo cuando los elementos que contienen están conformados por estructuras de datos creadas por el usuario o registros de activación. Este tipo de datos impiden que la memoria se maneje de una manera ordinaria y se deben aplicar técnicas para recuperar el espacio libre dentro de las páginas de memoria para reutilizar este espacio.

Page 74: Administración de Almacenamiento

Almacenamiento inicial y reuso

• Cuando los elementos guardados en la estructura de almacenamiento tienen un tamaño fijo, el uso del espacio libre y el espacio ocupado se realiza con simples sumas a partir del apuntador inicial y el tamaño de la página. En el caso de elementos de tamaño variable la localización del espacio libre mediante ésta técnica no es posible. El objetivo es formar bloques libres lo más grandes que sea posible

Page 75: Administración de Almacenamiento

Almacenamiento inicial y reuso

Para recuperar el espacio libre en éstos casos se pueden emplear dos métodos de reuso de espacio:

1. Uso de espacio libre, buscando en la lista de localidades un bloque de tamaño adecuado y devolviendo a la lista cualquier espacio sobrante después de la reservación.

2. Compactando el espacio libre moviendo todos los elementos activos al principio de la estructura de almacenamiento y dejando el espacio libre al final de la pila.

Page 76: Administración de Almacenamiento

Reúso directo mediante el uso de lista de espacio libre

• Cuando una petición de almacenamiento de N palabras se hace, existen dos formas para llevar a cabo su almacenamiento. En un método normal se alojarían las N palabras y el resto sería enviado al espacio libre, sin embargo cuando se hace uso de una lista de espacio libre existen dos técnicas para realizar ésta operación:

Page 77: Administración de Almacenamiento

Método del primero encontrado.

• Cuando un espacio de N palabras es necesitado, la lista de espacio libre es revisada hasta que un bloque de N palabras es encontrado, en ese momento se aloja la información y el resto del espacio es regresado a la lista de espacio libre.

Page 78: Administración de Almacenamiento

Método del mejor encontrado

• Cuando un espacio de N palabras es requerido, la lista de espacio libre es revisada hasta encontrar un bloque del menor tamaño que sea mayor o igual a N palabras. Este bloque es almacenado hasta encontrar un bloque de N o el menor número encontrado mayor a N y el resto del espacio es regresado a la lista de espacio libre.

  Este último método aunque optimiza el espacio de almacenamiento tiene una desventaja, la cuál se refleja en el costo de recorrer toda la lista de espacio libre cada vez que se desea realizar un almacenamiento.

Page 79: Administración de Almacenamiento

Compactación y el problema de la fragmentación de memoria.

• Un problema con el que nos enfrentamos al emplear bloques de tamaño variable es la fragmentación de la memoria. Cuando se comienza el trabajo contamos con un gran bloque de espacio libre, sin embargo cuando continuamos trabajando, la memoria se fragmenta en pequeñas piezas generadas por el almacenamiento y borrado de elementos.

Page 80: Administración de Almacenamiento

Compactación y el problema de la fragmentación de memoria.

• Al final de este proceso se da el caso de que no podemos alojar bloques de N palabras debido a que no tenemos suficiente espacio libre en forma consecutiva. Sin embargo, puede ocurrir que al contar el espacio libre que se tiene en la lista de espacio libre, podemos comprobar que hay mas espacio libre del que requerimos. Para solucionar este problema se emplea la compactación de los bloques de memoria libres

Page 81: Administración de Almacenamiento

Compactación y el problema de la fragmentación de memoria.

Compactación parcial: Cuando los bloques activos no pueden ser movidos, solo los bloques adyacentes contenidos en la lista de espacio libre puede ser compactada.

Page 82: Administración de Almacenamiento

Compactación y el problema de la fragmentación de memoria.

Compactación total: Si los bloques activos en la estructura pueden ser movidos, todos los bloques activos son recorridos al inicio de la pila de almacenamiento, dejando el espacio libre en el bloque final. La compactación total requiere que cuando un bloque activo es movido, todos los apuntadores a ese bloque apunten ahora a la nueva localidad.