我有一组文件,其长度都是我的操作系统(FreeBSD 10)的页面大小的倍数。我想将mmap()
这些文件放到 RAM 的连续页面中,让我能够将文件集合视为一个大型数据数组。
最好使用可移植函数,我怎样才能找到足够大的未映射地址空间区域,以便我可以确定mmap()
对该区域的一系列调用会成功?
我有一组文件,其长度都是我的操作系统(FreeBSD 10)的页面大小的倍数。我想将mmap()
这些文件放到 RAM 的连续页面中,让我能够将文件集合视为一个大型数据数组。
最好使用可移植函数,我怎样才能找到足够大的未映射地址空间区域,以便我可以确定mmap()
对该区域的一系列调用会成功?
按着这些次序:
mmap
。如果这失败了,你就输了。unmap
区域(实际上,如果您的系统具有固定地址隐式取消映射任何先前的重叠区域,unmap
则可能没有必要)。mmap
MAP_FIXED
使用适当的标志映射此地址的第一个文件。这应该可以完全移植到任何 POSIX 系统,但某些操作系统可能有阻止这种方法的怪癖。试试看。
您可以mmap
使用一个大区域,其中大小是所有文件大小的总和,使用MAP_PRIVATE | MAP_ANON
和保护PROT_NONE
这将防止操作系统不必要地提交内存费用。
这将保留但不提交内存。
然后,您可以在打开文件并filename1
在[baseAddr, size1)
打开filename2
,[baseAddr + size1, baseAddr + size1 + size2)
依此类推。
我相信这方面的标志是MAP_FIXED | MAP_PRIVATE
.