Bienvenidos sean a este post, hoy veremos otra forma de memoria.
Hasta ahora hemos tenido todo nuestro contenido para subir memoria de una forma «controlada» pero esto no sera siempre asi, dado que no siempre podemos direccionar correctamente la memoria mediante la forma automatica o estatica, tal como vimos en los posts anteriores, esto es asi porque los objetos pueden variar en el momento de ejecucion de nuestro programa, este y otros problemas pueden estar relacionados con:
- Algoritmos de orden
- Busqueda eficiente
- Busqueda de grandes cantidades de datos
- Tecnicas de optimizacion de teorias graficas y geometricas
Si bien todos estos son topicos de programacion avanzada, el uso de memoria dinamica nos permite poder trabajar con ellos, pero repasemos como ubica C los elementos en memoria.
Si bien en algunos posts anteriores hemos hablado sobre esto veamos el siguiente diagrama para resumirlo de una mejor manera:

Si bien esta es una imagen muy simplificada sobre como trabajamos con la memoria es lo mas exacto, el sistema operativvo provee al lenguaje sus respectivo espacio en memoria, el cual a su vez esta divido en varios segmentos para sus determinados usos, veamos en detalle cada uno de ellos.
Memoria del sistema
En esta contendra no solo la memoria del sistema sino tambien de los programas del sistema, asi como tambien las direcciones de los dispositivos del ordenador, este segmento es para el mapeo de todos los programas que esten corriendo haciendo que haya solo una copia del codigo del sistema en todo este bloque, este bloque es administrado exclusivamente por el sistema.
Codigo del programa
Aqui es donde el programa compilado es cargado y ejecutado
Memoria global y estatica
Despues que se cargo el programa las variables globales y estaticas son ubicadas e iniciadas en este segmento.
Stack
Cuando un llamado a una funcion es realizado sus parametros (es decir cualquiera de las variables automaticas declaradas en ella) y el valor que devuelve son ingresado en este segmento llamado stack, este se va cargando desde la parte mas alta de la memoria a la parte mas baja para luego pasar al segmento llamado heap, todo esto mientras una funcion llama a otra funcion y asi sucesivamente, ahora cuando una funcion devuelve un valor hace que sea removido del stack.
Heap
Cuando el programa ubica la memoria dinamica lo hace en este segmento, haciendo que se llene de forma inversa al anterior, es decir desde la memoria mas baja a la superior, la forma de ubicar en este segmento es mayoritariamente al azar y ajustandose al mejor esquema de ubicacion, en lo posible se ubican en los espacio de memoria mas bajos, una vez que se removio nos permite reubicar otros datos del mismo o menor tamaño.
Con esto podemos resumir que cada programa vive en su propio espacio de memoria, el espacio de sistema es comun para todos, una vez ubicado el codigo compilado y las variables globales y/o estaticas en memoria recien el sistema procede a ejecutar el main, cuando llamamos a una funcion este salta a la direccion de memoria de la misma, mandando todas sus parametros, variables automaticas y valores de retorno al stack, cuando la funcion finaliza la remueve fuera de stack y devuelve la ejecucion a la ubicacion del espacio del programa desde donde fue llamado, en cambio las dinamicas se realizaran en el heap pero en el proximo post veremos como se hace todo esto.
En resumen, hoy hemos visto de forma mas resumida como trabaja el programa en memoria, un simple esquema donde podemos ver todo lo que haciamos anteriormente con nuestros programas pero no sabiamos que sucedia, tambien hemos visto muy superficialmente la memoria dinamica, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
