Go 当访问是RDWR时,为什么需要刷新内存映射文件?

Go 当访问是RDWR时,为什么需要刷新内存映射文件?,go,mmap,memory-mapped-files,Go,Mmap,Memory Mapped Files,我正在阅读golang的一个内存映射文件实现。首先,他描述了几种访问模式: // RDONLY maps the memory read-only. // Attempts to write to the MMap object will result in undefined behavior. RDONLY = 0 // RDWR maps the memory as read-write. Writes to the MMap object will update the // under

我正在阅读golang的一个内存映射文件实现。首先,他描述了几种访问模式:

// RDONLY maps the memory read-only.
// Attempts to write to the MMap object will result in undefined behavior.
RDONLY = 0
// RDWR maps the memory as read-write. Writes to the MMap object will update the
// underlying file.
RDWR = 1 << iota
// COPY maps the memory as copy-on-write. Writes to the MMap object will affect
// memory, but the underlying file will remain unchanged.
COPY
那么,如果访问模式是RDWR,为什么他需要调用Flush来确保内容写入文件

或者是操作系统管理它,所以它只在它认为应该的时候才写

如果是最后一个选项,请您详细解释一下-我读到的是,当操作系统内存不足时,它会写入文件并释放内存。这是否正确?它是仅适用于RDWR还是仅适用于复制


谢谢

程序使用
mmap
映射内存区域。然后修改映射区域。系统不需要立即将这些修改写回基础文件,因此对该文件的
read
调用(在
ioutil.ReadAll
中)可以返回该文件先前的内容

系统将在您进行更改后的某个时间将更改写入文件。 允许在进行更改后的任何时间将更改写入文件,但默认情况下,不保证写入这些更改的时间。您所知道的是(除非系统崩溃),更改将在将来的某个时候写入

如果您需要保证更改已在某个时间点写入文件,则必须调用
msync

mmap.Flush
函数使用
MS\u SYNC
标志调用
msync
。当该系统调用返回时,系统已将修改写入基础文件,因此对
read
的任何后续调用都将读取修改后的文件

COPY
选项将映射设置为
MAP\u PRIVATE
,因此即使使用
msync
(通过
Flush
功能),您的更改也不会被写回文件


阅读POSIX文档了解和的全部详细信息。

谢谢,因此RDWR标志并不意味着将立即写入。系统是否仅在调用mysync或munmap时写入文件?“RDWR-写入MMap对象将更新基础文件。”似乎意味着在将来的某个时候,即使用户不调用msync或munmap,也会写入这些更改。。基本上你能评论一下问题的最后两段吗?谢谢@索菲亚:写操作通常是“懒惰”的,尽管实际上,由于统一的虚拟内存系统,写操作在大多数情况下是“即时的”(但这并不是保证的)。即使数据没有写入磁盘,后续的读取操作通常仍然会从缓冲区缓存中提取正确的数据——但是,您不知道,这并不能保证。需要这种保证且需要可移植(即不依赖于系统实现)的程序必须刷新才能确保。如果我在循环中一次写入100字节,最高可达1KB,它能在中途刷新吗?或者,是否有任何保证,它将等待所有1KB完成,并最终在某个时间点写入磁盘?系统可以在中途刷新您的写入。
func TestReadWrite(t *testing.T) {
  mmap, err := Map(f, RDWR, 0)
  ... omitted for brevity...
  mmap[9] = 'X'
  mmap.Flush()