Tamaño de stack y memoria de stack

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

Con respecto a los conceptos básicos del diseño de la memoria en el progtwig 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 progtwig
  • El montón es de longitud variable en la naturaleza. (No muy seguro en la stack)
  • Normalmente, es responsabilidad del comstackdor / 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 stack / stack? 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  #include  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 stack se va hacia abajo y el montón va hacia arriba (como se puede esperar en función del mito), pero la stack 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 comstackción, es posible que veas que la stack 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.

Como ya se mencionó, los tamaños son específicos del sistema operativo. Por ejemplo, en Windows utilizando Visual Studio, el tamaño de stack 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 progtwig cuando se carga en la memoria tiene varios segmentos. En el assembly, 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 stack también puede crecer de forma implícita, es decir, cuando realiza otra llamada de función, se astack un registro de activación para astackr, utilizando más memoria de la stack. Es por eso que la recursión infinita provoca un locking cuando un progtwig se queda sin la stack asignada.

Cuando vuelve una llamada a función, ese registro de activación se abre y la stack 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 stack comienza ———– la stack crece hacia abajo

——– A menos que se crucen entre sí, se puede ejecutar un progtwig.

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

Si su progtwig no utiliza ningún montón, su stack puede utilizar la memoria máxima incluyendo la de montón también. Si el progtwig realiza pocas llamadas recursivas y utiliza variables locales mínimas (es decir, usa menos memoria para la stack), 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

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

Esto es específico del comstackdor 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 astack en la dirección de bajo nivel”.

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

De Verdad. El estándar de idioma no exige el tamaño mínimo de stack ni especifica la ubicación de la stack o el montón en la memoria. Y la razón para eso es hacer que los progtwigs 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 comstackdores).

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

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 stack fijo para cada proceso, que es específico de la plataforma. No hay límite en el tamaño del montón, el progtwig 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 stack crece hacia abajo y el montón crece hacia arriba.