为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
UYOU 2021-06-30 13:15:02
我正在阅读 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?
查看完整描述

1 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

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

系统在您进行更改后的某个时刻更改写入文件。它允许在做出修改之后的任何时间将更改写入文件,但默认情况下使有关,当它写这些变化没有保证。您所知道的是(除非系统崩溃),更改将在将来的某个时间写入。

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

mmap.Flush函数调用msyncMS_SYNC标志。当该系统调用返回时,系统已将修改写入底层文件,因此任何后续调用都read将读取修改后的文件。

COPY选项将映射设置为MAP_PRIVATE,因此您的更改永远不会写回文件,即使您使用msync(通过该Flush函数)。

阅读关于POSIX文件mmapmsync完整的细节。


查看完整回答
反对 回复 2021-07-12
  • 1 回答
  • 0 关注
  • 229 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信