实现递归的每种编程语言都实现Stack。如何在真正的电脑堆栈增长?用完Stack空间是否有致命的错误?如何防止发生?堆栈实现 - 防止实时系统中的致命错误
0
A
回答
1
简短的回答是,您必须监视堆栈和堆的增长,但请记住,内存是有限的。你总是可以用完房间。
首先,你有一个错误的假设需要纠正。堆栈不是编程语言的结构。它是硬件的实现。因此,防止超限的解决方案将特定于环境。
此外,堆栈实现将因硬件而异。在x86世界中,堆栈增长缓慢。分页通常用于分离堆栈,以便发生溢出时会导致页面错误。这将允许操作系统处理或停止违规流程。 ref:What is the direction of stack growth in most modern systems?
理论上,堆栈溢出不会导致错误。如果您的显示器或其他机制检测到故障,可以通过向堆栈添加内存来处理,并留出更多空间。这会假定你有连续的内存空间或某种方式来虚拟应用连续的内存空间。但是,这确实不能解决问题。它只是延迟崩溃(假设递归继续)。你最终将耗尽内存或与你的堆相冲突。
直接回答你的问题:
这是否使用递归使用堆栈每一个程序? - 每个在使用CALL和RET堆栈的硬件上运行的progarm(或等价物)都会使用堆栈,即使不使用递归。
堆栈如何增长? - 取决于硬件。找到处理器的白皮书。
用完堆栈空间是否会导致错误? - 不一定。如果硬件或操作系统不会导致错误,程序会很高兴地继续运行。内存破坏是这种情况下最可能发生的结果。这将导致各种奇怪的行为,并可能segfault。
如何防止这种情况发生? - 取决于硬件和情况。一般来说,我会在任务切换时检查每个进程的堆栈完整性。同时也可以堆叠安全地允许小超限。如果发生溢出,则需要分配更多的CONSECUTIVE内存或重定位堆栈。
如果您没有虚拟内存模型,则不太可能分配连续内存。没有这一点,你需要保持空间的增长,在这种情况下,你可能只是将它分配到堆栈开始。
希望这会有所帮助。
相关问题
- 1. 系统堆栈错误
- 2. 堆栈实现
- 3. 堆栈中的致命错误
- 4. C中的堆栈实现
- 5. 辐射1.1.0的系统堆栈错误
- 6. C++堆栈实现
- 7. 防止堆栈溢出错误
- 8. 在MySQL中实现堆栈
- 9. 在java中实现堆栈
- 10. 在C++中实现堆栈
- 11. 在C++中实现堆栈
- 12. 在c中实现堆栈
- 13. Rails测试系统堆栈错误
- 14. 捕捉致命错误时如何不显示错误堆栈
- 15. 实现无堆栈的Python
- 16. 堆栈的数组实现
- 17. C++ Visual Studio 2010,实现动态堆栈时编译错误C3867
- 18. 分段错误错误 - 使用链接列表实现堆栈
- 19. 堆栈实现崩溃时,试图打印堆栈的元素
- 20. Java中的堆栈溢出与Collections-Java中的堆栈实现
- 21. 简单堆栈实现
- 22. Python TCP堆栈实现
- 23. 使用BST实现堆栈
- 24. 通用堆栈实现
- 25. 用Python实现堆栈
- 26. java.lang.ArrayIndexOutOfBoundsException:0(堆栈实现)
- 27. 使用堆栈实现C++
- 28. C堆栈数组实现
- 29. 系统定时器实现
- 30. 堆栈的顶部应该在堆栈的链表中实现?