首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"ulimit -s ulimit“是做什么的?

"ulimit -s ulimit“是做什么的?
EN

Stack Overflow用户
提问于 2013-01-23 10:39:57
回答 3查看 122.1K关注 0票数 56

可以理解,在堆栈分配方面有许多相关的问题

What and where are the stack and heap?

Why is there a limit on the stack size?

Size of stack and heap memory

但是,在各种*nix机器上,我可以发出bash命令

代码语言:javascript
复制
ulimit -s unlimited

或csh命令

代码语言:javascript
复制
set stacksize unlimited

这将如何改变程序的执行方式?是否对程序或系统性能有任何影响(例如,为什么这不是默认设置)?

如果有更多相关的系统细节,我最关心的是在x86_64硬件上运行的Linux上用GCC编译的程序。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-23 11:05:45

当你调用一个函数时,会在堆栈上分配一个新的“命名空间”。这就是函数可以有局部变量的原因。当函数调用函数,而函数又调用函数时,我们会在堆栈上分配越来越多的空间,以维护这种深层的名称空间层次结构。

为了限制程序使用大量堆栈空间,通常会通过ulimit -s设置限制。如果我们通过ulimit -s unlimited消除这个限制,我们的程序将能够继续为它们不断增长的堆栈吞噬内存,直到最终系统完全耗尽内存。

代码语言:javascript
复制
int eat_stack_space(void) { return eat_stack_space(); }
// If we compile this with no optimization and run it, our computer could crash.

通常,使用大量的堆栈空间是偶然的,或者是非常深的递归的症状,这可能不应该太依赖堆栈。因此,堆栈限制。

对性能的影响很小,但确实存在。使用time命令,我发现取消堆栈限制可以将性能提高几分之一秒(至少在64位Ubuntu上)。

票数 29
EN

Stack Overflow用户

发布于 2013-01-23 11:02:10

堆栈大小可以确实是无限的。从include/asm-generic/resource.h可以看出,_STK_LIM是缺省的,_STK_LIM_MAX是每个体系结构都不同的东西

代码语言:javascript
复制
/*
 * RLIMIT_STACK default maximum - some architectures override it:
 */
#ifndef _STK_LIM_MAX
# define _STK_LIM_MAX           RLIM_INFINITY
#endif

从本例中可以看出,泛型值是无穷大的,其中RLIM_INFINITY在泛型情况下又定义为:

代码语言:javascript
复制
/*
 * 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

所以我猜真正的答案是-堆栈的大小可以受到某种架构的限制,那么无限的堆栈跟踪将意味着任何_STK_LIM_MAX的定义,如果它是无限的-它是无限的。有关将其设置为无限的含义以及可能产生的影响的详细信息,请参考另一个答案,它比我的好得多。

票数 2
EN

Stack Overflow用户

发布于 2017-02-14 23:32:58

ulimit -s unlimited让堆栈无限增长。

如果你用递归编写程序,这可能会防止你的程序崩溃,特别是如果你的程序不是尾递归的(编译器可以“优化”它们),而且递归的深度很大。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14471564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档