我目前正在学习低级别的arduino内容,包括内存。我的问题是,由于堆和堆栈在内存的另一侧增长,只有在中间遇到某处时才会发生内存不足,或者当其中一个遇到中间时会发生。< / p>
答案 0 :(得分:3)
如果存在任何这些限制,那么这些地区相互会面的可能性非常小。实际上,很可能它们很快就会耗尽空间,而防护机制将引发软件异常的相关硬件。
这意味着“内存不足”事件不是一回事。堆栈中有OOM,堆中有OOM。在我的世界中,传统上,与堆栈相关的是StackOverflow :),与堆相关的是OutOf [Heap] Memory。
值得注意的是,如果您的平台具有虚拟内存的概念,那么堆栈很可能仍然是一个单独的空间块,但堆 - 可能是一个稀疏构造,并且将由多个分散的空间块组成,不一定以某种上升或下降的方式进行物理排序。在这种情况下,很难谈论任何满足任何事情的事情。堆栈达到大小限制时发生StackOverflow,当内存管理器无法在内存空间中找到合适的空闲孔时发生OutOfMemory。
如果要忽略虚拟内存,并且只讨论'原始硬件',那么它取决于堆栈的位置。 IIRC(!),在一些(非常古老的)平台上,堆栈被预先分配在位于物理内存开头的某个预定义空间,让我们说前10页,然后“增长到最底层”。然后是几页硬件映射表和端口状态图像,然后剩下的尾部是堆。通过这样的设置,当堆栈指针达到零时,StackOverflow会上升。它非常“智能”,因为处理器的状态标志很容易检测到零。此外,对于那些旧的处理器来说,要比较高的处理器更容易达到较低的地址,所以将经常访问的堆栈放在较低的地址中是一个很大的优点
IIRC(!),更新的平台没有这些问题(通常,让我们忽略NUMA和类似的东西),以及当前传统的“原始硬件”设置在空间的开头放置特殊区域(表格,端口图等)然后是Heap,然后是“自由区域”,然后是堆栈,StackOverflow在空闲区域消失时发生,也就是当堆栈遇到堆已经存在的任何块时。注意,StackOverflow仍然不意味着OutOfMemory:堆栈可能已经溢出,但堆可能有一些空白,仍然可能有很多可用空间!请注意那些'IIRC'很重要。我不是Arduino和当前处理器架构的专家,而且上面的'历史'blargh可能在新的/旧的方面相当不合适。我认为80%的概率是真的。
答案 1 :(得分:1)