linux中进程的堆栈大小是否有限制

时间:2010-04-17 00:18:43

标签: c++ c linux

stack中流程的Linux大小是否有限制?它只是依赖于机器的RAM吗? 我想知道这一点,以限制函数的递归调用的深度。

谢谢。

4 个答案:

答案 0 :(得分:26)

堆栈通常受资源限制的限制。您可以使用ulimit -a

查看安装的默认设置
stack size              (kbytes, -s) 8192

(这表明我的是8MB,这是巨大的。)

如果删除或增加该限制,您仍然无法使用机器中的所有RAM作为堆栈 - 堆栈从进程地址空间顶部附近的点向下增长,并且在某些时候它会遇到你的代码,堆或加载的库。

答案 1 :(得分:5)

限制可以由管理员设置。

请参阅man ulimit

可能存在无法跨越的默认值。如果你不得不担心堆栈限制,我会说你需要重新考虑你的设计,也许写一个迭代版本?

答案 2 :(得分:3)

这在很大程度上取决于你所使用的架构(32或64位)以及你是否是多线程的。

默认情况下,在单线程进程中,即操作系统在exec()时创建的主线程,您的堆栈通常会增长,直到它在地址空间中遇到其他内容。这意味着在32位机器上通常可以使用1G的堆栈。

但是,在多线程32位进程中绝对不是这种情况。在多线程过程中,堆栈共享地址空间,因此需要进行分配,因此它们通常会获得少量的地址空间(例如1M),这样就可以创建多个线程而不会耗尽地址空间。

因此,在多线程进程中,它是小而有限的,在单线程进程中,它基本上直到你在地址空间中找到其他东西(默认分配机制试图确保不会太快发生)。 / p>

在64位机器中,当然还有更多的地址空间可供使用。

在任何情况下,您总是可以用完虚拟内存,在这种情况下,您将获得SIGBUS或SIGSEGV等。

答案 3 :(得分:0)

会对已接受的答案发表评论,但显然我需要更多代表......

True Stack Overflow可能很微妙,并不总是会导致任何错误消息或警告。我只是遇到一种情况,即唯一的症状是套接字连接会因奇怪的SSL错误而失败。其他一切都很好。线程可以是malloc(),获取锁定,与数据库通信等等。但是新连接在SSL层会失败。

对于GnuTLS中的堆栈跟踪,我对真正的原因感到非常困惑。在花了很多时间试图解决问题之后,几乎向他们的团队报告了这些痕迹。

最终发现stacksize设置为8Mb,一旦提升它,问题就消失了。将堆栈降低到8Mb会导致问题恢复(ABA)。

因此,如果您正在排除看似奇怪的套接字错误而没有任何其他警告或未初始化的内存错误....它可能是堆栈溢出。