Linux

mmap 記憶體對記憶體壓力的行為

  • September 15, 2011

我有一個包含圖像文件的大 tar 文件(60GB)。我正在使用mmap()整個文件來讀取這些圖像,這些圖像是隨機訪問的。

我使用mmap()的原因如下:

  1. 執行緒安全——我無法從多個執行緒中尋找 ifstream。
  2. 我可以避免額外的緩衝。
  3. 我得到了一些記憶體(以已經駐留的請求頁面的形式。)

問題是當我讀取了 60GB 文件中的每張圖片時會發生什麼?當然,並不是所有的圖像都被同時使用——它們被讀取、顯示,然後被丟棄。

我的mmap()電話是:

mmap(0, totalSize, PROT_READ, MAP_SHARED | MAP_NORESERVE, fd, 0); 

**問題來了:核心是否看到我已經映射了由文件支持的只讀頁面,並在記憶體壓力下簡單地清除了未使用的頁面?**我不確定這種情況是否得到承認。手冊頁表明MAP_NORESERVE不需要支持交換空間,但似乎無法保證在記憶體壓力下頁面會發生什麼。是否可以保證核心會在清除文件系統記憶體或 OOM 的另一個程序之前清除我不需要的頁面?

謝謝!

只讀mmap在很大程度上等同於open後跟lseekand read。如果程序中映射的一塊記憶體由文件備份,則 RAM 中的副本被視為磁碟記憶體的一部分,並且將在記憶體壓力下被釋放,就像read從文件中創建磁碟記憶體條目一樣。

我沒有檢查源,但我相信MAP_NORESERVE只讀映射沒有區別。

引用自:https://unix.stackexchange.com/questions/20686