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