【发布时间】: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