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

我正在阅读 golang 的内存映射文件实现之一,https://github.com/edsrzf/mmap-go/。首先他描述了几种访问模式:


// 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

但是在 gommap 测试文件中我看到了这个:


func TestReadWrite(t *testing.T) {

  mmap, err := Map(f, RDWR, 0)

  ... omitted for brevity...

  mmap[9] = 'X'

  mmap.Flush()

那么,如果访问方式是RDWR,他为什么需要调用Flush来确保内容写入文件呢?


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


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


UYOU
浏览 230回答 1
1回答

慕哥6287543

该程序使用 映射内存区域mmap。然后修改映射区域。系统不需要立即将这些修改写回底层文件,因此read对该文件的调用 (in&nbsp;ioutil.ReadAll) 可以返回文件的先前内容。系统会在您进行更改后的某个时刻将更改写入文件。它允许在做出修改之后的任何时间将更改写入文件,但默认情况下使有关,当它写这些变化没有保证。您所知道的是(除非系统崩溃),更改将在将来的某个时间写入。如果您需要保证更改已在某个时间点写入文件,则必须调用msync.该mmap.Flush函数调用msync与MS_SYNC标志。当该系统调用返回时,系统已将修改写入底层文件,因此任何后续调用都read将读取修改后的文件。该COPY选项将映射设置为MAP_PRIVATE,因此您的更改永远不会写回文件,即使您使用msync(通过该Flush函数)。阅读关于POSIX文件mmap和msync完整的细节。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go