Pregunta

  

Posibles duplicados:
   ¿Cómo se gestionan, implementan y asignan las memorias de pila y pila?
   Pila, estática y montón en C ++

En C / C ++ podemos almacenar variables, funciones, funciones miembro, instancias de una clase en una pila o en un montón.

¿Cómo se implementa cada uno? ¿Cómo se gestiona (alto nivel)? ¿Gcc asigna previamente una porción de memoria para la pila y el montón, y luego se distribuye a pedido? ¿La memoria original proviene de la RAM?

¿Se puede asignar una función en el montón en lugar de una pila?

             --Clarification--

Realmente estoy preguntando acerca de la implementación y administración de las memorias de montón y pila. Después de leer la pregunta referenciada, no encontré nada que aborde eso ... gracias por el enlace

¿Fue útil?

Solución

Creo que a su pregunta uno puede escribir fácilmente al menos algunos capítulos para el libro sobre Sistemas Operativos. Le sugiero que lea Tanenbaum: sistemas operativos modernos.

Diferencia principal del montón y la pila, una por elemento de proceso y la otra por elemento de subproceso. Inicialmente, cuando se inicia el programa, obtiene un montón mínimo y un segmento de pila. El montón crece, la pila es estática (para cada subproceso). Si escribe una función recursiva que no termina (recursión sin fin) obtendrá un desbordamiento de pila;) Cualquier llamada de función tiene un marco de pila en el segmento de pila, cuando la función se va, la pila se desenrolla y el marco es libre de ser utilizado por el siguiente función La pila es una estructura lineal continua. En Linux, puede configurar el tamaño del segmento de pila para un proceso a través de una variable de entorno. En Windows (al menos con MS Visual C ++) puede pasar un indicador de enlace con el tamaño del segmento de pila. Los desbordamientos de pila también se pueden producir al asignar en tiempo de compilación una gran variedad:

char test[1000000];

El montón es una historia diferente. Cuando se inicia un proceso, el tamaño de almacenamiento dinámico es un valor predeterminado y puede variar de un sistema operativo a otro o de la configuración que se utiliza en ese sistema operativo (por ejemplo, en Windows es de 2 MB por defecto, por lo que recuerdo). Además, si necesita más almacenamiento dinámico, para asignar más espacio para variables, etc., crecerá. Si el programa no libera memoria de montón, se queda sin él (o espacio de montón). Existen diferentes estructuras de datos para la implementación del montón, algunas de ellas son derivados de árboles binarios, algunas no son p. Montón de Fibonacci (bosque de árboles). Puede leer algunos artículos, etc. sobre cómo escribir un asignador de memoria. Estas estructuras de datos deben optimizarse para encontrar el nodo de almacenamiento dinámico cuando se debe desasignar un fragmento asignado o agregar (encontrar un fragmento libre) cuando se necesita un nuevo espacio dinámico.

Cada proceso en un sistema operativo de 32 bits tiene 4 GB de espacio de direcciones virtuales. Como puede imaginar, no puede haber tanta RAM en la que se ajusten todos los procesos con sus 4 GB de espacio de direcciones virtuales. La memoria del sistema operativo se organiza en páginas, que se cambian a HD cuando ya no son necesarias o caducan. Aquí es donde juega la paginación. Todo se asigna a páginas: un proceso con la pila o el montón en crecimiento. Debido a la estructura del montón que crece dinámicamente, se puede colocar en varias páginas. Esta es la razón por la cual el acceso al almacenamiento dinámico puede ser muy costoso, porque si la página no está en la memoria se produce un error de página y el sistema operativo tiene que cargar una página desde el disco (y eso puede ser por magnitud más lento). El marco de la pila del hilo que se está ejecutando está en la memoria caché del procesador, que es mucho más rápido que la RAM.

Son posibles diferentes tipos de almacenamiento dinámico, puede haber montones que son muy rápidos para objetos pequeños o montones que son muy eficientes en entornos de subprocesos múltiples. Alexandrescu describe en "Diseño moderno de C ++" cómo desarrollar un asignador de objetos pequeños y un montón que gestiona objetos pequeños. Esta implementación está disponible en su biblioteca Loki C ++. Algunos sistemas integrados ofrecen regiones de memoria físicamente diferentes, donde se pueden implementar diferentes tipos de almacenamiento dinámico en la parte superior. Escribir un propio asignador (administrador de almacenamiento dinámico, etc.) es un trabajo difícil si desea vencer a un compilador.

Saludos,
Ovanes

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top