Preguntas
Preguntas
Preguntas
ALTIPLANO PUNO”
INGENIERÍA MECÁNICA ELÉCTRICA, ELECTRÓNICA Y
SISTEMAS
CARRERA PROFESIONAL DE INGENIERÍA DE
SISTEMAS
CURSO: INTEGRANTES:
COMPILADORES JOSE CARLOS MAMANI
ARIZAPANA
TEMA:
ALDO ROMARIO LEZAMA
“ENTORNOS EN TIEMPO DE PHOCCO
EJECUCIÓN.” ADELAIDA ROCIO CAHUANA
DOCENTE: VILCA
LAURA MARITZA ARI
ING. PABLO CESAR TAPIA FLORES
2.2.Árboles de activación
Para llamadas a los procedimientos, o las activaciones de los procedimientos, que se anidaran
en el tiempo. Ejemplo
2.3. Registros de activación
Cada activación en vivo tiene un registro de activación (algunas veces se le conoce como m
arco) en la pila de control, con la raíz del árbol de activación en la parte inferior, y toda la
secuencia de registros de activación en la pila que corresponde a la ruta en el árbol de
activación que va hacia la activación en la que reside el control en ese momento.
Observe que cuando un procedimiento es recursivo, e s común tener al mismo tiempo varios
de sus registros de activación en la pila.
las variables se definen ya sea dentro de una sola función o fuera de cualquier función (
“globalmente”). Lo más importante es que es imposible declarar un procedimiento cuyo
alcance esté por completo dentro de otro procedimiento. Las variables que se declaran dentro
de una función tienen un alcance que consiste sólo en esa función, o parte de ella, si la función
tiene bloques anidados.
Para los lenguajes que no permiten declaraciones de procedimientos, se asigna lo siguiente:
1. A las variables globales se les asigna un almacenamiento estático.
Las ubicaciones de estas variables permanecen fijas y son conocidas en tiempo de
compilación.
2. Cualquier otro nombre debe ser local para la activación en la parte superior de la pila.
la asignación estática para las variables globales es que los procedimientos declarados se
pueden pasar como parámetros o pueden devolverse como resultados (en C , se pasa un
apuntador a la función).sin cambios considerables en la estrategia de acceso a los datos.
El acceso se complica aún más cuando un lenguaje permite anidar las declaraciones de los
procedimientos y también utiliza la regla de alcance estático normal;
cada definición consiste en todas las siguientes definiciones hasta in , y de todas las
instrucciones hasta end. las definiciones de las funciones pueden anidarse.
Por ejemplo,el cuerpo de una función p puede contener una instrucción let que incluya la
definición de otra función q (anidada).De manera similar, q puede tener definiciones de
funciones dentro de su propio cuerpo, lo cual conduce al anidamiento profundo arbitrario de
las funciones.
De hecho, como p o q (o ambas) pueden ser recursivas, puede haber varios registros de
activación de p y q en la pila. Encontrar la declaración que se aplique a un nombre no local
a; en un procedimiento anidado p es una decisión estática.
3.4.Profundidad de anidamiento:
Vamos a dar la profundidad de anidamiento 1 a los procedimientos que no estén anidados
dentro de otro procedimiento.
Por ejemplo, todas las funciones en C se encuentran en la profundidad de anidamiento 1. No
obstante, si un procedimiento p se define de inmediato dentro de un procedimiento en el nivel
de anidamiento i, entonces damos a p la profundidad de anidamiento i + 1.
3.5.Enlace de acceso:
Podemos obtener una implementación directa de la regla de alcance estático normal para
funciones anidadas si agregamos un apuntador, conocido como el enlace de acceso, a cada
registro de activación. Si el procedimiento p está inmediatamente anidado dentro del
procedimiento q en el código fuente, entonces el enlace de acceso en cualquier activación de
p apunta a la activación más reciente de q.
Observe que la profundidad de anidamiento de q debe ser exactamente una menos que la
profundidad de anidamiento de p. Los enlaces de acceso forman una cadena desde el registro
de activación en la parte superior de la pila, hasta una secuencia de activaciones a
profundidades de anidamiento cada vez menores. A lo largo de esta cadena se encuentran
todas las activaciones cuyos datos y procedimientos son accesibles para el procedimiento
actual en ejecución.
• los programas contienen muchas instrucciones que nunca se ejecutan. Los programas
creados con componentes y bibliotecas sólo utilizan una pequeña fracción de la funcionalidad
que se provee.
• En realidad, sólo una pequeña fracción del código que podría invocarse es la que se
ejecuta durante el funcionamiento normal del programa.
• El programa ordinario invierte la mayoría de su tiempo ejecutando los ciclos más
internos y los ciclos con uso intenso de la recursividad. La localidad nos permite sacar
provecho de la jerarquía de memoria de una computadora moderna.
• los patrones de acceso a los datos muestran en general una mayor discrepancia que
los patrones de acceso a las instrucciones. Las políticas como mantener los datos que hayan
tenido un uso más reciente en la jerarquía más veloz funcionan bien para los programas
comunes.
4.4.Reducción de la fragmentación:
el montículo es una unidad contigua de espacio libre. el programa asigna y desasigna
memoria, este espacio se divide en trozos de memoria libres y usados, y los trozos libres no
tienen que residir en un área contigua del montículo. cada solicitud de asignación, el
administrador de memoria debe colocar el trozo de memoria solicitado en un hueco que sea
lo bastante grande.
Con cada solicitud de desasignación, los trozos liberados de memoria se agregan de vuelta a
la reserva de espacio libre.
• Colocación de objetos en base al mejor ajuste y al siguiente ajuste:
Para reducir la fragmentación, debemos controlar la forma en que el administrador de
memoria coloca objetos nuevos en el montículo. para disminuir al mínimo la fragmentación
en los programas reales es asignar la memoria solicitada en el hueco más pequeño disponible,
que sea lo suficientemente grande.
Este algoritmo del mejor ajuste tiende a dejar los agujeros grandes para satisfacer las
solicitudes siguientes más grandes. un objeto se coloca en el primer agujero (dirección más
baja) en el que pueda ajustarse, requiere menos tiempo para colocar los objetos, pero ha
resultado ser inferior al mejor ajuste en cuanto al rendimiento general.
Para implementar la colocación en base al mejor ajuste con más eficiencia, podemos separar
el espacio libre en contenedores, de acuerdo con sus tamaños. los trozos en límites de 8 bytes
Para los tamaños que no tienen un contenedor privado, buscamos el que tenga permitido
incluir trozos del tamaño deseado. Dentro de ese contenedor, podemos usar la estrategia del
primer ajuste o la del mejor ajuste;
• primer trozo que sea lo suficiente grande.
• invertimos más tiempo y buscamos el trozo más pequeño que sea lo suficiente
grande.
En un momento dado, o encontramos un trozo que podamos usar, o llegamos al trozo
“wildemess”, a partir del cual podemos obtener con seguridad el espacio necesario, tal vez
yendo al sistema operativo, para obtener páginas adicionales para el montículo.
• Administración y coalescencia del espacio libre
el administrador de memoria debe liberar su trozo, para que pueda asignarse de nuevo. Es
posible combinar (coalescencia) ese trozo con trozos adyacentes del montículo, para formar
un trozo más grande.
o Etiquetas delimitadoras. En los extremos superior e inferior de cada trozo, ya sea que
esté libre o asignado, mantenemos información vital. En ambos extremos, tenemos un bit
libre/usado que indica si el bloque se encuentra asignado (usado) o disponible (libre).
o Una lista Ubre incrustada, doblemente enlazada. Los trozos libres (pero no los
asignados) también se enlazan en una lista doblemente enlazada. Los apuntadores para esta
lista se encuentran dentro de los mismos bloques, por decir adyacentes a las marcas
delimitadoras en cada extremo.
5.
6.
• En vez de recordar la dirección ex acta o el objeto y campo que se escribe, podemos recordar
sólo los objetos que contienen los campos en los que se escribió.
• Podemos dividir el espacio de direcciones en bloques de tamaño fijo, conocidos como
tarjetas, y utilizar un arreglo de bits para recordar las tarjetas en las que se ha escrito.
• Podemos optar por recordar las páginas que contienen las ubicaciones en las que se escribió.
Podemos simplemente proteger las páginas que contienen objetos Explorado. Así, cualquier
escritura en objetos Explorado se detectará sin ejecutar ninguna instrucción ex lícita, debido
a que producirán una violación a la protección, y el sistema operativo generará una excepción
en el programa. E n general, entre menos refinados sean los detalles con los que recordemos
las ubicaciones escritas, se requerirá menos espacio, a expensas de incrementar la cantidad
de reexploraciones realizadas. En el primer esquema, todas las referencias en los objetos
modificados tendrán que volverse a explorar, sin importar qué referencia se haya modificado
en realidad. En los últimos dos esquemas, todos los objetos alcanzables en las tarjetas o en
las páginas modificadas deben volverse a explorar al final del proceso de rastreo.
Combinación de las técnicas incremental y de copiado. Los métodos anteriores son
suficientes para la recolección de basura marcar y limpiar. La recolección de copia es un
poco más complicada, debido a su interacción con e l mutador. Los objetos en los estad os
Explorado o SinExplorar tienen dos direcciones, una en el semiespacio Desde y otra en el
semiespacio Hacia. A l igual que en el Algoritmo 7.16, debemos mantener una asignación de
las direcciones anteriores de un objeto, a su dirección reubicada. H ay dos opciones en la
forma en que podemos actualizar las referencias. En primer lugar, podemos hacer que el
mutador realice todas las modificaciones en e l espacio Desde, y sólo al final de la recolección
de basura actualizamos todos los apuntadores y copiamos todo el contenido hacia el espacio
Hacia. En segundo lugar, podemos realizar modificaciones a la representación en e l espacio
Hacia. Cada vez que el mutador desreferencie un apuntador al espacio Desde, este apuntador
se traducirá a una nueva ubicación en el espacio Hacia, si es que hay uno. A l final, todos los
apuntadores deberán traducirse para que apunten al espacio Hacia.
una lista “recordados” de todos los apuntadores que provienen del exterior del vagón. Aquí
identificamos a los objetos sin referencias, así como los ciclos de basura que están contenidos
por completo dentro de este vagón. Los objetos alcanzables en e l vagón siempre se mueven
hacia algún otro vagón, de manera que cada vagón en el que se haya recolectado la basura se
queda vacío y puede eliminarse del tren. • Algunas veces, el primer tren no tiene referencias
externas. Es decir, no hay apuntadores desde el conjunto raíz hacia ningún vagón del tren, y
los conjuntos recordados para los vagones sólo contienen referencias provenientes de otros
vagones en el tren, no de otros trenes. En esta situación, el tren es una enorme colección de
basura cíclica, y eliminamos el tren completo.