Unidad 2 Manejo de memoria

Download Report

Transcript Unidad 2 Manejo de memoria

2. Manejo de memoria
1. Manejo de memoria estática
2. Manejo de memoria dinámica
Introducción
• La administración de memoria de una
computadora es una tarea fundamental debido a
que la cantidad de memoria es limitada.
• El sistema operativo es el encargado de
administrar la memoria del sistema y compartirla
entre distintos usuarios y/o aplicaciones.
• El RTS (Run Time System) de un lenguaje de
programación administra la memoria para cada
programa en ejecución.
• La ejecución de un programa requiere que
diversos elementos se almacenen en la
memoria:
– Código del programa (instrucciones)
– Datos
• Permanentes
• Temporales
– Direcciones para controlar de flujo del
ejecución del programa
Asignación de
Memoria Estática y Dinámica
• A la asignación de memoria para algunos
elementos fijos del programa que es controlada
por el compilador se le llama asignación de
memoria estática.
• A la asignación y posible recuperación de
memoria durante la ejecución de un programa y
bajo su control, se le llama asignación de
memoria dinámica.
Memoria Estática
• Define la cantidad de memoria necesaria para un
programa durante el tiempo de compilación.
• El tamaño no puede cambiar durante el tiempo de
ejecución del programa.
• Algunos lenguajes de programación utilizan la
palabra static para especificar elementos del
programa que deben almacenarse en memoria
estática.
Memoria Estática
• Elementos que residen en memoria estática:
– Código del programa
– Las variables definidas en la sección principal del
programa, las cuales pueden solo cambiar su contenido
no su tamaño.
– Todas aquellas variables declaradas como estáticas en
otras clases o módulos.
• Estos elementos se almacenan en direcciones fijas
que son relocalizadas dependiendo de la dirección
en donde el cargador las coloque para su
ejecución.
Método común de asignación de
memoria
Mapa de memoria
Memoria disponible
Para el programa
Variables estáticas
Código del programa
Dirección alta
Dirección baja
El stack de ejecución
• Cada subprograma (procedimiento, función,
método, etc.) requiere una representación
de si en tiempo de ejecución.
• Estas representaciones se almacenan en el
stack de ejecución con el fin de controlar el
flujo de ejecución del programa.
Ejemplo
….
public static int factorial (int n){
if (n==0) return 1;
else return n*factorial(n-1);
}
public static void main (String[] a){
int a=5;
System.out.println(factorial(a));
}
Cuales elementos del
programa serán
colocados en memoria
estática?
Que elementos se
almacenaran en el
stack en tiempo de
ejecución?
• Es siempre posible, cuando se diseña un
programa, conocer la cantidad de memoria
necesaria para que este se ejecute
correctamente?
Memoria Dinámica
• Define el tamaño del espacio de memoria
necesario para un programa en tiempo de
ejecución.
• El tamaño de los elementos puede
cambiar durante la ejecución del programa.
• Almacena todos los elementos definidos
con la palabra new en un programa.
Memoria Dinámica
• Las variables dinámicas son aquellas que crecen
de tamaño o se reducen durante la ejecución de un
programa.
• Estas se almacenan en un espacio de memoria
llamado heap.
• El heap se localiza en la región de memoria que
esta encima del stack.
• Algunos lenguajes de programación permiten que
el programador asigne y desasigne manualmente
la memoria. Java utiliza un recolector de basura.
Uso del heap
• Para usar el heap un programa requiere:
– Una o mas variables que refieran el lugar donde
se encuentran las variables dinámicas.
– Un método para obtener memoria (new)
– Una forma de asignar la dirección de memoria a
alguna variable (identificador)
– Una forma para referirse a la variable dinámica
Ejemplo
public class Punto {
private int x=0;
private int y=0;
public static int totalPuntos =0;
Punto (int _x, int _y){
x=_x;
y=_y;
totalPuntos++;
}
public void setx(int _x){
x= _x;
}
public String toString (){
return “(”+x+”,”+y+”)”;
}
}
punto1
Miembros de
instancia
Metodos de
instancia
public class UsaPunto {
public static void main(String[] args){
Punto punto1= new Punto(2,1);
Punto punto2 = new Punto(5,5);
Punto punto3 = punto1;
Punto[] puntos = {punto1,punto2};
System.out.println(Arrays.toString(puntos));
System.out.println(“Puntos creados “+ Punto.totalPuntos);
}
}
punto3
x=2
y=1
void setx(int _x)
String toString ()
punto2
x=5
y=5
void setx(int _x)
String toString ()
Punto
Miembros
de clase
totalPuntos = 0
Liberación de memoria
• La memoria estática se libera cuando el programa
finaliza su ejecución.
• La memoria dinámica se libera de dos formas:
– Explicita. El programador decide cuando un elemento
debe ser eliminado de la memoria. El LP provee
mecanismos para liberación de memoria.
– Implícita. El sistema decide que elementos deben ser
eliminados para recuperar el espacio de memoria que
ocupan. El sistema cuenta con un “recolector de
basura”.
The Garbage Collector
• Algunos lenguajes de programación requieren que el programador
mantenga la información de todos los objetos creados en un
programa para que estos puedan ser destruidos cuando ya no son
requeridos en la ejecución.
• Este método para manejar la memoria puede resultar tedioso y
propicio a errores.
• Java permite la creación de tantos objetos como sean necesarios sin
tener que destriurlos explícitamente cuando ya no son requeridos.
• El medio ambiente de ejecución de Java cuenta con un mecanismo
llamado recolector de basura (garbage collector) que se encarga de
eliminar los objetos cuando ya no existen referencias a ellos.
• El recolector de basura, de manera automática, se ejecuta
periódicamente durante la ejecución de un programa.
Ejemplo
Como almacenar
Cadenas de Caracteres?
Cadenas de Caracteres
Se utilizan secuencias de bits para representar letras y otros símbolos.
Alfabéticos
Caracteres
Dígitos
Caracteres Especiales
Caracteres de Control…
El numero de caracteres que se pueden representar depende de el
numero de bits con que se represnta cada carácter.
Ejemplo Con 8 bits se pueden representar 256 Caracteres diferentes,
donde cada elemento ocupa una secuencia de 8 bits.
Una cadena de caracteres esta representada por la
concatenación de las hileras de bits que representan los
caracteres individuales.
Una cadena de caracteres es una secuencia finita de 0 o
más caracteres.
La longitud de la cadena de caracteres es el número de
caracteres que contiene.
– Cadena Vacía o Nula.- Cero caracteres.
Delimitadores: Comúnmente se usan “” o ‘’ dependiendo
del lenguaje de programación.
Ejemplos:
S1=“INSTITUTO”
longitud = 9
S2=“TECNOLOGICO DE CULIACAN”
longitud = 23
Concatenación = Es la operación de unir 2 cadenas
para formar una sola.
Ejemplo:
S3 = S1 + “ ” + S2
S3=“INSTITUTO TECNOLOGICO DE CULIACAN”
Longitud de S3 = 33
Subcadenas = Se dice que y es subcadena de S si
existe:
S=X+Y+Z
Donde:
X y/o Z pueden ser cadenas vacías:
Si X es cadena vacía entonces Y es subcadena Inicial
Si Z es cadena vacía entonces Y es subcadena final
Ejemplo:
S = “Estrutura de Datos”
“de” es subcadena de S
“Est” es subcadena inicial de S
“Datos” es subcadena final de S
ALMACENAMIENTO DE CADENAS
Estructura de longitud fija:
En este formato cada cadena tiene un registro de longitud
fija (generalmente 80 caracteres).
Estructura de longitud variable con un máximo
fijo:
Son cadenas de caracteres que contienen un máximo
definido, pero su longitud puede variar y se usa un
delimitador especial al final o la longitud actual como
parte de la cadena.
Estructuras Enlazadas:
Cada cadena es almacenada en un nodo que contiene un
enlace a la siguiente cadena.
Ejemplo Almacenar un programa (Texto)
C PROGRAM PRINTING TWO INTEGERS IN INCREASING ORDER
READ *, J , K
IF ( J.LE.K) THEN
PRINT *,J,K
ELSE
PRINT *,K,J
ENDIF
STOP
END
En estructuras de longitud fija:
200
210
250
PROGRAM PRINTING ….
C
280
READ
360
290
* , J , K
370
I F(J.LE.K) THEN
440
……………
300
……
380
……
En estructuras de longitud variable con un
máximo fijo:
*usando delimitador: $$
1
2
3
C
PROGRAM PRINTING TWO IN… $$
READ *, J , K $$
IF (J.LE.K) THEN $$
4
5
………………
END $$
En estructuras de longitud variable con un
máximo fijo:
*usando longitud actual
55
18
21
C
PROGRAM … ORDER
READ *, J , K
IF (J.LE.K) THEN
………………
4
END
En estructuras Enlazadas:
Cadena
Inicio
C
PROGRAM …..
READ *, J , K
IF (J.LE.K) THEN
……
END
Liga