除了分段,空間管理的第二種常見方式是分頁。
linux將虛擬記憶體劃分成固定大小的頁(linux中的頁大小是4kb),並且以頁作為操作記憶體的最小單元。例如一次性讀取一頁,虛擬記憶體中的頁稱為虛擬頁。對應的,物理記憶體也會劃分成固定大小的頁來管理,稱為物理頁,也常稱為頁框或頁幀(page frame)。物理頁和虛擬頁的大小相等。
值得注意的是,雖然虛擬記憶體和物理記憶體都將空間全部劃分成頁,但不可能會為所有虛擬頁分配好所有對應的物理頁,所以虛擬頁有乙個有效位的屬性,如果該頁有分配對應的物理頁,則有效,否則無效。
為了將虛擬頁的頁號(virtual page number,vpn)和物理頁的頁號(physical page number, ppn)也對應起來,也需要進行位址翻譯。如圖所示。
為了完成這個翻譯過程,作業系統為每個程序都維護了乙個稱為頁表(page table)的資料結構。頁表中的每項代表乙個頁的對映資訊,也稱為頁表項(page table entry,pte)。
注意,頁表是每個程序都有乙個的,因為每個程序的虛擬位址空間都是獨立的,各程序中的頁對映到物理頁自然也是不同的。
每乙個頁表項中都儲存了很多東西,比如最基本的虛擬頁號和物理頁號、頁偏移、頁是否有效的有效位(比如表明是否已分配該頁記憶體)、頁是否可讀/寫/執行的保護位、頁是存在於記憶體還是存在於交換分割槽的存在位、頁是否修改過的髒位、頁是否最近訪問過的訪問位,等等。
正是因為頁表中的內容太多,如果不採用其他技術,它也將占用巨大的記憶體(記憶體中的頁表甚至可以大到幾百兆,所有必須優化減小他)。有兩種常見的思路解決這類問題,分段+分頁結合、多級頁表,這兩種空間管理問題的解決思路,在檔案系統中也一樣使用了。此外,還有常用的技術是使用虛擬大記憶體頁,記憶體頁變大,所需要儲存的對映記錄就越少,效率也提高。
通過分段+分頁的方式,不再為整個位址空間分配乙個頁表,而是為每個段落分配乙個頁表,這樣每個頁表的大小就減小了,而且段落是獨立管理的,那麼每個段落中的頁表的訪問頻繁度也將不一樣。在檔案系統中,分段+分頁的思想體現為塊組+資料塊。但是分段+分頁的方式也是有缺點的,它雖然為每個段劃分頁表,但仍然為所有的記憶體劃分了頁,且總頁表大小並沒有改變。所以,作業系統不使用這種方案。
第二種方案是使用多級頁表,也是linux中使用的方案,它不依賴於分段。它的思想是:如果某頁表中包含的所有頁表項都是無效的頁(例如未分配的),就不為這段空間的頁維護頁表,這樣就能減小頁表的大小。這個邏輯其實很簡單:對於沒有分配的頁,沒有必要去記錄這些頁的翻譯方式。
由於不是所有頁都維護了頁表,所以使用乙個稱為頁目錄(page director)的資料結構去記錄所有的頁表(通過指向頁表的指標記錄),並標記每個頁表是否有效,頁表有效表示該頁表已經分配,這也意味著該頁表中一定有正在使用中的有效頁。因為頁目錄是頁表的更高一層次,所以稱為多級頁表。
記憶體管理之分頁和頁表
簡單的分頁 記憶體被劃分為許多大小相等的頁框 每個程序被劃分成許多大小與頁框相等的頁 要裝入乙個程序,需要把程序包含的所有頁都裝入記憶體中不一定連續的某些頁框中。優勢 沒有外部碎片。缺點 有少量的內部碎片。簡單的分段 每個程序被劃分為許多段 要裝入乙個程序,需要把程序中包含的所有段裝入記憶體內不一定...
頁目錄和頁表重合與分頁位址轉換
寫得不錯,轉下,來自jiurl大牛的 頁目錄的位址為什麼是c0300000,1個頁目錄加上1024個頁表為什麼只使用了1024 4k的位址空間 對於要對映整個4g位址空間,是需要1024個頁表和1個頁目錄的,每個都是4kb大小,也就是 1024 4kb 1 4kb 4mb 4kb。而實際中win2k...
頁目錄和頁表重合與分頁位址轉換
頁目錄的位址為什麼是c0300000,1個頁目錄加上1024個頁表為什麼只使用了1024 4k的位址空間 對於要對映整個4g位址空間,是需要1024個頁表和1個頁目錄的,每個都是4kb大小,也就是 1024 4kb 1 4kb 4mb 4kb。而實際中win2k把每個程序的頁目錄和頁表對映到了從 0...