Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
linux是否为单独的mmap()调用提供数据结构/抽象?_Linux_Memory Management_Linux Kernel_Mmap - Fatal编程技术网

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);
    
我已经找到了一个相关问题的早期答案:哪个国家

在地址空间(mm_struct)中创建/放大(我的重点)vma结构

但另一方面,

所以每次都应该分配尽可能大的内存。(避免多次使用小型mmap)


--但没有正确解释后一种说法。

在普通笔记本电脑上运行的Linux上,可以有数十万(或者几百万)个
mmap
-ed段

我的程序说明了这一点。它(在运行时)为某个函数重复生成一些C代码(在某个新文件中),将其编译成共享对象,然后
dlopen
共享对象。我可以运行50万次
,所以
(运行大约50小时);每次打电话都会做一些事情

您可以阅读代码,调整,然后运行my
manydl
几个小时,然后在运行时执行
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)内核开发人员认为我的用例不存在:(