2014-08-31 37 views

回答

1

简短的回答是,您必须监视堆栈和堆的增长,但请记住,内存是有限的。你总是可以用完房间。

首先,你有一个错误的假设需要纠正。堆栈不是编程语言的结构。它是硬件的实现。因此,防止超限的解决方案将特定于环境。

此外,堆栈实现将因硬件而异。在x86世界中,堆栈增长缓慢。分页通常用于分离堆栈,以便发生溢出时会导致页面错误。这将允许操作系统处理或停止违规流程。 ref:What is the direction of stack growth in most modern systems?

理论上,堆栈溢出不会导致错误。如果您的显示器或其他机制检测到故障,可以通过向堆栈添加内存来处理,并留出更多空间。这会假定你有连续的内存空间或某种方式来虚拟应用连续的内存空间。但是,这确实不能解决问题。它只是延迟崩溃(假设递归继续)。你最终将耗尽内存或与你的堆相冲突。

直接回答你的问题:

这是否使用递归使用堆栈每一个程序? - 每个在使用CALL和RET堆栈的硬件上运行的progarm(或等价物)都会使用堆栈,即使不使用递归。

堆栈如何增长? - 取决于硬件。找到处理器的白皮书。

用完堆栈空间是否会导致错误? - 不一定。如果硬件或操作系统不会导致错误,程序会很高兴地继续运行。内存破坏是这种情况下最可能发生的结果。这将导致各种奇怪的行为,并可能segfault。

如何防止这种情况发生? - 取决于硬件和情况。一般来说,我会在任务切换时检查每个进程的堆栈完整性。同时也可以堆叠安全地允许小超限。如果发生溢出,则需要分配更多的CONSECUTIVE内存或重定位堆栈。

如果您没有虚拟内存模型,则不太可能分配连续内存。没有这一点,你需要保持空间的增长,在这种情况下,你可能只是将它分配到堆栈开始。

希望这会有所帮助。