malloc 实际上是如何获得微 Controller 中当前可用的可用内存空间的。 它是否在运行时连续保留未分配区域列表? 如果代码中有两个malloc语句,它如何获取之前malloc赋值内存分配的信息
如何在运行时知道哪些内存是空闲的,哪些不是。在编译时,我们可以知道编译器为变量分配了 RAM 中的哪些所有位置。 malloc 是否使用此信息来执行此操作。
最佳答案
正如上面的评论员所说,malloc 有多种实现,并且对于这些实现中的每一个,算法可能有很大差异。这是一个广阔而复杂的领域,您应该阅读内存管理以获得关于该主题的完整概念。
简单来说,所有的 malloc 实现都由内核的内存管理方案支持。内核将整个系统内存视为固定大小(4k、8k 等)的页面,所有分配和释放都在页面上完成。所有内核实现都将存在一个内存管理子系统,它负责计算系统上发生的整个内存分配和释放。当您调用 malloc 时,它最终会到达此内存管理子系统,并从池中查找下一个可用的空闲页面并为请求进程分配。在将页面提供给请求者之前,他将确保将其标记为已使用,并且在您释放内存时以相同的方式将其添加回空闲池并取消标记已使用。关于内核如何有效地执行所有这些操作,存在如此多的实现(阅读 linux 中的内存管理器实现)
在常见的实现中,用户空间本身存在最小的内存管理器功能。用户空间进程本身维护一个空闲池,当 malloc 请求内存时,在进入内核之前,它会查看自己的空闲池是否有可用内存。如果可用,它将标记它并在没有内核帮助的情况下满足请求。同样,当您释放内存时,释放的内存块不会立即返回内核的空闲池,而是留在进程的空闲池中,以便下一个 malloc 可以使用它。
正如我在开头所说的,这是一个庞大而复杂的主题,您可以在互联网上找到大量关于此的文档。
关于c - malloc 如何知道当前的空闲内存位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19970846/