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

Kir*_*rov 13 linux osx virtual-memory multithreading stack

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

考虑到应用程序不使用递归并且不分配大量堆栈变量,是否有任何推荐的大小?
我知道这个问题太广泛了,它在很大程度上取决于使用情况,但仍然想问,因为我想知道这个庞大的数字背后是否有一些隐藏的/内部/系统原因


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

我也知道这并没有什么坏处,这里有很好的解释pthreads 的默认堆栈大小

Ste*_*itt 17

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

Linux 使用 8MiB 堆栈已经很长时间了;该更改于1995 年 7 月在内核的1.3.7 版中引入。当时它被视为引入限制,以前没有:

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

在 Linux 上,堆栈限制也会影响程序参数和环境的大小,限制为堆栈限制的四分之一;内核为参数和环境强制执行最少 32 页。

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


Col*_*art 5

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

有关完整说明,请参阅https://unix.stackexchange.com/a/280865/21212 。

因此,减少堆栈大小不会对减少应用程序的物理内存使用产生任何影响。

  • 我认为你需要重新审视这个问题的前提,这个(非)答案指出了原因。虚拟内存不是真实内存。堆栈大小可能是 800MB,并且不会影响实际内存使用,除非您的应用程序创建了超过 8MB 的堆栈帧。 (3认同)