我有以下与文件处理和映射有关的问题(mmap
:]
mmap
将文件映射到内存,然后写入?mmap
-PROT_NONE
,PROT_READ
,PROT_WRITE
,则使用文件也可以实现相同级别的保护。 O_RDONLY
,O_RDWR
等。为什么要mmap
?mmap
存入内存,如果我们写入mmap返回的内存位置,它是否也同时写入该文件?据我所知,如果我们在两个线程之间共享一个文件(而不是进程),则建议将其mmap
存入内存,然后使用它,而不是直接使用该文件。
但是我们知道使用文件意味着它肯定在主内存中,然后为什么又需要映射线程?
内存映射文件实际上部分或全部映射到内存(RAM)中,而您写入的文件将被写入内存,然后刷新到磁盘。从磁盘获取内存映射文件,并将其显式放置到内存中以进行读取和/或写入。它会一直保留在那里,直到您取消映射为止。
对磁盘的访问速度较慢,因此,当您将文件写入文件后,它将被刷新到磁盘并且不再驻留在RAM中,这意味着,下次需要该文件时,可能会从该文件中获取文件。磁盘(慢),而在内存映射文件中,您知道该文件在RAM中,因此与在磁盘上相比,可以更快地访问它。
而且,内存映射文件通常用作IPC机制,因此两个或多个进程可以轻松共享同一文件并对其进行读/写操作。 (使用必要的sycnh机制)
[当您需要经常读取一个文件并且该文件很大时,将其映射到内存中可能是有利的,这样您可以更快地访问它,而不必每次都打开它并从磁盘上获取它。
编辑:
这取决于,根据您的需要,当您有一个文件需要由不同线程非常频繁地访问时,那么从视图的角度来看,我不确定映射该文件的内存一定是一个好主意那,如果您希望将这个映射文件写入文件,则需要在不同线程的相同位置同步访问该文件。如果这种情况经常发生,则可能是资源争用的场所。
仅从文件中读取,那么这可能是一个很好的解决方案,因为如果要从多个线程中读取文件,则实际上不需要同步访问。开始写作的那一刻,您必须使用同步机制。我建议您像必须处理其他任何文件一样,让每个线程都以线程本地方式执行它自己的文件访问。这样,它减少了对线程同步的需求,并减少了难以发现和调试的错误的可能性。
mmap
将保存至少一个数据副本,因为OS可以直接将缓冲区写入磁盘。只要仅关于文件写入,我(还)无法想象您想要使用mmap
的其他原因。