写文件和映射的内存有什么区别?

问题描述 投票:19回答:4

我有以下与文件处理和映射有关的问题(mmap:]

  1. 我们知道,如果我们创建一个文件并写入该文件,那么无论哪种方式我们都将写入内存。那么,为什么使用mmap将文件映射到内存,然后写入?
  2. [如果由于保护而我们使用mmap-PROT_NONEPROT_READPROT_WRITE,则使用文件也可以实现相同级别的保护。 O_RDONLYO_RDWR等。为什么要mmap
  3. 我们将文件映射到内存,然后使用它有什么特别的优势?不仅仅是创建文件并写入文件?
  4. 最后,假设我们将文件mmap存入内存,如果我们写入mmap返回的内存位置,它是否也同时写入该文件?

编辑:在线程之间共享文件

据我所知,如果我们在两个线程之间共享一个文件(而不是进程),则建议将其mmap存入内存,然后使用它,而不是直接使用该文件。

但是我们知道使用文件意味着它肯定在主内存中,然后为什么又需要映射线程?

c linux file mmap
4个回答
16
投票

内存映射文件实际上部分或全部映射到内存(RAM)中,而您写入的文件将被写入内存,然后刷新到磁盘。从磁盘获取内存映射文件,并将其显式放置到内存中以进行读取和/或写入。它会一直保留在那里,直到您取消映射为止。

对磁盘的访问速度较慢,因此,当您将文件写入文件后,它将被刷新到磁盘并且不再驻留在RAM中,这意味着,下次需要该文件时,可能会从该文件中获取文件。磁盘(慢),而在内存映射文件中,您知道该文件在RAM中,因此与在磁盘上相比,可以更快地访问它。

而且,内存映射文件通常用作IPC机制,因此两个或多个进程可以轻松共享同一文件并对其进行读/写操作。 (使用必要的sycnh机制)

[当您需要经常读取一个文件并且该文件很大时,将其映射到内存中可能是有利的,这样您可以更快地访问它,而不必每次都打开它并从磁盘上获取它。

编辑:

取决于,根据您的需要,当您有一个文件需要由不同线程非常频繁地访问时,那么从视图的角度来看,我不确定映射该文件的内存一定是一个好主意那,如果您希望将这个映射文件写入文件,则需要在不同线程的相同位置同步访问该文件。如果这种情况经常发生,则可能是资源争用的场所。

仅从文件中读取,那么这可能是一个很好的解决方案,因为如果要从多个线程中读取文件,则实际上不需要同步访问。开始写作的那一刻,您必须使用同步机制。我建议您像必须处理其他任何文件一样,让每个线程都以线程本地方式执行它自己的文件访问。这样,它减少了对线程同步的需求,并减少了难以发现和调试的错误的可能性。


2
投票
1)您误解了write(2)系统调用。 write()不写,它只是将缓冲区内容复制到OS缓冲区链并将其标记为脏。操作系统线程之一(bdflush IIRC)将选择这些缓冲区,将它们写入磁盘并用一些标志来摆弄。后来。使用mmap,您可以直接访问OS缓冲区(但是,如果更改了它的内容,它也将被标记为脏)

1
投票
  1. 一个原因可能是您已设置(遗留)代码以写入数据缓冲区,然后将该缓冲区最后一次写入文件。在这种情况下,使用mmap将保存至少一个数据副本,因为OS可以直接将缓冲区写入磁盘。只要仅关于文件写入,我(还)无法想象您想要使用mmap的其他原因。

0
投票
[在大多数情况下,您应该将内存映射文件视为要使用的内存。您应该只关心特殊情况,例如与光盘同步。它与内存的存储方式相同,但是可以根据需要从文件初始化并在需要时存储到文件中。
© www.soinside.com 2019 - 2024. All rights reserved.