【问题标题】:Why is there a limit on the stack size? [duplicate]为什么堆栈大小有限制? [复制]
【发布时间】:2011-10-02 15:31:49
【问题描述】:

可能重复:
What and where are the stack and heap

我安装的 Ubuntu 的默认堆栈大小限制为 8 MB。但我很好奇为什么我们需要限制用户程序的堆栈大小。同一个程序可以通过 malloc/mmap 等使用其所有 4 GB(对于 32 位程序)可寻址空间。那么为什么我们需要堆栈大小限制呢?为什么栈不能增长到快碰到堆?

【问题讨论】:

  • 我阅读了该线程中的前 4 个答案。它提供了很多有用的信息。但重点是区分堆栈和堆。多次提到堆栈通常具有在线程开始时确定的限制。我的问题是为什么会这样?堆可以在运行时增长。堆栈和堆都是进程的 RAM 和虚拟内存的一部分。那为什么栈大小有限制呢?

标签: stack callstack


【解决方案1】:

事实上,堆栈确实越来越大。它不需要很大,因为在一般情况下,它不需要很大。太大会导致内存占用浪费。

我不能 100% 确定堆栈是如何在 Linux 上实现的,但在 Windows 上,大量空间为堆栈保留。这个数量可以在编译器选项中设置(对于深度递归程序,您可能需要更大的堆栈)。在运行时,堆栈可以通过保护页面系统动态扩展。在堆栈的末尾有一个保护页,当被击中时,它将使堆栈扩展一个额外的页面并将保护页向前推一页。

堆栈探测是另一个有趣且相关的概念。所以你的问题是'为什么堆栈不能增长到几乎遇到堆?堆栈确实会增长,但由于大多数情况下拥有巨大堆栈可能是错误的不良副作用,因此保留的大小不会很大(尽管这是可设置的)。

This article 非常有趣且与您的问题相关。

【讨论】:

猜你喜欢
  • 2022-07-21
  • 2015-06-30
  • 2020-10-02
  • 2012-05-16
  • 2020-12-04
  • 2018-02-08
  • 2012-11-19
  • 2018-10-16
相关资源
最近更新 更多