teoria programacion pilas pila estructura estatica ejemplos datos con colas arreglos algoritmos c memory-management stack heap

programacion - pilas y colas en c++



TamaƱo de pila y memoria de pila (4)

Posible duplicado:
¿Qué y dónde están la pila y el montón?

Con respecto a los conceptos básicos del diseño de la memoria en el programa de CA, entiendo que:

  • El lenguaje usa dos estructuras de datos primarios, stack y heap .
  • Stack se crea para almacenar las variables locales y los datos de contabilidad de las subrutinas
  • Heap se crea para almacenar las variables dinámicamente asignadas del programa
  • El montón es de longitud variable en la naturaleza. (No muy seguro en la pila)
  • Normalmente, es responsabilidad del compilador / Language solicitar al sistema operativo que cree estas estructuras de datos antes de la ejecución.

Preguntas

  • ¿Cuál es el tamaño inicial con el que se crea una pila / pila? y quien lo decide?
  • ¿En qué memoria física se crean? Veo una descripción general como "Stack se crea en la dirección de nivel superior y el montón en la dirección de bajo nivel". Por favor, elobarate this

"Stack se crea en la dirección de nivel superior y en el montón en la dirección de bajo nivel". Por favor, elobarate this

Esto es un mito Puede tener una base en la verdad histórica. A veces puede resonar con cosas que ves en la vida real. Pero no es literalmente cierto.

Sin embargo, es bastante fácil de explorar:

#include <stdlib.h> #include <stdio.h> void check(int depth) { char c; char *ptr = malloc(1); printf("stack at %p, heap at %p/n", &c, ptr); if (depth <= 0) return; check(depth-1); } int main() { check(10); return 0; }

En mi máquina veo:

stack at 0x22ac3b, heap at 0x20010240 stack at 0x22ac0b, heap at 0x200485b0 stack at 0x22abdb, heap at 0x200485c0 stack at 0x22abab, heap at 0x200485d0 stack at 0x22ab7b, heap at 0x200485e0 stack at 0x22ab4b, heap at 0x200485f0 stack at 0x22ab1b, heap at 0x20048600 stack at 0x22aaeb, heap at 0x20048610 stack at 0x22aabb, heap at 0x20048620 stack at 0x22aa8b, heap at 0x20048630 stack at 0x22aa5b, heap at 0x20048640

Por lo tanto, la pila se va hacia abajo y el montón va hacia arriba (como se puede esperar en función del mito), pero la pila tiene la dirección más pequeña, y no están creciendo el uno hacia el otro (mito reventado).

Por cierto, mi función de check es recursiva de la cola, y en algunas implementaciones con algunas opciones de compilación, es posible que veas que la pila no se mueve en absoluto. Lo que le dice algo acerca de por qué el estándar no ordena cómo funciona todo esto; si lo hiciera, podría prohibir inadvertidamente las optimizaciones útiles.


¿Cuál es el tamaño inicial con el que se crea una pila / pila? y quien lo decide?

Esto es específico del compilador y del sistema operativo.

¿En qué memoria física se crean? Veo una descripción general como "Heap se crea en la dirección de nivel superior y apila en la dirección de bajo nivel".

Esto es específico del compilador y del sistema operativo.

De Verdad. El estándar de idioma no exige el tamaño mínimo de pila ni especifica la ubicación de la pila o el montón en la memoria. Y la razón para eso es hacer que los programas C sean menos dependientes de estos detalles y, por lo tanto, más portátiles para diferentes plataformas (léase: sistemas operativos diferentes, diferentes CPU, diferentes compiladores).


Como ya se mencionó, los tamaños son específicos del sistema operativo. Por ejemplo, en Windows utilizando Visual Studio, el tamaño de pila predeterminado es de 1 MB

msdn

En Linux, el siguiente comando puede mostrar show your current.

ulimit -s or -a

En mi Linux mint 64 bit muestra 8192 KB.

Cada programa cuando se carga en la memoria tiene varios segmentos. En el montaje, se puede indicar a cada uno de los que utilizan el prefijo .data, .code, etc. (intelx86).

Es un segmento de datos que tiene varias subsecciones. Tanto el stack como el montón son parte de él, además de muchos otros.

La pila también puede crecer de forma implícita, es decir, cuando realiza otra llamada de función, se apila un registro de activación para apilar, utilizando más memoria de la pila. Es por eso que la recursión infinita provoca un bloqueo cuando un programa se queda sin la pila asignada.

Cuando vuelve una llamada a función, ese registro de activación se abre y la pila se reduce.

En contraste, el montón crece desde la dirección opuesta y contiene toda la memoria asignada dinámicamente.

La razón por la cual estos dos segmentos crecen en dirección opuesta es maximizar la utilización de su memoria combinada. Tenga en cuenta que, como se menciona en los comentarios, esto no es un estándar de CA, pero los sistemas operativos más comunes lo han implementado.

------ la pila comienza ----------- la pila crece hacia abajo

-------- A menos que se crucen entre sí, se puede ejecutar un programa.

------- el montón comienza ------------ el montón crece hacia arriba

Si su programa no utiliza ningún montón, su pila puede utilizar la memoria máxima incluyendo la de montón también. Si el programa realiza pocas llamadas recursivas y utiliza variables locales mínimas (es decir, usa menos memoria para la pila), puede utilizar el montón a lo sumo.

Otras partes del segmento de datos son BSS, etc. que pueden contener campos tales como variables estáticas no inicializadas


En primer lugar, el estándar C no impone ningún requisito sobre cómo la plataforma implementa la pila / pila.

What is the initial size with which a stack/heap is created? and who decides it?

Normalmente, el sistema operativo asigna un tamaño de pila fijo para cada proceso, que es específico de la plataforma. No hay límite en el tamaño del montón, el programa generalmente tiene todo el espacio de direcciones virtual disponible.

Wherein physical memory are they are created?

Esto es específico de la plataforma. Típicamente, la pila crece hacia abajo y el montón crece hacia arriba.