堆栈内存大小限制:技术注意事项
堆栈是计算中的基本数据结构,与堆。虽然堆提供了看似无限的内存分配,但堆栈的大小通常限制在 1 MB 左右。这就提出了一个问题:哪些技术因素导致了这种差异?
根据一个假设,堆栈的大小受限源于其与堆相比的固有管理复杂性。堆栈的操作需要连续的内存位置。与堆不同,它不能根据需要随机分配内存,而是必须为此目的保留虚拟地址。保留的虚拟地址空间越大,可以创建的线程就越少。
例如,在具有 2GB 虚拟地址空间的 32 位应用程序中,2MB 堆栈大小(如 pthreads 中)限制了最大数量线程数最多为 1024。对于需要大量线程的 Web 服务器等应用程序来说,此限制可能会成为问题。将堆栈大小增加到 100MB,同时不立即分配全部数量,会进一步将线程限制减少到 20 左右。这样的限制甚至会阻碍简单的 GUI 应用程序。
奇怪的是,同样的限制在 64 位上仍然存在平台,有充足的虚拟地址空间。为了解释这一点,一些人推测已建立的“堆栈最佳实践”导致了 64 位系统上缺乏对大型堆栈的支持。开发人员习惯于在堆上分配大对象,并在必要时手动增加堆栈大小。因此,64 位架构上并未出现对“巨大”堆栈支持的感知需求。
以上是为什么栈的大小有限,而堆的大小却似乎无限?的详细内容。更多信息请关注PHP中文网其他相关文章!