【问题标题】:How malloc knows the present free memory locationsmalloc 如何知道当前的空闲内存位置
【发布时间】:2013-11-27 01:28:42
【问题描述】:

malloc 实际上是如何获得微控制器中当前可用的可用内存空间的。 它是否在运行时连续保留未分配区域的列表? 如果代码中有两条malloc语句,如何获取上一次malloc分配内存分配的信息

如何在运行时知道哪些内存是空闲的,哪些不是。在编译时,我们可以知道编译器为变量分配了 RAM 中的哪些位置。 malloc 是否使用此信息来执行此操作。

【问题讨论】:

  • 视情况而定。并非所有的实现都是一样的。
  • 尝试阅读这篇文章:stackoverflow.com/q/5422061/10077
  • 我是这个领域的新手,所以如果我的问题是错误的,请原谅。实际上,在需要的内存量可能仅在运行时才知道的情况下。所以当需要内存时“搜索一个足够大的块来满足请求”。如何在运行时知道哪些内存是空闲的,哪些不是。在编译时,我们可以知道编译器为变量分配了 RAM 中的哪些位置。 malloc 是否使用此信息来执行此操作。如果问题无法理解,我的英语很差,请告诉我。
  • 为什么你需要知道这个?你明白没有唯一的答案吗?
  • 所以阅读 malloc 实现的代码,周围有很多。

标签: c memory-management embedded microcontroller


【解决方案1】:

正如上面的评论员所说,malloc 有多种实现,并且每种实现的算法可能会有很大差异。这是一个庞大而复杂的领域,您应该阅读内存管理以全面了解该主题。

简单来说,所有 malloc 实现都由内核的内存管理方案支持。内核将整个系统内存视为固定大小(4k、8k 等)的页面,所有分配和释放都在页面上完成。所有内核实现都会有一个内存管理子系统,它负责计算系统上发生的整个内存分配和释放。当你调用 malloc 时,它最终会到达这个内存管理子系统,并从池中寻找下一个可用的空闲页面并分配给请求进程。在将页面提供给请求者之前,他会确保将其标记为已使用,并且在您释放内存时会将其添加回空闲池并取消标记为已使用。关于内核如何有效地完成所有这些方面存在很多实现(阅读 linux 中的内存管理器实现)

在常见的实现中,用户空间本身存在最小的内存管理器功能。用户空间进程本身维护一个空闲池,当 malloc 请求内存时,在进入内核之前,如果内存可用,它将查看自己的空闲池。如果可用,它将标记它并在没有内核帮助的情况下满足请求。同样,当您释放内存时,释放的内存块不会立即返回内核的空闲池,而是留在进程的空闲池中,以便下一个 malloc 可以使用它。

正如我一开始所说,这是一个庞大而复杂的话题,您可以在互联网上找到很多关于此的文档。

【讨论】:

    猜你喜欢
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2014-03-14
    • 1970-01-01
    • 2016-06-16
    • 2021-05-08
    相关资源
    最近更新 更多