我正在閱讀 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 關注
- 259 瀏覽
添加回答
舉報
0/150
提交
取消