Linux 在不复制数据的情况下将页面插入大mmap()文件

Linux 在不复制数据的情况下将页面插入大mmap()文件,linux,shared-memory,mmap,tlb,inode,Linux,Shared Memory,Mmap,Tlb,Inode,我想知道是否有办法在使用mmap()打开的大型(多GB)文件的开头插入空白页。显然,可以在末尾添加一两页,并使用memcpy()将所有内容向前移动,但这会弄脏每个页面,最终刷新到磁盘时需要很长时间 我猜解决方案需要在自定义文件系统和手动操作页表之间进行一些复杂的协调:向inode添加一个块,以某种方式更新VMM中的缓存页以反映这一点,然后以某种方式旋转页表以匹配。这听起来很平常,这让我想知道是否有更好的方法 这是关于Linux上内存和文件操作的一个有点深的问题,尽管我很高兴听到在其他系统中如何做

我想知道是否有办法在使用mmap()打开的大型(多GB)文件的开头插入空白页。显然,可以在末尾添加一两页,并使用memcpy()将所有内容向前移动,但这会弄脏每个页面,最终刷新到磁盘时需要很长时间

我猜解决方案需要在自定义文件系统和手动操作页表之间进行一些复杂的协调:向inode添加一个块,以某种方式更新VMM中的缓存页以反映这一点,然后以某种方式旋转页表以匹配。这听起来很平常,这让我想知道是否有更好的方法


这是关于Linux上内存和文件操作的一个有点深的问题,尽管我很高兴听到在其他系统中如何做到这一点。我对提高复制效率的变通方法并不特别感兴趣,尽管这项技术需要重新映射,但可以避免磁盘IO,这将是一个良好的开端。

在文件中嵌入一个简单的FAT。例如,文件的第一个4k将是FAT页面中的一个文件。数据将在以下页面中显示。随着文件的增长,第一个胖页面可以链接到其他胖页面。fat中的每个条目都是数据页索引和下一个fat条目的索引。FAT条目将是FAT的页面以及该页面上条目本身的索引。我想你明白了。FAT条目是一个链接列表。胖页面是一个链接列表。FAT条目链接数据页。这应该是足够的信息,可以用来使文件在内存中看起来是连续的,即使它在磁盘上不是连续的

我看到了很多拐弯处的情况——例如,文件句柄到该文件的偏移量会发生什么变化?其他进程中的文件句柄如何?在不知道您在做什么的情况下,这可能是一个愚蠢的建议,但是您能在mmap之前用X页填充物理文件吗?在第一页中保留一个索引/指针/位移,指向实际数据的起始位置,并根据需要进行更改。到处都有更多的工作要做,但你似乎愿意竭尽全力来完成这项工作。@Duck:我脑子里没有既定的目标。在处理全文搜索的大型倒排索引时,以及在寻找制作更好的B-树的方法时,我希望有这样的东西。从一个非常稀疏的文件开始是一个有趣的想法,但不能解决一般情况。@caf:我肯定会有问题,但它们不会让我担心。如果可以使其适用于多个mmap()实例,那么其余的问题似乎可以解决。我真正的希望是有人会吹嘘并说“ZFS的最新beta版支持此功能”或“mmap_insert_page()是在2.6.X中添加的”。@Nathan Kurz:知道了大量的bug、死角和毛茸茸的问题仅仅是由
ftruncate()
引起的,我倾向于怀疑类似的东西出现在主线内核中的前景。。。