如何换掉内存块?

时间:2010-03-25 17:33:15

标签: c++ c memory-management lazy-loading

如何创建malloc()或new分配的内存块:

  • 立即换掉了,
  • 或懒洋洋地初始化。

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

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

4 个答案:

答案 0 :(得分:3)

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

我不知道Windows如何解决所有这些问题,但请查看VirtualAlloc文档以了解它是否与其目的相关。如果它记录了Windows的malloc缓存其页面,那么你有答案,你应该使用VirtualAlloc。

答案 1 :(得分:2)

预留一大块地址空间:

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

在Windows上,VirtualAlloc()。

答案 2 :(得分:2)

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

我不知道在Linux或OS X上有什么办法。

答案 3 :(得分:1)

在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即可。它做你想要的。