代码之家  ›  专栏  ›  技术社区  ›  Nathan Kurz

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

  •  0
  • Nathan Kurz  · 技术社区  · 15 年前

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

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

    这是关于Linux上的内存和文件操作的一个比较深入的问题,尽管我很高兴听到在其他系统中如何做到这一点。我对那些需要提高复制效率的解决方法不是特别感兴趣,尽管一种需要重新映射但避免磁盘IO的技术将是一个好的开始。

    1 回复  |  直到 15 年前
        1
  •  2
  •   johnnycrash    15 年前

    在文件中嵌入一个简单的FAT。例如,文件的前4k将是一个FAT页面。数据将在以下几页。随着文件的增长,第一个胖页可以链接到其他胖页。fat中的每个条目都是一个数据页索引和下一个fat条目的索引。一个FAT条目将是FAT的页面和条目本身页面上的索引。我想你明白了。FAT条目是一个链接列表。胖页是一个链接列表。FAT条目链接数据页。这应该是足够的信息来使用 remap_file_pages()