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

kin*_*er1 19 c linux mmap file

我有以下与处理文件和映射它们相关的问题(mmap):

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

请帮我回复所有问题.

非常感谢提前.

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

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

但我们知道使用文件意味着它肯定在主内存中,那么为什么线程需要再次进行mmaped?

Ton*_*ion 15

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

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

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

当您需要经常读取文件,并且此文件非常大时,将其映射到内存中是有利的,这样您就可以更快地访问它,然后每次都必须打开它并从磁盘中获取它.

编辑:

取决于你的需求,当你有一个需要非常频繁地被不同线程访问的文件时,我不确定内存映射文件一定是个好主意,从你需要的角度来看,你需要如果你希望它写入它,在不同线程的相同位置同步访问这个mmap的文件.如果这种情况经常发生,它可能是资源争用的一个地方.

只需从文件中读取,这可能是一个很好的解决方案,因为如果您只是从多个线程中读取它,则不需要同步访问.在开始编写的那一刻,你必须使用同步机制.

我建议,你有每个线程以线程本地方式进行自己的文件访问,如果你必须写入文件,就像你对任何其他文件一样.通过这种方式,它减少了线程同步的需要,并且很难找到和调试错误.

  • 这个答案是错误的。性能/写入磁盘方面与您想象的没有什么不同。 (2认同)

wil*_*ser 6

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

2)这与保护无关,而是与在页表条目中设置标志有关。

3)避免双缓冲。您还可以使用字符而不是块来寻址文件,这有时更实用

4) 这是您一直在使用的系统缓冲区(连接到您的地址空间)。系统可能已将部分内容写入磁盘,也可能未将其部分写入磁盘。

5) 如果线程属于同一进程并共享页表和地址空间,则可以。