我正在阅读 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
函数调用msync
与MS_SYNC
标志。当该系统调用返回时,系统已将修改写入底层文件,因此任何后续调用都read
将读取修改后的文件。
该COPY
选项将映射设置为MAP_PRIVATE
,因此您的更改永远不会写回文件,即使您使用msync
(通过该Flush
函数)。
- 1 回答
- 0 关注
- 229 浏览
添加回答
举报
0/150
提交
取消