在 Linux中,用戶(hù)內存和內核內存是獨立的,在各自的地址空間實(shí)現。地址空間是虛擬的,就是說(shuō)地址是從物理內存中抽象出來(lái)的(通過(guò)一個(gè)簡(jiǎn)短描述的過(guò)程)。由于地址空間是虛擬的,所以可以存在很多。事實(shí)上,內核本身駐留在一個(gè)地址空間中,每個(gè)進(jìn)程駐留在自己的地址空間。這些地址空間由虛擬內存地址組成,允許一些帶有獨立地址空間的進(jìn)程指向一個(gè)相對較小的物理地址空間(在機器的物理內存中)。不僅僅是方便,而且更安全。因為每個(gè)地址空間是獨立且隔離的,因此很安全。
但是與安全性相關(guān)聯(lián)的成本很高。因為每個(gè)進(jìn)程(和內核)會(huì )有相同地址指向不同的物理內存區域,不可能立即共享內存。幸運的是,有一些解決方案。用戶(hù)進(jìn)程可以通過(guò) Portable Operating System Interface for UNIX® (POSIX)共享的內存機制(shmem)共享內存,但有一點(diǎn)要說(shuō)明,每個(gè)進(jìn)程可能有一個(gè)指向相同物理內存區域的不同虛擬地址。
虛擬內存到物理內存的映射通過(guò)頁(yè)表完成,這是在底層軟件中實(shí)現的(見(jiàn)圖1)。硬件本身提供映射,但是內核管理表及其配置。注意這里的顯示,進(jìn)程可能有一個(gè)大的地址空間,但是很少見(jiàn),就是說(shuō)小的地址空間的區域(頁(yè)面)通過(guò)頁(yè)表指向物理內存。這允許進(jìn)程僅為隨時(shí)需要的網(wǎng)頁(yè)指定大的地址空間。

由于缺乏為進(jìn)程定義內存的能力,底層物理內存被過(guò)度使用。通過(guò)一個(gè)稱(chēng)為 paging(然而,在 Linux 中通常稱(chēng)為 swap)的進(jìn)程,很少使用的頁(yè)面將自動(dòng)移到一個(gè)速度較慢的存儲設備(比如磁盤(pán)),來(lái)容納需要被訪(fǎng)問(wèn)的其它頁(yè)面(見(jiàn)圖 2)。這一行為允許,在將很少使用的頁(yè)面遷移到磁盤(pán)來(lái)提高物理內存使用的同時(shí),計算機中的物理內存為應用程序更容易需要的頁(yè)面提供服務(wù)。注意,一些頁(yè)面可以指向文件,在這種情況下,如果頁(yè)面是臟(dirty)的,數據將被沖洗,如果頁(yè)面是干凈的(clean),直接丟掉。

聯(lián)系客服