Linux
Linux 記憶體映射文件
我的 RHEL7 上的輸出
lsof
顯示一個帶有文件描述符的文件mem
被 40 個程序使用。這是否意味著該文件在記憶體中映射了 40 次或什麼?有人可以解釋一下記憶體映射文件是什麼意思嗎?這是否意味著它在我的記憶中出現了 40 次?# lsof /usr/lib/locale/locale-archive 命令 PID 使用者 FD 類型 設備尺寸/關閉節點名稱 vmtoolsd 605 根記憶體 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive agetty 656 根記憶體 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive 調諧 963 根記憶體 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive iostat 1199 adm 與 REG 8.5 106070960 50808629 /usr/lib/local/localarchive chkMtaMem 1205 root mem REG 8,5 106070960 50808629 / usr / lib / locale / locale-archive snmpd 4704 root mem REG 8,5 106070960 50808629 / usr / lib / locale / locale-archive 睡眠 5461 根記憶體 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive cmsubagt 6487 根記憶體 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive 睡眠 6649 根記憶體 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc1 6803 root mem REG 8,5 106070960 50808629 / usr / lib / locale / locale-archive proc2 6835 root mem REG 8,5 106070960 50808629 / usr / lib / locale / locale-archive proc3 6836 根記憶體 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc4 6856 root mem REG 8,5 106070960 50808629 / usr / lib / locale / locale-archive proc5 6884 root mem REG 8,5 106070960 50808629 / usr / lib / locale / locale-archive proc6 6889 usr mem REG 8,5 106070960 50808629 / usr / lib / locale / locale-archive proc7 6893 usr1 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive cmfpagt 7704 根記憶體 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc8 7943 root mem REG 8,5 106070960 50808629 / usr / lib / locale / locale-archive crond 8001 root mem REG 8,5 106070960 50808629 / usr / lib / locale / locale-archive sh 8005 adm mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive iostat 8014 adm 與 REG 8.5 106070960 50808629 /usr/lib/local/local-archive crond 20427 root mem REG 8,5 106070960 50808629 / usr / lib / locale / locale-archive proc9 20648 root mem REG 8,5 106070960 50808629 / usr / lib / locale / locale-archive proc10 20649 root mem REG 8,5 106070960 50808629 / usr / lib / locale / locale-archive proc10 20760 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc9 20777 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc11 21353 根記憶體 REG 8.5 106070960 50808629 /usr/lib/local/local-archive proc12 21354 root mem REG 8,5 106070960 50808629 / usr / lib / locale / locale-archive proc13 21355 根記憶體 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc14 21356 根記憶體 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc15 21357 root mem REG 8.5 106070960 50808629 /usr/lib/local/local-archive proc16 21358 根記憶體 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc17 21554 root mem REG 8,5 106070960 50808629 / usr / lib / locale / locale-archive proc18 21569 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc19 21590 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc20 21647 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc21 22016 根記憶體 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc22 22017 root mem REG 8,5 106070960 50808629 / usr / lib / locale / locale-archive proc23 22104 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc24 22122 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
看看虛擬記憶體和物理記憶體之間的區別。
許多程序可以映射相同的物理記憶體。如果 10 個程序映射同一個文件,那麼 RAM 中最多會記憶體一份副本。
如果記憶體不是共享的,那麼如果一個程序更改了它,那麼這一頁(有更改)在送出寫入之前被複製。(因此並非所有記憶體都被複製。這稱為寫時復製或 COW)。
記憶體映射文件是當您要求作業系統將文件映射到記憶體時。在您開始讀/寫之前,它不會載入文件,然後只載入需要的文件。記憶體映射只是讀取/寫入/查找/等的不同介面。您還可以通過讀/寫/查找來訪問記憶體。
那麼這是怎麼做到的呢?
它是通過意識到有些事情是相同的來完成的:即交換和文件是相同的;記憶體和文件記憶體是一樣的。所以當你打開一個文件時,它被映射為交換(不用擔心它不會被用來交換其他東西)。當您開始讀取生成的 seg-fault 並且作業系統將其從文件中交換時(異常(seg-fault)由作業系統處理,因此不會傳遞給程序)(實際上它不是分段錯誤,這是一個頁面錯誤)。使用記憶體或文件的介面無關緊要。它們只是相同功能的介面。