c - 使用结构池正确处理内存

标签 c memory memory-management pool

我有一个包含三个结构池的程序。对于它们中的每一个,我使用一个已用结构列表和另一个未使用结构列表。在执行过程中,程序会消耗结构,并按需将它们返回到池中。此外,还有一个垃圾收集器来清理“僵尸”结构并将它们返回到池中。

在执行开始时,正如预期的那样,虚拟内存显示分配了大约 10GB* 的内存,并且随着程序使用池,RSS 内存增加。

虽然使用过的节点回到池中,标记为未使用的节点,但 RSS 内存并没有减少。我预料到了这一点,因为操作系统不知道我对内存做了什么,无法注意到我是在真正使用它们还是在管理池。

我想做的是在我想要的时候强制未使用的内存返回到虚拟内存,例如,当 RSS 内存增加到 X GB 以上时。

有没有办法在给定内存指针的情况下标记一 block 内存区域,将其放入虚拟内存中?我知道这是操作系统的责任,但也许有办法强制执行。

也许我不应该关心这个,你怎么看?

提前致谢。

  • 注意 1:此程序用于高性能计算,这就是它使用此内存量的原因。

我提供了几个文件的池使用情况与内存使用情况的图片。如您所见,池使用率的突然下降是由于垃圾收集器造成的,我希望看到这种下降是否反射(reflect)在内存使用率上。

Struct Pools Usage & Memory Usage

最佳答案

只要您通过 mmap 而不是通过 malloc 分配内存,就可以这样做。你想使用 madvise带有 POSIX_MADV_DONTNEED 参数的函数。

请记住在再次使用它们之前使用 POSIX_MADV_WILLNEED 运行 madvise 以确保它们背后确实有内存。

这实际上并不能保证页面会被换出,但会在有时间时给内核一个强烈的提示来换出。

关于c - 使用结构池正确处理内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24861791/

相关文章:

c - 为什么ssh登录时会调用两次pam_sm_authenticate?

memory - 为什么将内存区域标记为非缓存?

c - 根据长度崩溃对静态数组中的字符串进行排序? |错误分配/访问|

javascript - 对象引用会占用额外的内存吗?

c - 这个生产者-消费者实现中是否存在竞争条件?

c - 死 C 变量

代码优化,C 代码不响应缓存阻塞

C++ 为什么我会得到成员的意外零初始化?

python - Scrapy 隐藏的内存泄漏

ios - 与 Deinit 和内存泄漏混淆