簡體   English   中英

Windows 中同一個內存映射文件的兩個視圖,它們如何以刷新方式交互?

[英]Two views of a same memory mapped file in windows, how do they interact flush-wise?

我對沖洗行為特別感興趣。

假設我們使用 CreateFileMapping() 創建了一個 MMF,並使用 MapViewOfFile() 以零偏移打開了兩個視圖,V1 和 V2。

然后我向 A=V1+a 和 B=V2+b 寫一些東西,這樣 A 和 B 屬於不同的物理內存頁面。

那么如果我使用 FlushViewOfFile(V1, 0) 刷新整個第一個視圖,第二個視圖的臟頁也會受到影響嗎?

我的目標是擁有同一個文件的 2 個視圖,其中第一個視圖用於非常小的寫入和非常頻繁的刷新,而第二個視圖用於大量寫入並且只偶爾刷新一次。

刷新小寫入不會導致大量寫入刷新,這一點很重要。

這是默認行為嗎? 如果沒有,如何實現?

謝謝

CreateFileMappingA ,另見CreateProcessDuplicateHandleOpenFileMapping函數。

“創建文件映射對象實際上並沒有將視圖映射到進程地址空間。MapViewOfFileMapViewOfFileEx函數將文件視圖映射到進程地址空間。除了一個重要的例外,文件視圖派生自任何文件映射對象由同一文件支持的在特定時間是一致的或相同的保證進程內的視圖和不同進程映射的視圖的一致性。例外與遠程文件有關。雖然 CreateFileMapping 可用於遠程文件,但它不保持它們的一致性。例如,如果兩台計算機都將一個文件映射為可寫,並且都更改了相同的頁面,那么每台計算機只能看到自己對頁面的寫入。當磁盤上的數據更新時,它不會合並。”

根據FlushViewOfFile

“刷新映射視圖的范圍會啟動將該范圍內的臟頁寫入磁盤。臟頁是自映射文件視圖后內容已更改的頁。FlushViewOfFile函數不會刷新文件元數據,也不會等待返回直到更改從底層硬件磁盤緩存中刷新並物理寫入磁盤。要刷新所有臟頁以及文件的元數據並確保它們物理寫入磁盤,請調用 FlushViewOfFile 然后調用FlushFileBuffers函數。 ”

因此,當您在UnmapViewOfFile 中關閉視圖時

“當一個進程完成文件映射對象時,它應該通過對每個文件視圖使用 UnmapViewOfFile 函數來銷毀其地址空間中的所有文件視圖。

取消映射文件的映射視圖會使該視圖在進程地址空間中占用的范圍無效,並使該范圍可用於其他分配 它刪除作為進程工作集一部分的每個未映射虛擬頁面的工作集條目,並減少進程的工作集大小。 它還減少相應物理頁的共享計數。

未映射視圖中的已修改頁面在其共享計數達到零之前不會寫入磁盤,或者換句話說,直到它們從共享頁面的所有進程的工作集中取消映射或修剪 即便如此,修改過的頁面也會“懶惰”地寫入磁盤; 也就是說,修改可能會緩存在內存中並在以后寫入磁盤。 為了將電源故障或系統崩潰時數據丟失的風險降至最低,應用程序應使用 FlushViewOfFile 函數明確刷新修改過的頁面。”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM