miércoles, 15 de febrero de 2017

MEMORIA ESTÁTICA Y MEMORIA DINÁMICA

Memoria Estática


Es la memoria que se reserva en el momento de la compilación antes de comenzar a ejecutar el programa. Los objetos son creados al iniciar el programa y destruidos al finalizar el mismo. Mantienen la misma localización en memoria durante todo el transcurso del programa hasta que son destruidos 
Los objetos administrados de este modo son: variables globales, variables estáticas de funciones, miembros static de clases y literales de cualquier tipo. 



Características: 

Su principal característica es que ocupan solo una casilla de memoria, por lo tanto una variable simple hace referencia a un único valor a la vez, dentro de este grupo de datos se encuentra: enteros, reales, caracteres, booleanos, enumerados y subrangos (los últimos no existen en algunos lenguajes de programación) 
El inconveniente de la reserva estática es que la cantidad de memoria se reserva siempre antes de conocer los datos concretos del problema. 
Tampoco se adapta bien a la memoria real disponible del ordenador en que se esta ejecutando el programa. 




Las estructuras de datos estáticas: 

Son aquellas en las que el tamaño ocupado en memoria se define antes de que el programa se ejecute y no puede modificarse dicho tamaño durante la ejecución del programa. 
La forma más fácil de almacenar el contenido de una variable en memoria en tiempo de ejecución es en memoria estática o permanente a lo largo de toda la ejecución del programa. No todos los objetos (variables) pueden ser almacenados estáticamente. Para que un objeto pueda ser almacenado en memoria estática su tamaño (número de bytes necesarios para su almacenamiento) ha de ser conocido en tiempo de compilación. Como consecuencia de esta condición no podrán almacenarse en memoria estática: 

Los objetos correspondientes a procedimientos o funciones recursivas, ya que en tiempo de compilación no se sabe el número de variables que serán necesarias. 
Las estructuras dinámicas de datos tales como listas, árboles, etc. ya que el número de elementos que las forman no es conocido hasta que el programa se ejecuta. 


Ejemplo en C#


using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace _1._2 

