7 CONTROL DE DATOS 1 Conceptos Bsicos Alcance
7. CONTROL DE DATOS 1
Conceptos Básicos þ Alcance þ Rango de código en que está activo un nombre de objeto þ Segmento de programa en el cual todas las instancias de un identificador se refieren al mismo objeto de dato þ Extensión þ Tiempo de ejecución durante el cual una variable está ligada a su referencia þ Entorno de referencia þ Conjunto de objetos de dato activos al interior de un þ segmento de código Queda determinado por las reglas de alcance del lenguaje 2
Alcance de Datos 3
Reglas de Alcance þ Estáticas þ Permiten determinar el alcance del nombre de un þ þ objeto de dato en tiempo de compilación Las proveen lenguajes Fortran, Pascal, C, Ada, etc. Se basan en el concepto de registros de activación léxicamente anidados, es decir, þ El uso de un objeto de dato genera una búsqueda del nombre de ese objeto en el RA de la unidad en curso; si no se encuentra allí, se busca en la primera unidad que la incluya léxicamente; si no se vuelve a encontrar, se buscar en la unidad jerárquicamente superior; este proceso se puede extender hasta el programa principal 4
Reglas de Alcance þ Dinámicas þ Permiten determinar el alcance del nombre de un þ þ objeto de dato en tiempo de ejecución Las proveen lenguajes Apl, Lisp, Forth, Snobol, etc. Se basan en un orden de búsqueda LIFO, es decir, þ El uso de un objeto de dato genera una búsqueda del nombre de ese objeto en el RA de la unidad en curso; si no se encuentra allí, se busca en la unidad que la invocó; si no se vuelve a encontrar, el proceso de búsqueda continúa en sentido inverso al de las invocaciones, hasta encontrar el objeto o determinar su inexistencia 5
Reglas de Alcance Estáticas program Alcance(input, output); var b: integer; procedure Z; begin write(b); end; procedure Y; var b: integer; begin b : = 9; Z; end; begin b : = 5; Y; end. Alcance b Z Y b 6
Reglas de Alcance Dinámicas program Alcance(input, output); var b: integer; procedure Z; begin write(b) end; procedure Y; var b: integer begin b : = 9; Z end; begin b : = 5; Y; end. Alcance b Y b Z 7
Implementación de Reglas de Alcance de Estáticas 8
Modo For. Tran þ La extensión de todos los objetos de datos en un þ programa es igual a su tiempo total de ejecución Cuando se invoca una subrutina: þ Se activan los objetos locales, excepto los declarados mediante una sentencia Common þ Cuando finaliza la ejecución de una subrutina: þ Se desactivan los objetos locales (manteniendo los últimos þ valores adquiridos) Se activan todos los objetos de la unidad que la invocó 9
Modo For. Tran þ Cada subrutina posee un registro de activación que contiene: þ Objetos locales þ Parámetros þ Dirección de área Common þ Dirección de retorno 10
Modo Pascal þ En un subprograma, la extensión de los datos þ Comienza en el instante que éste se activa þ Termina cuando le devuelve el control a quien lo invocó þ Se exceptúan aquellos creados con malloc o new, los cuales sólo se pueden destruir con dispose, free o delete þ Cada subprograma posee un registro de activación que þ þ þ contiene: Objetos locales Parámetros Enlace a objetos no locales activos Dirección de retorno Enlace dinámico (implementación dinámica del stack) 11
Modo Pascal þ La referenciación de objetos no locales se consigue a þ þ través de una cadena de punteros estáticos Cada registro de activación incluye un puntero al registro de activación del primer subprograma que lo contenga léxicamente Lo anterior es independiente de las operaciones þ Push (una por cada invocación de subprograma) y þ Pop (una por cada término de ejecución de subprograma) sobre un stack de registros de activación 12
Modo Pascal program U; procedure A; procedure B; procedure C; begin A; end {C}; begin C; end {B}; procedure D; begin B; end {D}; begin D; end {A}; begin A end {U}. 13
Modo Pascal U: A: B: U A B C D C: A C B D: D A U 14
Implementación de Reglas de Alcance de Dinámicas 15
Alcance Dinámico þ El soporte de las reglas de alcance dinámicas es un þ þ stack de registros de activación La referenciación de objetos de datos no locales desencadena procesos de búsqueda determinados por el comportamiento LIFO Cada subprograma posee un registro de activación que contiene: þ Objetos locales þ Parámetros þ Dirección de retorno þ Enlace dinámico 16
Alcance Dinámico program U; procedure A; procedure B; procedure C; begin A; end {C}; begin C; end {B}; procedure D; begin B; end {D}; begin D; end {A}; begin A end {U}. 17
Alcance Dinámico U: A: D: A B: C: C B A: D A U 18
Extensión de Datos 19
Categorías de datos þ Estáticos þ Automáticos þ Dinámicos Estáticos Automáticos Dinámicos 20
Categorías de datos þ Estáticos þ Su extensión es igual a la ejecución de la totalidad del þ programa El soporte de almacenamiento es un área estática de memoria þ Automáticos þ Su extensión corresponde a la ejecución de la totalidad de la þ unidad en la cual se encuentran definidos El soporte de almacenamiento es un stack de registros de activación 21
Categorías de datos þ Dinámicos þ Su extensión la determina el programador, quien los crea y þ destruye explícitamente El soporte de almacenamiento es un bloque de memoria denominado heap þ Dependiendo de la extensión inherente a los datos, cada lenguaje utiliza una o más alternativas de soporte de almacenamiento 22
Soporte de Memoria Heap 23
Heap þ Un heap es un bloque de memoria dentro del cual se þ þ puede þ Reservar ó þ Liberar espacio Un heap está compuesto de elementos de tamaño þ Fijo ó þ Variable En un heap de tamaño k*n bytes þ k es el tamaño de un elemento (en bytes) þ n es la cantidad de elementos 24
Elementos de tamaño fijo þ El espacio disponible tiene la estructura de una lista de þ enlace simple Al solicitar espacio þ Se avanza el puntero de acceso al próximo elemento libre, y þ Se retorna un puntero al primer elemento del espacio reservado þ Los elementos que conforman una variable, pueden distribuirse, por ejemplo, del siguiente modo þ Nombre y Referencia, en un espacio fijo de memoria þ (tabla de variables) Tipo y Valor, en un espacio al interior de un heap (a partir de la referencia) 25
Elementos de tamaño fijo þ La devolución de elementos en desuso a la lista de þ þ espacio disponible es un proceso simple La identificación de esos elementos como tales es un proceso de complejo Existen tres formas de solución a este problema: þ Devolución Explícita þ Cuenta Referencias þ Garbage Collection 26
Devolución Explícita þ Mecanismo que permite al programador identificar y þ devolver los elementos en desuso Presenta dos inconvenientes: þ Dangling Reference þ Garbage 27
Dangling Reference þ Puntero a un elemento que ha sido devuelto a la lista þ de espacio disponible Conceptualmente, en C: int *p, *q; p = malloc(sizeof(int)); *p = 6; q = p; free(p); 28
Dangling Reference int *p, *q; p: q: p: 100 ? q: ? ? *p ? q = p; p: 100 q: 100 *p=6; p= malloc(sizeof(int)); p: 100 q: 6 *p ? free(p); 6 *p p: ? q: 100 q es Dangling Reference 29
Garbage þ Elemento en condición de reutilizarse, pero inaccesible þ þ por NO devolverse a la lista de espacio disponible Dangling Reference es, potencialmente, más peligroso que garbage Conceptualmente, en C: int *p, *q; p = malloc(sizeof(int)); q = malloc(sizeof(int)); *p = 6; *q = 7; p = q; 30
Garbage int *p, *q; p: q: ? ? p = malloc(sizeof(int)); q = malloc(sizeof(int)); p: 100 ? q: 300 *p = 6; *q = 7; p: 100 6 q: 300 7 ? p = q; p: 300 6 q: 300 7 Los bytes 100 y 101 constituyen Garbage 31
Cuenta Referencias þ Técnica que incluye, al interior del espacio para cada þ variable en el heap, un contador de las referencias que lo apuntan Al solicitar memoria: þ El contador se inicializa en 1 þ Cada vez que se le asocia una nueva variable, el contador se incrementa en 1 þ Al devolver memoria: þ El contador se decrementa en 1 þ Si el contador toma el valor 0, el espacio en cuestión se devuelve a la lista de espacio disponible 32
Garbage Collection þ Técnica aplicada cuando la lista del espacio disponible þ se agota y se requiere más memoria Opera suspendiendo temporalmente la ejecución del proceso solicitante, para þ Marcar los elementos en uso, y þ Recolectar los elementos en desuso (devolverlos a la lista de espacio disponible) 33
Elementos de tamaño variable þ Inicialmente, el heap es un bloque disponible único y, þ solicitar un bloque de m bytes implica: þ Avanzar m posiciones al puntero de acceso þ Retornar la dirección a la cual apuntaba el puntero de acceso Debido a la variabilidad en el tamaño de los bloques, el problema de reutilización de espacio se resuelve: þ Buscando en la lista el espacio disponible, reservando un þ bloque del tamaño adecuado y devolviendo, si existe, el espacio sobrante de la lista Generando un único bloque de espacio disponible mediante el desplazamiento de todos los elementos en uso hacia un extremo del heap (compactación) 34
- Slides: 34