内存不足的概念
Out of Memory Concepts
我目前正在学习包括内存在内的低级别arduino内容。我的问题是,由于堆和堆栈在内存的另一侧增长,内存不足是只有当两者在中间的某个地方遇到时才会发生,还是当其中一个遇到中间时才会发生。
- 没有"中间"的概念
- 根据底层操作系统(如果有的话!)如何管理进程(如果平台上有这样的东西!),堆栈的大小可能有限,比"整个内存的其余部分"小得多
- 根据底层操作系统(如果有的话!)管理虚拟内存空间的方式(如果平台上有这样的东西!),堆的大小可能有限,比"整个内存的其余部分"小得多
如果这些限制中的任何一个都存在,那么这些区域相遇的可能性非常小。事实上,它们很可能很快就会耗尽空间,而保护机制会引发相关的硬件和软件异常。
这意味着"内存不足"事件不是一回事。堆栈中有OOM,堆中也有OOM。在我所在的地区,传统上,与堆栈相关的被称为StackOverflow:),与堆相关的是OutOf[heap]Memory。
值得注意的是,如果你的平台有虚拟内存的概念,那么堆栈很可能仍然是一个单一的空间块,但堆可能是一个稀疏的结构,由多个分散的空间块组成,不一定以某种升序或降序进行物理排序。在这种情况下,很难说什么会遇到什么。StackOverflow发生在堆栈达到大小限制时,OutOfMemory发生在内存管理器无法在内存空间中找到合适的空闲孔时。
如果忽略虚拟内存,如果只谈论"原始硬件",则取决于。。堆栈的实际位置。IIRC(!),在一些(非常旧的)平台上,堆栈被预先分配在物理内存开头的某个预定义空间,比如说前十页,然后增长到"底部"。然后是几页硬件映射表和端口状态映像,剩下的尾部是堆。有了这样的设置,当堆栈指针达到零时,StackOverflow就会上升。它非常"智能",因为使用处理器的状态标志很容易检测到零。。此外,对于那些旧的处理器来说,访问较低地址比访问较高地址容易得多,因此将经常访问的堆栈放在较低地址是一大优势。
IIRC(!),较新的平台没有这些问题(通常,让我们忽略NUMA和类似的东西),并且当前传统的"原始硬件"设置将特殊区域(表、端口映射等)放在空间的开头,然后是Heap,然后是"空闲区域",然后是Stack,当空闲区域消失时,即堆栈遇到堆中已经存在的任何块时,就会发生StackOverflow。请注意,StackOverflow仍然不意味着OutOfMemory:堆栈可能已经溢出,但堆可能有一些间隙,并且仍然可能有很多可用空间!
请注意,这些"IIRC"非常重要。我不是Arduino和当前处理器架构的专家,而且上面的"历史"blargh在更新/旧版本方面可能也很不一样。我认为它有80%的概率是真的。
Stack有一个特定的分配大小,如果超过这个大小,就会出现堆栈缓冲区溢出。
在软件中,当在调用堆栈。调用堆栈包含有限数量的存储器,通常在程序开始时确定。
源维基百科
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 在内存不足之前,我可以声明多少个 const 变量?
- 如何避免由于内存不足而导致 gcc 崩溃
- 检测到由于操作系统内存不足而导致子进程终止
- 导出 vulkan 内存分配句柄会导致设备内存不足
- 如何消除ROS打开CV中的内存不足错误?
- 32 位应用程序内存不足
- 在本机 Android 应用中处理内存不足
- 在 Linux 上C++的无限循环中捕获内存不足的错误 bad_alloc()
- 处理静态数组内存C++的内存不足情况
- 访问违规可以是一个伪装的内存不足错误吗
- g++ 内存不足为 std::bitset 分配
- C++ 分配器在内存不足时使应用程序崩溃
- 使用队列的非递归回溯:内存不足
- C++ : 内存不足时应返回什么?
- 使用 sqlite3 时内存不足
- std::int 和 struct 内存不足的映射 (std::Bad_alloc) c++
- SQLITE 内存不足 无法执行语句
- 内存不足的概念
- 从 c# 内存不足异常调用 c++ 委托