如何换出内存块?

Posted

技术标签:

【中文标题】如何换出内存块?【英文标题】:How to swap out a memory block? 【发布时间】:2010-03-25 17:33:15 【问题描述】:

如何通过 malloc() 或 new 分配一块内存:

立即换掉, 或延迟初始化。

事实上,我正在尝试保留一个地址空间。如何做到这一点?

PS。如何从用户空间验证内存块是否被换出?

【问题讨论】:

你能解释一下你想要做的更多吗? malloc() 没有初始化任何东西,是吗? 【参考方案1】:

malloc 通常是使用 mmap 实现的,所以如果你使用 malloc,无论如何你都会得到你想要的行为。毕竟,当不能保证新页面会立即初始化时,为什么还要分配内存强制其他页面退出缓存呢?我知道 Open BSD 以这种方式实现 malloc,如果您的分配大于某个限制,则 GNU 的 C lib 使用 mmap。我想只有几页。

我不知道 Windows 是如何处理这一切的,但请查看 VirtualAlloc 文档,看看它是否具体说明了它的用途。如果它记录了 Windows 的 malloc 缓存了它的页面,那么你就有答案了,你应该使用 VirtualAlloc。

【讨论】:

VirtualAlloc 自动清零内存。我希望这意味着它必须加载它才能写入它。我尝试了 VirtualAlloc(NULL, 1024*1024, [combinations of commit and reserve], [large pages on or off]) 并且从未收到我可以分配的内存。我已经看到明确指出 VirtualAlloc 不应用于一般用途内存的文档....当我在 Visual Studio 中执行 malloc 时,进程的物理内存和虚拟内存都使用了。物理内存没有按我要求的完整演出增加,但非常接近。您可能需要在 windows 中找到不同的选项。【参考方案2】:

保留一块地址空间:

在 unix 上,sbrk() 或 mmap()。

在 Windows 上,VirtualAlloc()。

【讨论】:

【参考方案3】:

在 Windows 上,您可以使用 VirtualAlloc 函数执行此操作。

我不知道有什么方法可以在 Linux 或 OS X 上做到这一点。

【讨论】:

【参考方案4】:

在 Linux、BSD 或 OS X 上,使用 malloc。我认为 FreeBSD 上流行的“jemalloc”实现为每个 1 MiB 或更大的区域使用专用的mmap。较小的区域仍然由mmap 支持,因此它们仍然提供大部分相同的行为,但是当您free 时,较小的区域不会自动取消映射它们。我认为。在 Linux 上使用的 glibc“dlmalloc”实现也使用专用的 mmap 分配至少 1 MiB,但我认为它使用 sbrk 分配较小的区域。 Mac OS X 的 malloc 也使用mmap,但我不确定具体参数。

从大的malloc 获得的指针将指向 RAM 中填充零字节的共享页面。一旦您写入该区域中的页面,就会分配物理 RAM 中的新页面并用零字节填充。所以你看,malloc 的默认行为已经是惰性的了。并不是页面一开始就被换掉了,而是它们甚至一开始就没有。

如果您已处理完某个区域中的数据,您可以将madviseMADV_FREE 结合使用。这告诉内核它可以释放相关页面而不是将它们换出。这些页面仍然有效,一旦您向它们写信,它们就会变回正常页面。这有点像先调用free,然后再调用malloc

总结:只需使用malloc。它做你想做的事。

【讨论】:

以上是关于如何换出内存块?的主要内容,如果未能解决你的问题,请参考以下文章

页面分配策略

21.内存换出

操作系统内存换出---15

我可以告诉 Windows 不要换出特定进程的内存吗?

操作系统-内存换出

:内存管理 -- 虚拟内存的实现:请求分页管理方式页面置换算法(决定应该换入哪页换出哪页:OPT先进先出最近最久未使用时钟)