繁体   English   中英

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

[英]What is the difference between writing to a file and a mapped memory?

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

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

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

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

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

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

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

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

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

编辑:

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

只是从文件读取,那么这可能是一个很好的解决方案,因为如果您只是从多个线程读取文件,则实际上不需要同步访问。 开始写作的那一刻,您必须使用同步机制。

我建议,如果必须像写入任何其他文件一样对每个文件进行写操作,则让每个线程都以线程本地方式执行它自己的文件访问。 这样,它减少了对线程同步的需求,并减少了难以发现和调试的错误的可能性。

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

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

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

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

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

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

  2. 不,我要说的是保护。

  3. 它可能会将数据的一两个副本从应用程序缓冲区保存到libc缓冲区再保存到OS缓冲区,请参见第1点。这可能会在写入大量数据时造成性能差异。

  4. 据我所知,只要调用该内存区域上的msyncmunmap后,该数据已被写入磁盘,操作系统就可以在任意时间随意写入数据。 (对于大多数文件,出于性能原因,大多数时间之间可能不会写入任何内容:将整个块写入磁盘是因为更改了一个字节非常昂贵,尤其是在预期会有更多修改的情况下)区块将在不久的将来发生。)

在大多数情况下,应将内存映射文件视为要使用的内存。 您应该只关心特殊情况,例如与光盘同步。 它与内存的存储方式相同,但是可以在需要时从文件初始化并存储到文件中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM