【问题标题】:How does mmap() help read information at a specific offset versus regular Posix I/Ommap() 与常规 Posix I/O 相比如何帮助读取特定偏移量的信息
【发布时间】:2016-12-09 23:25:35
【问题描述】:

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

假设您读取了 100MB 的数据块,并根据初始 1MB的头数据,你要的信息位于offset 75MB,所以你不需要 1~74.9MB 之间的任何东西!你已经读过了 只是为了让你的代码更简单。使用 mmap,您只会 读取您实际访问过的数据(四舍五入 4kb,或操作系统页面 大小,主要是 4kb),所以它只会读取第一个和 第 75 MB。

我了解 mmap 的大部分好处(不需要上下文切换、不需要交换内容等),但我不太了解这个偏移量。如果我们不使用 mmap 并且我们需要第 75 MB 偏移处的信息,那么我们不能使用标准 POSIX 文件 I/O 调用而不使用 mmap 来做到这一点吗?为什么 mmap 在这里正好有帮助?

【问题讨论】:

  • mmap() 往往是一个被高估的解决方案。阅读 Linus Torvalds 本人的 this post,这是对有人抱怨 mmap() 访问数据所花费的时间是简单使用 read() 的三倍的回应。

标签: mmap


【解决方案1】:

当然可以。您始终可以打开文件并仅读取您需要的部分。

mmap() 当您不想编写上述代码或者您需要对内容进行稀疏访问并且不想编写一堆缓存逻辑时会很方便。

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

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

【讨论】:

    猜你喜欢
    • 2012-04-23
    • 2015-12-20
    • 2011-03-14
    • 2021-07-08
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多