Gestión De La Memoria
Enviado por hemolas • 1 de Noviembre de 2013 • 1.171 Palabras (5 Páginas) • 357 Visitas
Gestión de la memoria
Conceptos básicos
Espacio de direccionamiento de un proceso
A todo proceso se le asocia un espacio de direccionamiento que representa las zonas de memoria asignadas al proceso. Este espacio de direccionamiento incluye:
• el código del proceso;
• los datos del proceso, que se descompone en dos segmentos, por una parte data, que contiene las variables inicializadas, y por otra parte bss que contiene las variables no inicializadas;
• el código y los datos de las bibliotecas compartidas por el proceso;
• la pila utilizada por el proceso.
En la arquitectura x86, Linux asigna tres gigabytes a este espacio de direccionamiento. El gigabyte restante se reserva para la memoria utilizada por el núcleo (el propio código de Linux así como los datos que manipula).
Los tres gigabytes disponibles se descomponen en regiones de memoria utilizables por el proceso.
El programa MuestraDirecciones.c muestra la dirección de diversas variables y funciones.
#include <stdio.h>
#include <stdlib.h>
int i; /* variable no inicializada (segmento BSS) */
int j=2; /* variable inicializada (segmento DATA) */
extern int _end;
extern int _etext; /* Fin del segmento de código */
extern int _data; /* Fin del segmento de datos */
extern int __bss_start; /* Inicio del segmento BSS */
extern char **entorno; /* puntero al entorno */
void main (int argc, char *argv[])
{
int k;
printf (“Dirección de la función main = %091x\n”, main);
printf (“Dirección del símbolo _etext = %091x\n”, &_etext);
printf (“Dirección de la variable j = %091x\n”, &j);
printf (“Dirección del símbolo _edata = %091x\n”, &_edata);
printf (“Dirección del símbolo __bss_start = %091x\n”,
&__bss_start);
printf (“Dirección de la variable i = %091x\n”, &i);
printf (“Dirección del símbolo _end = %091x\n”, &_end);
printf (“Dirección de la variable k = %091x\n”, &k);
printf (“Dirección del primer argumento = %091x\n”,argv[0]);
printf (“Dirección de la primera variable = %091x\n”, entorno [0]);
exit (0);
}
Espacio de direccionamiento de un proceso
Memoria
del núcleo
Entorno
Argumentos
Pila
Datos (bss)
Datos (data)
Código
Asignación de memoria
Cuando un proceso empieza su ejecución, sus segmentos posen un tamaño fijo. Sin embargo, existen funciones de asignación y liberación de memoria, que permiten a un proceso manipular variables cuyo número o tamaño no es conocido en el momento de la compilación.
Las asignaciones y liberaciones se efectúan modificando el tamaño del segmento de datos del proceso. Cuando debe asignarse un dato, el segmento de datos se aumenta en el número de bytes necesario y el dato puede almacenarse en el espacio de memoria así asignado.
Cuando un dato situado al final del segmento de datos deja de usarse, su liberación consiste simplemente en reducir el tamaño del segmento.
Llamadas
...