public class ejemploestatica 
{//Declaracion de un arreglo static string con datos predefinidos, la memoria designada al arreglo esta presente desde el inicio del programa hasta el cuando se libera static String[] instruccion = new String[] { "nPais: estados unidosncapital: Washington DC ", "nPais: Estados unidos Mexicanosncapital: Mexico DF", "nPais: Alemaniancapital: Berlin" }; 
public static void imp (int a){ //metodo estatico en donde se realiza la impresion de un bloque del arreglo el que elija el usuario 
try //inicio del bloque try que capturar el error cuando el usuario elija una opcion que exceda al arreglo 

Console.Clear(); 
Console.Write("Datos Pais: {0}", instruccion[a-1]); 

catch (Exception e)//en el catch el exception esta bien, pero con ella se pueden usar los metodos de su clase para desplegar datos del error 
{ } 



public static void Main() 


int s; 
//menu do 

Console.Clear(); 
Console.Write("Menu Paisesn1.-EUAn2.-Mexicon3.-Alemanian4.-Salir"
Console.Write("nIngrese opcion: "
s = int.Parse(Console.ReadLine()); 

imp(s); //llamada al menu como es estatico no se tiene que crear objeto se envia la variable "s" como parametro para que el metodo elija el bloque del arreglo 
Console.ReadKey(); 

} while (s != 4); 
Console.ReadKey(); 


}


Aquí se despliega el menú.


Aquí se ven los datos que contiene el arreglo.




Memoria Dinámica

La reserva de memoria dinámica se hace en tiempo de ejecución después de leer los datos y de conocer el tamaño exacto del problema. Como consecuencia se adapta mucho mejor a las necesidades en cada caso.

El sitio donde se almacenan los objetos se denominan en ingles heap o free store traducido como montículo o memoria libre, y el sitio preciso donde se encuentre depende del compilador y el tipo de puntero utilizado. La creación y destrucción de los objetos esta en manos del programador a través de los operadores new y delete.





VENTAJAS:
ü  Es posible disponer de un espacio de memoria arbitrario que dependa de información dinámica (disponible sólo en ejecución): Toda esa memoria que maneja es implementada por el programador cuando fuese necesario.
ü  Otra ventaja de la memoria dinámica es que se puede ir incrementando durante la ejecución del programa. Esto permite, por ejemplo, trabajar con arreglos dinámicos.
ü  Es memoria que se reserva en tiempo de ejecución. Su tamaño puede variar durante la ejecución del programa y puede ser liberado mediante la función free.





Ejemplo en C#

Programa en Estructura de datos C# que utiliza manejo de memoria dinámica
Código Fuente
using System; 
using System.Collections.Generic; 
using System.Text; 
class Program 
{ 
void imprime_binario(int n) 
{ 
if (n >= 2) 
{ 
imprime_binario(n / 2); 
Console.Write("{0 % 2); 
} 
else 
{ 
Console.Write("{0); 
} 
} 
static void Main(string[] args) 
{ 
Console.Write("Introduzcaumero Entero: "); 
int numero = Int32.Parse(Console.ReadLine()); 

Program p = new Program(); 

Console.Write("\nNumeroro: {0}, en Codigo Binario: ", numero); 
p.imprime_binario(numero); 

Console.ReadLine(); 
} 
}

Programacion en C, memoria dinamica 



miércoles, 8 de febrero de 2017

MEMORIA DINAMICA

La memoria dinámica se refiere a aquella memoria que no puede ser definida ya que no se conoce o no se tiene idea del número de la variable a considerarse, la solución a este problema es la memoria dinámica que permite solicitar memoria en tiempo de ejecución, por lo que cuanta más memoria se necesite, más se solicita al sistema operativo. El sistema operativo maneja la memoria gracias al uso de punteros, por la misma naturaleza del proceso nos impide conocer el tamaño de la memoria necesaria en el momento de compilar.


Este tipo de datos se crean y se destruyen mientras se ejecuta el programa y por lo tanto la estructura de datos se va dimensionando de forma precisa a los requerimientos del programa, evitándonos así perder datos o desperdiciar memoria si hubiéramos tratado de definir la cantidad de memoria a utilizar en el momento de compilar el programa.


Características de la memoria dinámica




    

1. Va solicitando más memoria al sistema operativo para guardarlas.


2. El medio para manejar la memoria que otorga el sistema operativo, es el puntero.


3. Este tipo de datos se crean y se destruyen mientras se ejecuta el programa y por lo tanto la estructura de datos se va dimensionando de forma precisa a los requerimientos del programa.


4. Cuando se crea un programa en el que es necesario manejar memoria dinámica el sistema operativo divide el programa en cuatro partes que son: texto, datos (estáticos), pila y una zona libre o heap.


5. En el momento de la ejecución habrá tanto partes libres como partes asignadas al proceso por lo cual si no se liberan las partes utilizadas de la memoria y que han quedado inservibles es posible que se “agote” esta parte y por lo tanto la fuente de la memoria dinámica.




Ventajas y desventajas de la memoria dinámica

Ventajas:


1- La memoria reservada de forma dinámica suele estar alojada en el heap o almacenamiento libre.


2- El heap en principio podría estar limitado por la cantidad de memoria disponible durante la ejecución del programa y el máximo de memoria que el sistema operativo permita direccionar a un proceso.


3- La pila puede crecer de forma dinámica, pero esto depende del sistema operativo. En cualquier caso, lo único que se puede asumir es que muy probablemente dispondremos de menor espacio en la pila que en el heap.


4- Otra ventaja de la memoria dinámica es que se puede ir incrementando durante la ejecución del programa.



Desventajas:

1- Una desventaja de la memoria dinámica es que es más difícil de manejar.


2- La memoria dinámica se reserva de forma explícita y continúa existiendo hasta que sea liberada, generalmente por parte del programador.


3- La memoria dinámica puede afectar el rendimiento.


4- Cuando se reserva memoria de manera dinámica, se tienen que llevar a cabo varias tareas, como buscar un bloque de memoria libre y almacenar la posición y tamaño de la memoria asignada, de manera que pueda ser liberada más adelante. Todo esto representa una carga adicional, aunque esto depende de la implementación y hay técnicas para reducir  
su impacto.



Comparación entre memoria estática y dinámica

Datos estáticos: su tamaño y forma es constante durante la ejecución de un programa y por tanto se determinan en tiempo de compilación. El ejemplo típico son los arrays. Tienen el problema de que hay que dimensionar la estructura de antemano, lo que puede conllevar desperdicio o falta de memoria.

Datos dinámicos: su tamaño y forma es variable (o puede serlo) a lo largo de un programa, por lo que se crean y destruyen en tiempo de ejecución. Esto permite dimensionar la estructura de datos de una forma precisa: se va asignando memoria en tiempo de ejecución según se va necesitando.