c++ - 内存不足的概念

标签 c++ memory memory-management arduino

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

最佳答案

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

如果存在任何这些限制,那么这些区域彼此相遇的可能性非常小。实际上,它们很可能很快就会用完空间,并且保护机制会引发相关硬件或软件异常。

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

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

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

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

请注意,那些“IIRC”很重要。我不是 Arduino 和当前处理器架构方面的专家,而且上面的“历史性”夸张在更新/更旧的方面可能完全不同。我认为它有 80% 的可能性是真的。

关于c++ - 内存不足的概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13369750/

相关文章:

c++ - 不存在从 "std::string"到 "char"的合适转换

c++ - Iaccessible接口(interface)的accLoacation()方法中的参数如何初始化?

kubernetes - 容器上的 “container_memory_working_set_bytes” 和 “container_memory_rss” 度量有什么区别

iphone - 为什么我的应用程序只使用了大约 36MB 内存,但我仍然收到内存不足警告?

ios - 为什么 mmap 在 iOS 上失败?

javascript - 如何释放 JavaScript 中的内存

c++ - 队列返回 pair.first 的错误值

c++ - 如何创建一个添加数字的模板函数

c++ - 您如何才能准确地看到内存泄漏的内容?

c - 在二叉搜索树中插入一个元素会停止工作