为什么在现代 Linux 上,默认堆栈大小如此之大 - 8MB(在某些发行版上甚至是 10)

为什么在现代 Linux 上,默认堆栈大小如此之大 - 8MB(在某些发行版上甚至是 10)

例如,在 OSX 上,它甚至小于 512k。

有没有推荐的尺寸,请记住,该应用程序不使用递归并且不分配大量堆栈变量
我知道这个问题太广泛了,它很大程度上取决于用法,但仍然想问,因为我想知道是否有一些隐藏/内部/系统原因在这个庞大的数字背后。


我想知道,因为我打算在我的应用程序中将堆栈大小更改为 512 KiB - 这听起来仍然是一个巨大的数字,但它比 8MiB 小得多 - 并且会导致进程的虚拟内存显着减少,因为我有很多线程(I/O)。

我也知道这个并没有真正伤害,这里有很好的解释pthread 的默认堆栈大小

答案1

正如其他人所说,正如您在问题中提供的链接中提到的那样,拥有 8MiB 堆栈不会造成任何损害(除了消耗地址空间 - 在 64 位系统上这并不重要)。

Linux 已经使用 8MiB 堆栈很长时间了;该更改是在版本1.3.71995 年 7 月,内核发布了它。当时它被认为是引入了一个限制,而之前是没有限制的:

将堆栈限制为一些合理的默认值:如果需要,root 可以随时增加此限制。8MB 似乎是合理的。

在 Linux 上,堆栈限制还会影响程序参数和环境的大小,这些参数仅限于堆栈限制的四分之一;内核强制参数和环境至少有 32 个页面。

对于线程来说,如果栈限制(RLIMIT_STACK)是无限制的,pthread_create对新线程的堆栈应用其自身的限制 - 在大多数架构上,该限制小于 8MiB。

答案2

8MB 是虚拟的堆栈的大小。当您的应用程序尝试使用比当前物理分配更多的堆栈时,就会发生页面错误。然后内核的页面错误处理程序将分配一个身体的页面,然后您的申请将继续。

https://unix.stackexchange.com/a/280865/21212以获得完整的解释。

所以减少你的堆栈大小应该对减少应用程序的物理内存使用没有影响。

相关内容