【问题标题】:When should a free() implementation give memory back to the OS?free() 何时应该将内存还给操作系统?
【发布时间】:2021-04-05 13:31:58
【问题描述】:

我正在为一个大学项目编写一个简单的 malloc 实现。其中一项任务是有时将释放的内存归还给操作系统(给出的示例是一个进程在一段时间内使用了 1GB malloc-ed 内存,之后它只使用 100MB 内存直到它终止),但是我不是确定如何实现这一点。我正在考虑定期检查进程分配的内存量和释放量,如果可能的话,将一些释放的页面还给操作系统,但我不确定这是否是一种有效的方法。

编辑:我第一次写这篇文章时并没有意识到,但我的措辞方式太模糊了。我所说的“未使用的内存”是指释放的内存。

【问题讨论】:

  • 你不能总是把它还回去。如果您要求一个 1GB 的平板并使用了 any,那么您将无法使用它。这就是内存碎片成为问题的地方。话虽这么说,如果您要求 1GB 并且只使用 100MB,那么操作系统知道这一点并且可能实际上并没有实际分配其余的本身,它只是保留,因为虚拟内存在这里发挥作用。您可以“还给它”,但我不确定操作系统是否真的关心它是否是精简配置的。这当然取决于您使用的操作系统以及它如何处理虚拟内存。
  • @KamilCuk 我没有想太多,但我想到了某种由第一次 malloc 调用触发并每 x 秒重新调用一次的函数。该函数可以查看每个块的元数据以查看其是否已使用\未使用。
  • @KamilCuk 我在 malloc 实现中用于跟踪块的元数据。我想我的问题在翻译中有点迷失了,我的意思是释放了未使用的内存。
  • 既然你必须实现你的自定义malloc,我假设你也必须实现你的自定义free。那么,当free 代表完美的异步钩子时,为什么还要为同步检查而烦恼呢?每当调用free 时,检查已使用的内存量,如果有可以释放的东西(无论您的标准是什么),就释放它。
  • “我正在考虑定期检查内存量” - 您不会定期执行此操作,但是当发生分配操作 (free) 时。而且,您可能会在检测到这样的块空闲时返回一个块,而不是扫描堆。当然也有变化。

标签: c memory-management malloc free


【解决方案1】:

向操作系统请求内存或将其返回是(相对)昂贵的操作,因为它们需要上下文切换用户/内核并返回。出于这个原因,在大多数实现中,malloc 调用只要求大块并在内部从这些块中分配,并使用 空闲块列表 管理释放的内存。在这种情况下,它只会在空闲列表中存在完整块时将内存返回给操作系统。

对于自定义实现,将内存返回给系统的规则取决于程序员(您...)。

【讨论】:

    猜你喜欢
    • 2015-03-12
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2016-07-12
    • 2014-04-21
    • 2016-08-06
    相关资源
    最近更新 更多