Linux
mmap 記憶體對記憶體壓力的行為
我有一個包含圖像文件的大 tar 文件(60GB)。我正在使用
mmap()
整個文件來讀取這些圖像,這些圖像是隨機訪問的。我使用
mmap()
的原因如下:
- 執行緒安全——我無法從多個執行緒中尋找 ifstream。
- 我可以避免額外的緩衝。
- 我得到了一些記憶體(以已經駐留的請求頁面的形式。)
問題是當我讀取了 60GB 文件中的每張圖片時會發生什麼?當然,並不是所有的圖像都被同時使用——它們被讀取、顯示,然後被丟棄。
我的
mmap()
電話是:mmap(0, totalSize, PROT_READ, MAP_SHARED | MAP_NORESERVE, fd, 0);
**問題來了:核心是否看到我已經映射了由文件支持的只讀頁面,並在記憶體壓力下簡單地清除了未使用的頁面?**我不確定這種情況是否得到承認。手冊頁表明
MAP_NORESERVE
不需要支持交換空間,但似乎無法保證在記憶體壓力下頁面會發生什麼。是否可以保證核心會在清除文件系統記憶體或 OOM 的另一個程序之前清除我不需要的頁面?謝謝!
只讀
mmap
在很大程度上等同於open
後跟lseek
andread
。如果程序中映射的一塊記憶體由文件備份,則 RAM 中的副本被視為磁碟記憶體的一部分,並且將在記憶體壓力下被釋放,就像read
從文件中創建磁碟記憶體條目一樣。我沒有檢查源,但我相信
MAP_NORESERVE
只讀映射沒有區別。