Glibc
ld.so.cache 和 libc.so.6 為每個呼叫映射記憶體?
玩
strace
,在我看來,ld.so.cache
幾乎libc.so.6
每個程序都打開並映射到記憶體。至少我嘗試過的那些過程。這不是意味著這些程序被多次映射到程序記憶體中嗎?當然,這些文件非常小,但是這不是有點浪費記憶體嗎?
strace 輸出顯示這些正在使用
MAP_PRIVATE
set 進行映射,這使其成為寫時複製,但似乎每個程序都有一個新映射。我的問題:
- 我是否正確理解正在發生的事情?也就是說,是否真的有這些文件的新副本映射到每個需要它們的程序的記憶體中(似乎是每一個)?
- 是否正在進行某種類型的記憶體共享?也就是說,由於映射是寫時複製的,是否有很多程序在查看相同的物理記憶體位置?
- 是的,每個程序都有自己的所需庫映射。
- 是的,大部分數據是共享的,因此每個程序“看到”相同的物理記憶體(在不同的線性地址),假設每個文件的相同版本是共享的。
maps
您可以通過查看每個程序/proc/
目錄中的文件來查看各種映射;因為libc
你會看到諸如7f1014062000-7f10141f7000 r-xp 00000000 fd:0d 1444681 /lib/x86_64-linux-gnu/libc-2.24.so 7f10141f7000-7f10143f7000 ---p 00195000 fd:0d 1444681 /lib/x86_64-linux-gnu/libc-2.24.so 7f10143f7000-7f10143fb000 r--p 00195000 fd:0d 1444681 /lib/x86_64-linux-gnu/libc-2.24.so 7f10143fb000-7f10143fd000 rw-p 00199000 fd:0d 1444681 /lib/x86_64-linux-gnu/libc-2.24.so
或者
7f4d7a8ec000-7f4d7aa81000 r-xp 00000000 fd:0d 1444681 /lib/x86_64-linux-gnu/libc-2.24.so 7f4d7aa81000-7f4d7ac81000 ---p 00195000 fd:0d 1444681 /lib/x86_64-linux-gnu/libc-2.24.so 7f4d7ac81000-7f4d7ac85000 r--p 00195000 fd:0d 1444681 /lib/x86_64-linux-gnu/libc-2.24.so 7f4d7ac85000-7f4d7ac87000 rw-p 00199000 fd:0d 1444681 /lib/x86_64-linux-gnu/libc-2.24.so
只讀的、可執行的映射對應於庫中的共享可執行程式碼;只讀映射允許訪問庫中共享的只讀數據;讀寫映射是庫中變數的私有映射。正如您在上面看到的,線性地址是不同的(由於地址空間佈局隨機化和不同的載入順序);共享部分的底層物理地址是相同的,一旦它們被載入到記憶體中(因為映射映射底層文件,而不是直接映射共享記憶體)。