Linux

Linux 記憶體映射文件

  • May 31, 2018

我的 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)由作業系統處理,因此不會傳遞給程序)(實際上它不是分段錯誤,這是一個頁面錯誤)。使用記憶體或文件的介面無關緊要。它們只是相同功能的介面。

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