La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Administración de Almacenamiento

Presentaciones similares


Presentación del tema: "Administración de Almacenamiento"— Transcripción de la presentación:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

23 Tipos de Administración del Alamacenamiento
Estático. Asignación que permanece fija durante toda la ejecución. Dinámico Stack Heap Elementos de Tamaño fijo Elementos de Tamaño Variable

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

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

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

27 Manejo de almacenamiento basado en el stack.
Organización de la memoria en Pascal en tiempo de ejecución

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

29 Manejo de almacenamiento basado en el stack
Organización de la memoria en LISP durante la ejecución

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

31 Recordar siempre desalojar la memoria asignada con NEW !!!
Uses Dos, Crt; Type PMyArray = ^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; ClrScr; 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 !!!

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

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

34 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)

35 ML El programador puede definir dinámicamente un nuevo tipo de datos.
Se activan los mecanismos necesarios Compiler.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

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

37 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

38 Almacenamiento por Heap
Hay que gestionar el almacenamiento dinámico de: Elementos de Tamaño fijo Elementos de Tamaño variable

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

40 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

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

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

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

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

45 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 */

46 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 */

47 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

48 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

49 Función cdr de LISP

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

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

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

53 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

54 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

55 Función cdr en LISP Liberar * si la cuenta de referencia es 0

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

57 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;

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

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

60 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)

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

62 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

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

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

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

66 Recolección de basura Para realizar este proceso de marcado se asumen las siguientes características: Ningún elemento activo deberá ser alcanzado desde fuera de la estructura por un cambio de apuntadores. Deberá ser posible localizar cualquier apuntador externo que apunte hacia algún elemento de nuestra estructura. Debe ser posible identificar cuando un elemento dentro de la estructura no tiene apuntadores procedentes de otro elemento dentro de la misma.

67 LISP

68 Esta figura será explicada en los acetatos siguientes
Asignación de Almacenamiento en LISP Esta figura será explicada en los acetatos siguientes

69 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)

70 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))

71 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)

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

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

74 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

75 Almacenamiento inicial y reuso
Para recuperar el espacio libre en éstos casos se pueden emplear dos métodos de reuso de espacio: 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. 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.

76 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:

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

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

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

80 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

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

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


Descargar ppt "Administración de Almacenamiento"

Presentaciones similares


Anuncios Google