linux是否为单独的mmap()调用提供数据结构/抽象?
我想使用大量(数千)单独的linux是否为单独的mmap()调用提供数据结构/抽象?,linux,memory-management,linux-kernel,mmap,Linux,Memory Management,Linux Kernel,Mmap,我想使用大量(数千)单独的mmap()调用将文件映射到内存,因为我想将相邻(文件中)页映射到稀疏逻辑地址: // actual addresses/sizes are page size aligned; 1000/10 for example mmap(1000, 10, access, flags, file, 0); mmap(2000, 10, access, flags, file, 10); mmap(3000, 10, access, flags, file, 20); ...
mmap()
调用将文件映射到内存,因为我想将相邻(文件中)页映射到稀疏逻辑地址:
// actual addresses/sizes are page size aligned; 1000/10 for example
mmap(1000, 10, access, flags, file, 0);
mmap(2000, 10, access, flags, file, 10);
mmap(3000, 10, access, flags, file, 20);
...
问题:这会导致性能问题或内存开销吗。Elinux是否在内核内存中为每个mmap()
-ing创建了一些数据结构,这些调用中的一个只是更新公共(每个进程)数据结构,即。E单独通话的次数无关紧要
我不担心通话本身的费用(当然,打一个电话比打几千个电话要快),从长远来看,这只是可能的惩罚
此外,如果:
- mmaped文件区域是连续的(如上面的示例所示)
- 逻辑地址是连续的,即。Elinux能像以前一样处理mmaping吗
尽可能有效地addr=mmap(0,页面大小,访问,标志,文件,0); mmap(地址+页面大小、页面大小、访问、标志、文件、页面大小);
addr=mmap(0,2*页面大小、访问、标志、文件,0);
--但没有正确解释后一种说法。在普通笔记本电脑上运行的Linux上,可以有数十万(或者几百万)个
mmap
-ed段
我的程序说明了这一点。它(在运行时)为某个函数重复生成一些C代码(在某个新文件中),将其编译成共享对象,然后dlopen
共享对象。我可以运行50万次,所以(运行大约50小时);每次打电话都会做一些事情
您可以阅读代码,调整,然后运行mymanydl
几个小时,然后在运行时执行cat/proc/$(pidof manydl)/maps
请注意,mmap
是按页面工作的(通常每个页面有4个字节)。因此,您应该在4KB的倍数上使用它
我假设内核正在为每个mmap-ed段创建一些结构,但是它能够处理很多结构。当然有一些开销,但我想它足够小了
我建议平均每段至少有几页
所以你可以有许多mmap
-ed段(至少50万左右)小的(例如,平均12千字节)大小,只要它们能装在RAM中(你想避免),例如一台有8或16GB RAM的笔记本电脑。每个mmap()
创建一个新的段?您没有定义什么是适合您的段。对我来说,(根据我的定义)这是一个成功的mmap
的效果;事实上,还有很多环节。您应该阅读源代码并尝试我的manydl.c
,然后我的定义(片段是mmap
的效果)与您的兼容。唯一的非mmap
-ed片段是在execve
时间出现的片段,众所周知,execve
有点像mmap
-ing,请阅读此处的讨论。似乎您正在尝试执行在remap_file_pages()中所做的操作。@AndyShevchenko似乎1)许多mmap确实有开销(单独的VMA)2)内核开发人员认为我的用例不存在:(