内存不足的概念

Out of Memory Concepts

本文关键字:内存不足      更新时间:2023-10-16

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

  • 没有"中间"的概念
  • 根据底层操作系统(如果有的话!)如何管理进程(如果平台上有这样的东西!),堆栈的大小可能有限,比"整个内存的其余部分"小得多
  • 根据底层操作系统(如果有的话!)管理虚拟内存空间的方式(如果平台上有这样的东西!),堆的大小可能有限,比"整个内存的其余部分"小得多

如果这些限制中的任何一个都存在,那么这些区域相遇的可能性非常小。事实上,它们很可能很快就会耗尽空间,而保护机制会引发相关的硬件和软件异常。

这意味着"内存不足"事件不是一回事。堆栈中有OOM,堆中也有OOM。在我所在的地区,传统上,与堆栈相关的被称为StackOverflow:),与堆相关的是OutOf[heap]Memory。

值得注意的是,如果你的平台有虚拟内存的概念,那么堆栈很可能仍然是一个单一的空间块,但堆可能是一个稀疏的结构,由多个分散的空间块组成,不一定以某种升序或降序进行物理排序。在这种情况下,很难说什么会遇到什么。StackOverflow发生在堆栈达到大小限制时,OutOfMemory发生在内存管理器无法在内存空间中找到合适的空闲孔时。

如果忽略虚拟内存,如果只谈论"原始硬件",则取决于。。堆栈的实际位置。IIRC(!),在一些(非常旧的)平台上,堆栈被预先分配在物理内存开头的某个预定义空间,比如说前十页,然后增长到"底部"。然后是几页硬件映射表和端口状态映像,剩下的尾部是堆。有了这样的设置,当堆栈指针达到时,StackOverflow就会上升。它非常"智能",因为使用处理器的状态标志很容易检测到零。。此外,对于那些旧的处理器来说,访问较低地址比访问较高地址容易得多,因此将经常访问的堆栈放在较低地址是一大优势。

IIRC(!),较新的平台没有这些问题(通常,让我们忽略NUMA和类似的东西),并且当前传统的"原始硬件"设置将特殊区域(表、端口映射等)放在空间的开头,然后是Heap,然后是"空闲区域",然后是Stack,当空闲区域消失时,即堆栈遇到堆中已经存在的任何块时,就会发生StackOverflow。请注意,StackOverflow仍然不意味着OutOfMemory:堆栈可能已经溢出,但堆可能有一些间隙,并且仍然可能有很多可用空间!

请注意,这些"IIRC"非常重要。我不是Arduino和当前处理器架构的专家,而且上面的"历史"blargh在更新/旧版本方面可能也很不一样。我认为它有80%的概率是真的。

Stack有一个特定的分配大小,如果超过这个大小,就会出现堆栈缓冲区溢出。

在软件中,当在调用堆栈。调用堆栈包含有限数量的存储器,通常在程序开始时确定。

源维基百科