如何换出内存块?
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
的默认行为已经是惰性的了。并不是页面一开始就被换掉了,而是它们甚至一开始就没有。
如果您已处理完某个区域中的数据,您可以将madvise
与MADV_FREE
结合使用。这告诉内核它可以释放相关页面而不是将它们换出。这些页面仍然有效,一旦您向它们写信,它们就会变回正常页面。这有点像先调用free
,然后再调用malloc
。
总结:只需使用malloc
。它做你想做的事。
【讨论】:
以上是关于如何换出内存块?的主要内容,如果未能解决你的问题,请参考以下文章
:内存管理 -- 虚拟内存的实现:请求分页管理方式页面置换算法(决定应该换入哪页换出哪页:OPT先进先出最近最久未使用时钟)