那麼這是如何做到的呢?

那麼這是如何做到的呢?

我的 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;

只有當它以非共享模式映射並且任何進程寫入虛擬記憶體時,才需要實體記憶體中的多個檔案副本。否則,如果沒有發生寫入(我不認為),則在任何進程讀取記憶體之前,資料甚至不必佔用實體記憶體。

相關內容