如何创建malloc()或new分配的内存块:
事实上,我正在尝试保留一个地址空间。如何做到这一点?
PS。如何从用户空间验证是否换出了内存块?
答案 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
的默认行为已经很懒惰了。并不是说页面被换掉了,而是它们甚至不是从那里开始的。
如果您已完成某个地区的数据,则可以将madvise
与MADV_FREE
一起使用。这告诉内核它可以释放相关页面而不是交换它们。这些页面仍然有效,一旦您写入它们,它们就会转回普通页面。这有点像调用free
然后调用malloc
。
摘要:只需使用malloc
即可。它做你想要的。