openfiles etc conf linux stack ulimit

linux - etc - ulimit centos



¿Qué significa "ulimit-s unlimited"? (3)

"ulimit -s unlimited" permite que la pila crezca sin límites. Esto puede evitar que su programa falle si escribe programas por recursión, especialmente si sus programas no son recursivos de cola (los compiladores pueden "optimizarlos"), y la profundidad de la recursión es grande.

La respuesta de @Maxwell Hansen casi contiene la respuesta correcta a la pregunta. Sin embargo, está enterrado en una multitud de afirmaciones falsas - ver los comentarios. Por lo tanto, me sentí obligado a escribir esta respuesta.

Es comprensible que haya muchas preguntas relacionadas sobre la asignación de apilamiento

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

¿Por qué hay un límite en el tamaño de la pila?

Tamaño de pila y memoria de montón

Sin embargo, en varias máquinas * nix puedo emitir el comando bash

ulimit -s unlimited

o el comando csh

set stacksize unlimited

¿Cómo cambia esto cómo se ejecutan los programas? ¿Hay algún impacto en el rendimiento del programa o sistema (p. Ej., Por qué no sería esto el predeterminado)?

En caso de que más detalles del sistema sean relevantes, me preocupan principalmente los programas compilados con GCC en Linux que se ejecutan en hardware x86_64.


Esto será un poco pedante y parte de eso probablemente ya lo sepas, así que ten paciencia conmigo. Cuando declaras variables en programas, el kernel asigna espacio para sus datos en la pila. Puedes decirle al kernel que limite la cantidad de espacio en la pila (o el montón, para el caso) que un programa determinado puede usar, de esa forma un programa no puede ocupar toda la pila. Si no hubiera un límite sobre la cantidad de la pila que un programa podría usar, los errores que normalmente causarían la falla de un programa en su lugar bloquearían todo el sistema. El kernel que bloquea un programa que va por encima del espacio de pila asignado se denomina "desbordamiento de pila".

Uno de los errores más comunes con la pila es la recursión excesiva o infinita. Como cada llamada nueva a una función hace que todas sus variables se coloquen en la pila, los programas recursivos optimizados sin cola pueden agotar rápidamente el espacio de la pila asignado a un proceso por el kernel. Por ejemplo, esta función infinitamente recursiva daría como resultado un bloqueo del kernel una vez que excediera el espacio de pila asignado:

int smash_the_stack(int number) { smash_the_stack(number + 1); return 0; }

Quedarse sin espacio de pila es tradicionalmente algo que da mucho miedo, ya que se puede usar en algo llamado "destrucción de pila" o desbordamiento de memoria intermedia de pila. Esto ocurre cuando un usuario malicioso provoca intencionalmente que un desbordamiento de pila cambie el puntero de la pila para ejecutar instrucciones propias arbitrarias, en lugar de las instrucciones en su propio código.

En lo que respecta al rendimiento, no debería haber ningún impacto en absoluto. Si está alcanzando su límite de pila mediante la recursión, el tamaño de la pila probablemente no sea la mejor solución, pero de lo contrario no es algo de lo que deba preocuparse. Si un programa debe almacenar cantidades masivas de datos, puede usar el montón.


Mea culpa, el tamaño de la pila puede ser ilimitado. _STK_LIM es el valor 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 se puede ver en este ejemplo, el valor genérico es infinito, donde RLIM_INFINITY es, de nuevo, en un 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, y la traza ilimitada de la pila significará lo que _STK_LIM_MAX se haya definido _STK_LIM_MAX , y en caso de que sea infinito, es infinito. Para obtener detalles sobre lo que significa establecerlo en infinito y las implicaciones que podría tener, consulte la otra respuesta, es mucho mejor que la mía.