
我的 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 root mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive iostat 1199 adm mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive chkMtaMem 1205 根記憶體 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive snmpd 4704 根記憶體 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 根記憶體 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc2 6835 根記憶體 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc3 6836 根記憶體 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc4 6856 根記憶體 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc5 6884 根記憶體 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 根記憶體 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 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive crond 20427 根記憶體 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc9 20648 根記憶體 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc10 20649 根記憶體 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/locale/locale-archive proc12 21354 根記憶體 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 根記憶體 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc16 21358 根記憶體 REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc17 21554 根記憶體 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 根記憶體 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
答案1
看看虛擬記憶體和實體記憶體之間的差異。
許多進程可以映射相同的實體記憶體。如果 10 個進程映射同一個文件,則 RAM 中最多會快取一份副本。
如果記憶體不是共享的,那麼如果一個進程更改了它,則在提交寫入之前會複製這一頁(包含更改)。 (因此並非所有記憶體都被複製。這稱為寫入時複製或 COW)。
記憶體映射檔案是指您要求作業系統將檔案映射到記憶體中。在您開始讀取/寫入之前,它不會加載文件,然後只加載需要的內容。記憶體映射只是讀/寫/查找等的不同介面。您也可以透過讀取/寫入/查找來存取記憶體。
那麼這是如何做到的呢?
這是透過認識到有些事情是相同的來完成的:即交換和文件是相同的;記憶體和檔案快取是相同的。因此,當您開啟一個文件時,它會被映射為交換(不用擔心它不會用於交換其他內容)。當您開始讀取時,會產生段錯誤,並且作業系統將其從檔案中交換(異常(段錯誤)由作業系統處理,因此不會傳遞給進程)(實際上它不是分段錯誤,這是一個頁面錯誤)。使用記憶體或檔案的介面並不重要。它們只是具有相同功能的介面。
答案2
是的,按照以下手冊lsof
:
FD is the File Descriptor number of the file or:
cwd current working directory;
Lnn library references (AIX);
err FD information error (see NAME column);
jld jail directory (FreeBSD);
ltx shared library text (code and data);
Mxx hex memory-mapped type number xx.
m86 DOS Merge mapped file;
mem memory-mapped file;
mmap memory-mapped device;
pd parent directory;
rtd root directory;
tr kernel trace file (OpenBSD);
txt program text (code and data);
v86 VP/ix mapped file;
只有當它以非共享模式映射並且任何進程寫入虛擬記憶體時,才需要實體記憶體中的多個檔案副本。否則,如果沒有發生寫入(我不認為),則在任何進程讀取記憶體之前,資料甚至不必佔用實體記憶體。