Bri*_*ins 44 linux stack ulimit
有关堆栈分配的许多相关问题是可以理解的
但是在各种*nix机器上,我可以发出bash命令
ulimit -s unlimited
Run Code Online (Sandbox Code Playgroud)
或者csh命令
set stacksize unlimited
Run Code Online (Sandbox Code Playgroud)
这如何改变程序的执行方式?是否对程序或系统性能有任何影响(例如,为什么这不是默认值)?
如果更多的系统细节是相关的,我主要关注在x86_64硬件上运行的Linux上使用GCC编译的程序.
Ale*_*lex 25
调用函数时,会在堆栈上分配新的"命名空间".这就是函数可以有局部变量的方式.随着函数调用函数,函数又调用函数,我们不断在堆栈上分配越来越多的空间来维护命名空间的深层次结构.
为了使用大量的堆栈空间来限制程序,通常会通过限制来实现限制ulimit -s
.如果我们通过删除该限制ulimit -s unlimited
,我们的程序将能够为他们不断增长的堆栈继续吞噬RAM,直到最终系统完全耗尽内存.
int eat_stack_space(void) { return eat_stack_space(); }
// If we compile this with no optimization and run it, our computer could crash.
Run Code Online (Sandbox Code Playgroud)
通常,使用大量的堆栈空间是偶然的或非常深的递归的症状,可能不应该如此依赖堆栈.因此堆栈限制.
对绩效的影响很小但确实存在.使用该time
命令,我发现消除堆栈限制会使性能提高几分之一秒(至少在64位Ubuntu上).
ulimit -s unlimited
让堆栈无限增长。
如果您通过递归编写程序,这可能会防止您的程序崩溃,特别是如果您的程序不是尾递归(编译器可以“优化”它们),并且递归深度很大。
归档时间: |
|
查看次数: |
98319 次 |
最近记录: |