内存概念

时间:2012-11-13 22:11:00

标签: c++ memory memory-management arduino

我目前正在学习低级别的arduino内容,包括内存。我的问题是,由于堆和堆栈在内存的另一侧增长,只有在中间遇到某处时才会发生内存不足,或者当其中一个遇到中间时会发生。< / p>

2 个答案:

答案 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)

Stack具有一定的分配大小,如果超出该大小,则会出现堆栈缓冲区溢出。

  

在软件中,当使用太多内存时会发生堆栈溢出   调用堆栈。调用堆栈包含有限的内存,   通常在课程开始时确定。

来源Wikipedia