Cuando llama a una función, se asigna un nuevo "espacio de nombres" en la pila. Así es como las funciones pueden tener variables locales. A medida que las funciones llaman a funciones, que a su vez llaman a funciones, seguimos asignando más y más espacio en la pila para mantener esta profunda jerarquía de espacios de nombres.
Para frenar los programas que usan cantidades masivas de espacio de pila, generalmente se establece un límite a través de ulimit -s
. Si eliminamos ese límite a través de ulimit -s unlimited
, nuestros programas podrán seguir engullendo RAM para su pila cada vez mayor hasta que finalmente el sistema se quede sin memoria por completo.
int eat_stack_space(void) { return eat_stack_space(); }
// If we compile this with no optimization and run it, our computer could crash.
Por lo general, usar una tonelada de espacio de pila es accidental o un síntoma de una recursividad muy profunda que probablemente no debería depender tanto de la pila. Por lo tanto, el límite de la pila.
El impacto en el rendimiento es menor pero existe. Usando el time
comando, descubrí que eliminar el límite de pila aumentó el rendimiento en unas pocas fracciones de segundo (al menos en Ubuntu de 64 bits).
ulimit -s unlimited
permite que la pila crezca ilimitadamente.
Esto puede evitar que su programa se bloquee si escribe programas por recursividad, especialmente si sus programas no son recursivos de cola (los compiladores pueden "optimizarlos") y la profundidad de la recursividad es grande.
tamaño de pila lata de hecho ser ilimitado. _STK_LIM
es el predeterminado , _STK_LIM_MAX
es algo que difiere según la arquitectura, como se puede ver en include/asm-generic/resource.h
:
/*
* RLIMIT_STACK default maximum - some architectures override it:
*/
#ifndef _STK_LIM_MAX
# define _STK_LIM_MAX RLIM_INFINITY
#endif
Como puede verse en este ejemplo, el valor genérico es infinito, donde RLIM_INFINITY
es, nuevamente, en caso genérico definido como:
/*
* SuS says limits have to be unsigned.
* Which makes a ton more sense anyway.
*
* Some architectures override this (for compatibility reasons):
*/
#ifndef RLIM_INFINITY
# define RLIM_INFINITY (~0UL)
#endif
Así que supongo que la respuesta real es:el tamaño de la pila PUEDE estar limitado por alguna arquitectura, entonces el seguimiento ilimitado de la pila significará lo que sea _STK_LIM_MAX
se define como, y en caso de que sea infinito, es infinito. Para obtener detalles sobre lo que significa establecerlo en infinito y qué implicaciones podría tener, consulte la otra respuesta, es mucho mejor que la mía.