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

mic*_*ael 12 c c++ linux

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

谢谢.

caf*_*caf 26

堆栈通常受资源限制的限制.您可以使用ulimit -a以下命令查看安装的默认设置:

stack size              (kbytes, -s) 8192
Run Code Online (Sandbox Code Playgroud)

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

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

  • “在某个时候它将运行到您的代码,堆或已加载的库中”我怀疑在64位系统(例如Linux x86_64)上是否会出现问题? (2认同)

小智 5

该限制可以由管理员设置.

男子ulimit.

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

  • @Roger Pate:这基本上是迭代版本. (2认同)

Mar*_*rkR 5

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

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

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

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

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

在任何情况下,您总是会耗尽虚拟内存,在这种情况下,您将获得 SIGBUS 或 SIGSEGV 或其他信息。