問:
linux的虛擬內存是4G,而每個進程都有自己獨立的4G內存空間,怎么理解?
每個進程所擁有的4G獨立的虛擬內存空間是什么意思?linux系統的虛擬4G空間中,高位的1G是用於系統內核運行的,那么每個進程都有4G的話豈不都要運行內核了,這樣是不是很浪費很低效?
答:
4G 指的是最大的尋址空間為4G
一個進程用到的虛擬地址是由內存區域表來管理的,實際用不了4G。而用到的內存區域,會通過頁表映射到物理內存。所以每個進程都可以使用同樣的虛擬內存地址而不沖突,因為它們的物理地址實際上是不同的。
內核用的是3G以上的1G虛擬內存地址,其中896M是直接映射到物理地址的,128M按需映射896M以上的所謂高位內存。各進程用的是同一個內核,什么叫“都運行內核”?
追問
見笑了,小生剛入門,只是用一個極端的想法來探究為什么這樣設計,
"都運行內核"是每個進程都有獨立的4G虛擬內存空間,其中有1G是跑系統的。
你說的”每個進程都可以使用同樣的虛擬內存地址而不沖突“
是多個進程共用這4G的虛擬內存么,這樣豈不和那句“每個進程所擁有的4G獨立的虛擬內存空間” 起沖突了
還有896M是直接映射到物理內存的,是不是就一直跑在物理內存上了,這樣的話是不是物理內存至少要有896M了啊
追答
首先你得分清“可以尋址”和“實際使用”的區別。其實我們講的每個進程都有4G虛擬地址空間,講的都是“可以尋址”4G,意思是虛擬地址的0-3G對於一個進程的用戶態和內核態來說是可以訪問的,而3-4G是只有進程的內核態可以訪問的。並不是說這個進程會用滿這些空間。
其次,所謂“獨立擁有的虛擬地址”是指對於每一個進程,你可以訪問自己的0-4G的虛擬地址。虛擬地址是“虛擬”的,需要轉化為“真實”的物理地址。好比你有你的地址簿,我有我的地址簿。你和我的地址簿都有1、2、3、4頁,但是每頁里面的實際內容是不一樣的,我的地址簿第1頁寫着3,你的地址簿第1頁寫着4,對你我自己來說都是用第1頁(虛擬),實際上用的分別是第3、4頁(物理),不沖突。
內核用的896M虛擬地址是直接映射的,意思是只要把虛擬地址減去一個偏移量(3G)就等於物理地址。同樣,這里指的還是尋址,實際使用前還是要分配內存。而且896M只是個最大值。如果物理內存小,內核能使用(分配)的可用內存也小。
