Memory
了解 mmap
我在這裡瀏覽了有關 mmap 的文件,並嘗試使用此影片來實現它。
關於它的實施,我有幾個問題。
- mmap 是否提供文件映射並返回物理記憶體中該位置的指針,還是返回映射表的地址?它是否也為該文件分配和鎖定空間?
- 一旦文件儲存在記憶體中的那個位置,它會一直留在那裡直到呼叫 munmap 嗎?
- 文件甚至移動到記憶體還是只是一個用作重定向的映射表並且文件實際上在虛擬記憶體中 - (磁碟)?
- 假設它被移動到記憶體中,如果其他程序有地址,是否可以訪問該空間來讀取數據?
按順序回答問題:
- 它返回一個指向虛擬記憶體中位置的指針,並分配了虛擬記憶體地址空間,但文件不會以任何方式鎖定,除非您顯式鎖定它(另請注意,鎖定記憶體與鎖定區域中的區域不同)文件)。由於分頁和虛擬記憶體, mmap() 的有效實現實際上只能從實際角度進行(否則,需要在呼叫完成之前將整個區域讀入記憶體)。
- 不完全是,這與下一個答案有關,所以我會在那裡介紹。
- 有點兒。大多數情況下實際發生的情況是 mmap() 提供對頁面記憶體中該文件數據的寫時複製訪問。結果,通常的記憶體對數據生存期的限制適用:如果系統需要空間,則可以從記憶體中刪除頁面(或者如果它們是臟的,則將它們刷新到磁碟)並且需要再次出錯。
- 不,因為虛擬記憶體的工作方式。每個程序都有自己的虛擬地址空間和自己的虛擬映射。每個想要傳遞數據的程序都必須在同一個文件(或共享記憶體段)上呼叫 mmap(),並且它們都必須使用該
MAP_SHARED
標誌。值得注意的是 mmap() 不僅適用於文件,您還可以使用它做其他事情,例如:
- 直接映射設備記憶體(如果您有足夠的權限)。這實際上用於許多嵌入式系統,以避免需要為新硬體編寫核心模式驅動程序。
- 映射共享記憶體段。
- 顯式映射大頁面。
- 分配記憶體,然後您可以呼叫madvise(2)來執行有用的操作,例如防止數據被複製到fork(2)上的子程序,或者為KSM(Linux 的記憶體重複數據刪除功能)標記數據。