亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當訪問是 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 關注
  • 259 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號