Mmap 可以在某些方面为您提供帮助,我将通过一些假设示例进行解释:
第一件事:假设您的内存不足,并且您的应用程序拥有 100MB 的 malloc 内存块,其中 50% 被换出,这意味着操作系统必须将 50MB 写入交换文件,如果您需要读回它,你已经写入、占用然后再读回 50MB 的交换文件。
如果内存刚刚被映射,操作系统不会将该信息写入交换文件(因为它知道该数据与文件本身相同),相反,它只会刮掉 50MB 的信息(再次:假设你现在还没有写任何东西),就是这样。如果您需要再次读取该内存,操作系统将不会从交换文件中获取内容,而是从您映射的原始文件中获取内容,因此如果任何其他程序需要 50MB 的交换,它们是可用的。交换文件操作也没有任何开销。
假设你读取了一个 100MB 的数据块,根据最初的 1MB 头数据,你想要的信息位于偏移量 75MB,所以你不需要 1~74.9MB 之间的任何东西!您阅读它只是为了让您的代码更简单。使用 mmap,您将只读取您实际访问过的数据(四舍五入 4kb,或操作系统页面大小,大部分为 4kb),因此它只会读取第一个和第 75 个 MB。我认为很难找到一种比映射文件更简单有效的方法来避免磁盘读取。如果由于某种原因您需要偏移 37MB 的数据,您可以使用它!您不必再次对其进行 mmap,因为整个文件都可以在内存中访问(当然受您进程的内存空间的限制)。
所有mmap'ed的文件都是自己备份的,而不是swapfile,swapfile用于授予没有文件要备份的数据,通常是malloc'ed数据或由文件备份的数据, 但在程序通过 msync 调用实际告诉操作系统这样做之前,它已被更改并且 [不能/不应] 被写回它。
请注意,您不需要将整个文件映射到内存中,您可以从任何位置(第 6 个参数 - “off_t 偏移量”)开始映射任意数量(第二个参数是“size_t 长度”),但除非您的文件很可能要变得巨大,即使系统仅包含 64mb 的物理内存,您也可以安全地映射 1GB 的数据,但那是用于读取的,如果您打算写入,那么您应该更加保守,只映射您需要的东西.
映射文件将帮助您使您的代码更简单(您已经在内存中拥有文件内容,可以使用,由于它不是匿名内存,因此内存开销要少得多)并且更快(您将只读取程序访问的数据)。