mmap()如何帮助读取特定偏移量与常规Posix I / O

时间:2016-12-09 23:25:36

标签: mmap

我正在尝试更好地了解mmap。我最近在相关的stackoverflow问题中引用了这部分接受的答案(引用如下):mmap and memory usage

  

假设你读了一个100MB的数据块,并根据最初的数据   1MB的标题数据,您想要的信息位于偏移量   75MB,所以你不需要1~74.9MB之间的任何东西!你已经读过了   除了让你的代码更简单。使用mmap,您将只有   读取您实际访问的数据(四舍五入或OS页面   大小,大多是4kb),所以它只会读取第一个和   第75 MB。

我理解mmap的大部分好处(不需要上下文切换,不需要交换内容等),但我不太明白这个偏移。如果我们没有mmap并且我们需要第75 MB偏移量的信息,那么我们不能使用标准POSIX文件I / O调用而不必使用mmap吗?为什么mmap对此有帮助?

1 个答案:

答案 0 :(得分:0)

当然可以。您始终可以打开文件并只阅读所需的部分。

当您不想编写所述代码或者您需要对内容进行稀疏访问并且不想编写一堆缓存逻辑时,

mmap()可以很方便。

使用mmap(),您将文件的整个竞赛“映射”到内存中的偏移量。 mmap()的大多数实现都是懒惰地执行此操作,因此当您访问这些内存位置时,按需读取文件的每个~4K块。

您所要做的就是访问文件中的数据,就像它是一个巨大的字符数组(即int* someInt = &map[750000000]; return *someInt;),并让操作系统担心文件的哪些部分已被读取,何时读取文件,多少,将脏数据块写回文件,以及清除内存以释放RAM。