《電腦作業系統》總結三(記憶體管理)

來源:互聯網
上載者:User
記憶體管理 包括記憶體管理和虛擬記憶體管理。

記憶體管理組件括記憶體管理概念、交換與覆蓋、連續分配管理方式和非連續分配管理方式(分頁管理方式、分段管理方式、段頁式管理方式)。

虛擬記憶體管理組件括虛擬記憶體概念、請求分頁管理方式、頁面置換演算法、頁面分配策略、工作集和抖動。
3.1 記憶體管理的概念 記憶體管理(Memory Management)是作業系統設計中最重要和最複雜的內容之一。雖然電腦硬體一直在飛速發展,記憶體容量也在不斷增長,但是仍然不可能將所有使用者進程和系統所需要的全部程式和資料放入主存中,所以作業系統必須將記憶體空間進行合理地劃分和有效地動態分配。作業系統對記憶體的劃分和動態分配,就是記憶體管理的概念。

有效記憶體管理在多道程式設計中非常重要,不僅方便使用者使用儲存空間、提高記憶體利用率,還可以通過虛擬技術從邏輯上擴充儲存空間。

記憶體管理的功能有: 記憶體空間的分配與回收:由作業系統完成主儲存空間空間的分配和管理,使程式員擺脫儲存分配的麻煩,提高編程效率。 地址轉換:在多道程式環境下,程式中的邏輯地址與記憶體中的物理地址不可能一致,因此儲存管理必須提供地址變換功能,把邏輯地址轉換成相應的物理地址。 記憶體空間的擴充:利用虛擬儲存技術或自動覆蓋技術,從邏輯上擴充記憶體。 儲存保護:保證各道作業在各自的儲存空間內運行,.互不干擾。
在進行具體的記憶體管理之前,需要瞭解進程啟動並執行基本原理和要求。 程式裝入和連結 建立進程首先要將程式和資料裝入記憶體。將使用者來源程式變為可在記憶體中執行的程式,通常需要以下幾個步驟: 編譯:由編譯器將使用者原始碼編譯成若干個目標模組。 連結:由連結程式將編譯後形成的一組目標模組,以及所需庫函數連結在一起,形成一個完整的裝入模組。 裝入:由裝入程式將裝入模組裝入記憶體運行。
這三步過程如圖3-1所示。



圖3-1  對使用者程式的處理步驟
程式的連結有以下三種方式: 靜態連結:在程式運行之前,先將各目標模組及它們所需的庫函數連結成一個完整的可執行程式,以後不再拆開。 裝入時動態連結:將使用者來源程式編譯後所得到的一組目標模組,在裝入記憶體時,釆用邊裝入邊連結的連結方式。 運行時動態連結:對某些目標模組的連結,是在程式執行中需要該目標模組時,才對它進行的連結。其優點是便於修改和更新,便於實現對目標模組的共用。
記憶體的裝入模組在裝入記憶體時,同樣有以下三種方式:

1) 絕對裝入。在編譯時間,如果知道程式將駐留在記憶體的某個位置,編譯器將產生絕對位址的目標代碼。絕對裝入程式按照裝入模組中的地址,將程式和資料裝入記憶體。由於程式中的邏輯地址與實際記憶體位址完全相同,故不需對程式和資料的地址進行修改。

絕對裝入方式只適用於單道程式環境。另外,程式中所使用的絕對位址,可在編譯或彙編時給出,也可由程式員直接賦予。而通常情況下在程式中釆用的是符號地址,編譯或彙編時再轉換為絕對位址。

2) 可重定位裝入。在多道程式環境下,多個目標模組的起始地址通常都是從0開始,程式中的其他地址都是相對於起始地址的,此時應釆用可重定位裝入方式。根據記憶體的當前情況,將裝入模組裝入到記憶體的適當位置。裝入時對目標程式中指令和資料的修改過程稱為重定位,地址變換通常是在裝入時一次完成的,所以又稱為靜態重定位,如圖3-2(a) 所示。


圖3-2  重新導向類型
靜態重定位的特點是在一個作業裝入記憶體時,必須分配其要求的全部記憶體空間,如果沒有足夠的記憶體,就不能裝入該作業。此外,作業一旦進入記憶體後,在整個運行期間不能在記憶體中移動,也不能再申請記憶體空間。

3) 動態運行時裝入,也稱為動態重定位,程式在記憶體中如果發生移動,就需要釆用動態裝入方式。裝入程式在把裝入模組裝入記憶體後,並不立即把裝入模組中的相對位址轉換為絕對位址,而是把這種地址轉換延遲到程式真正要執行時才進行。因此,裝入記憶體後的所有地址均為相對位址。這種方式需要一個重定位寄存器的支援,如圖3-2(b)所示。

動態重定位的特點是可以將程式分配到不連續的儲存區中;在程式運行之前可以只裝入它的部分代碼即可投入運行,然後在程式運行期間,根據需要動態申請分配記憶體;便於程式段的共用,可以向使用者提供一個比儲存空間大得多的地址空間。 邏輯地址空間與物理地址空間 編譯後,每個目標模組都是從0號單元開始編址,稱為該目標模組的相對位址(或邏輯地址)。 當連結程式將各個模組連結成一個完整的可執行目標程式時,連結程式順序依次按各個模組的相對位址構成統一的從0號單元開始編址的邏輯地址空間。使用者程式和程式員只需知道邏輯地址,而記憶體管理的具體機制則是完全透明的,它們只有系統編程人員才會涉及。不同進程可以有相同的邏輯地址,因為這些相同的邏輯地址可以映射到主存的不同位置。

物理地址空間是指記憶體中物理單元的集合,它是地址轉換的最終地址,進程在運行時執行指令和訪問資料最後都要通過物理地址從主存中存取。當裝入程式將可執行代碼裝入記憶體時,必須通過地址轉換將邏輯地址轉換成物理地址,這個過程稱為地址重定位。 記憶體保護 記憶體配置前,需要保護作業系統不受使用者進程的影響,同時保護使用者進程不受其他使用者進程的影響。通過釆用重定位寄存器和界地址寄存器來實現這種保護。重定位寄存器含最小的物理地址值,界地址寄存器含邏輯地址值。每個邏輯地址值必須小於界地址寄存器;記憶體管理機構動態地將邏輯地址與界地址寄存器進行比較,如果未發生地址越界,則加上重定位寄存器的值後映射成物理地址,再送交記憶體單元,如圖3-3所示。

當CPU發送器選擇進程執行時,派遣程式會初始化重定位寄存器和界地址寄存器。每一個邏輯地址都需要與這兩個寄存器進行核對,以保證作業系統和其他使用者程式及資料不被該進程的運行所影響。



圖3-3  重定位和界地址寄存器的硬體支援
3.2 記憶體覆蓋與記憶體交換 覆蓋與交換技術是在多道程式環境下用來擴充記憶體的兩種方法。 記憶體覆蓋 早期的電腦系統中,主存容量很小,雖然主存中僅存放一道使用者程式,但是儲存空間放不下使用者進程的現象也經常發生,這一矛盾可以用覆蓋技術來解決。

覆蓋的基本思想是:由於程式運行時並非任何時候都要訪問程式及資料的各個部分(尤其是大程式),因此可以把使用者空間分成一個固定區和若干個覆蓋區。將經常活躍的部分放在固定區,其餘部分按調用關係分段。首先將那些即將要訪問的段放入覆蓋區,其他段放在外存中,在需要調用前,系統再將其調入覆蓋區,替換覆蓋區中原有的段。

覆蓋技術的特點是打破了必須將一個進程的全部資訊裝入主存後才能啟動並執行限制,但當同時運行程式的代碼量大於主存時仍不能運行。 記憶體交換 交換(對換)的基本思想是,把處於等待狀態(或在CPU調度原則下被剝奪運行權利)的程式從記憶體移到輔存,把記憶體空間騰出來,這一過程又叫換出;把準備好競爭CPU啟動並執行程式從輔存移到記憶體,這一過程又稱為換入。中級調度就是釆用交換技術。

例如,有一個CPU釆用時間片輪轉調度演算法的多道程式環境。時間片到,記憶體管理器將剛剛執行過的進程換出,將另一進程換入到剛剛釋放的記憶體空間中。同時,CPU調度器可以將時間片分配給其他已在記憶體中的進程。每個進程用完時間片都與另一進程交換。理想情況下,記憶體管理器的交換過程速度足夠快,總有進程在記憶體中可以執行。

有關交換需要注意以下幾個問題: 交換需要備份儲存,通常是快速磁碟。它必須足夠大,並且提供對這些記憶體映像的直接存取。 為了有效使用CPU,需要每個進程的執行時間比交換時間長,而影響交換時間的主要是轉移時間。轉移時間與所交換的記憶體空間成正比。 如果換出進程,必須確保該進程是完全處於空閑狀態。 交換空間通常作為磁碟的一整塊,且獨立於檔案系統,因此使用就可能很快。 交換通常在有許多進程運行且記憶體空間吃緊時開始啟動,而系統負荷降低就暫停。 普通的交換使用不多,但交換策略的某些變種在許多系統中(如UNIX系統)仍發揮作用。
交換技術主要是在不同進程(或作業)之間進行,而覆蓋則用於同一個程式或進程中。由於覆蓋技術要求給出程式段之間的覆蓋結構,使得其對使用者和程式員不透明,所以對於主存無法存放使用者程式的矛盾,現代作業系統是通過虛擬記憶體技術來解決的,覆蓋技術則已成為曆史;而交換技術在現代作業系統中仍具有較強的生命力。

3.3 記憶體連續分配管理方式 連續分配方式,是指為一個使用者程式分配一個連續的記憶體空間。它主要包括單一連續分配、固定分區分配和動態分區分配。 單一連續分配 記憶體在此方式下分為系統區和使用者區,系統區僅提供給作業系統使用,通常在低地址部分;使用者區是為使用者提供的、除系統區之外的記憶體空間。這種方式無需進行記憶體保護。

這種方式的優點是簡單、無外部片段,可以釆用覆蓋技術,不需要額外的支援人員。缺點是只能用於單使用者、單任務的作業系統中,有內部片段,儲存空間的利用率極低。 固定分區分配 固定分區分配是最簡單的一種多道程式儲存管理方式,它將使用者記憶體空間劃分為若干個固定大小的地區,每個分區只裝入一道作業。當有空閑分區時,便可以再從外存的後備作業隊列中,選擇適當大小的作業裝入該分區,如此迴圈。



圖3-4  固定分區分配的兩種方法
固定分區分配在劃分分區時,有兩種不同的方法,如圖3-4所示。 分區大小相等:用於利用一台電腦去控制多個相同對象的場合,缺乏靈活性。 分區大小不等:劃分為含有多個較小的分區、適量的中等分區及少量的大分區。
為便於記憶體配置,通常將分區按大小排隊,並為之建立一張分區說明表,其中各表項包括每個分區的起始地址、大小及狀態(是否已指派),如圖3-5(a)所示。當有使用者程式要裝入時,便檢索該表,以找到合適的分區給予分配並將其狀態置為”已指派”;未找到合適分區則拒絕為該使用者程式分配記憶體。儲存空間的分配情況如圖3-5(b)所示。

這種分區方式存在兩個問題:一是程式可能太大而放不進任何一個分區中,這時使用者不得不使用覆蓋技術來使用記憶體空間;二是主存利用率低,當程式小於固定分區大小時,也佔用了一個完整的記憶體分區空間,這樣分區內部有空間浪費,這種現象稱為內部片段。

固定分區是可用於多道程式設計最簡單的儲存分配,無外部片段,但不能實現多進程共用一個主存區,所以儲存空間利用率低。固定分區分配很少用於現在通用的作業系統中,但在某些用於控制多個相同對象的控制系統中仍發揮著一定的作用。



圖3-5  固定分區說明表和記憶體配置情況 動態分區分配 動態分區分配又稱為可變分區分配,是一種動態劃分記憶體的分區方法。這種分區方法不預先將記憶體劃分,而是在進程裝入記憶體時,根據進程的大小動態地建立分區,並使分區的大小正好適合進程的需要。因此系統中分區的大小和數目是可變的。



圖3-6動態分區
如圖3-6所示,系統有64MB記憶體空間,其中低8MB固定分配給作業系統,其餘為使用者可用記憶體。開始時裝入前三個進程,在它們分別分配到所需空間後,記憶體只剩下4MB,進程4無法裝入。在某個時刻,記憶體中沒有一個就緒進程,CPU出現空閑,作業系統就換出進程2,換入進程4。由於進程4比進程2小,這樣在主存中就產生了一個6MB的記憶體塊。之後CPU又出現空閑,而主存無法容納進程2,作業系統就換出進程1,換入進程2。

動態分區在開始分配時是很好的,但是之後會導致記憶體中出現許多小的記憶體塊。隨著時間的推移,記憶體中會產生越來越多的片段(圖3-6中最後的4MB和中間的6MB,且隨著進程的換入/換出,很可能會出現更多更小的記憶體塊),記憶體的利用率隨之下降。 這些小的記憶體塊稱為外部片段,指在所有分區外的儲存空間會變成越來越多的片段,這與固定分區中的內部片段正好相對。克服外部片段可以通過緊湊(Compaction)技術來解決,就是作業系統不時地對進程進行移動和整理。但是這需要動態重定位寄存器的支援,且相對費時。緊湊的過程實際上類似於Windows系統中的磁碟整理程式,只不過後者是對外存空間的緊湊。

在進程裝入或換入主存時,如果記憶體中有多個足夠大的空閑塊,作業系統必須確定分配哪個記憶體塊給進程使用,這就是動態分區的分配策略,考慮以下幾種演算法: 首次適應(First  Fit)演算法:空閑分區以地址遞增的次序連結。分配記憶體時順序尋找,找到大小能滿足要求的第一個空閑分區。 最佳適應(Best  Fit)演算法:空閑分區按容量遞增形成分區鏈,找到第一個能滿足要求的空閑分區。 最壞適應(Worst  Fit)演算法:又稱最大適應(Largest Fit)演算法,空閑分區以容量遞減的次序連結。找到第一個能滿足要求的空閑分區,也就是挑選出最大的分區。 鄰近適應(Next  Fit)演算法:又稱迴圈首次適應演算法,由首次適應演算法演變而成。不同之處是分配記憶體時從上次尋找結束的位置開始繼續尋找。
在這幾種方法中,首次適應演算法不僅是最簡單的,而且通常也是最好和最快的。在UNIX 系統的最初版本中,就是使用首次適應演算法為進程分配記憶體空間,其中使用數組的資料結構 (而非鏈表)來實現。不過,首次適應演算法會使得記憶體的低地址部分出現很多小的空閑分區,而每次分配尋找時,都要經過這些分區,因此也增加了尋找的開銷。

鄰近適應演算法試圖解決這個問題,但實際上,它常常會導致在記憶體的末尾分配空間(因為在一遍掃描中,記憶體前面部分使用後再釋放時,不會參與分配),分裂成小片段。它通常比首次適應演算法的結果要差。

最佳適應演算法雖然稱為“最佳”,但是效能通常很差,因為每次最佳的分配會留下很小的難以利用的記憶體塊,它會產生最多的外部片段。

最壞適應演算法與最佳適應演算法相反,選擇最大的可用塊,這看起來最不容易產生片段,但是卻把最大的連續記憶體劃分開,會很快導致沒有可用的大的記憶體塊,因此效能也非常差。

Kunth和Shore分別就前三種方法對記憶體空間的利用情況做了類比實驗,結果表明:

首次適應演算法可能比最佳適應法效果好,而它們兩者一定比最大適應法效果好。另外注意,在演算法實現時,分配操作中最佳適應法和最大適應法需要對可用塊進行排序或遍曆尋找,而首次適應法和鄰近適應法只需要簡單尋找;回收操作中,當回收的塊與原來的空閑塊相鄰時(有三種相鄰的情況,比較複雜),需要將這些塊合并。在演算法實現時,使用數組或鏈表進行管理。除了記憶體的利用率,這裡的演算法開銷也是作業系統設計需要考慮的一個因素。

表3-1三種記憶體分區管理方式的比較

作業道數 內部
片段
外部
片段
硬體支援 可用空
間管理
解決碎
片方法
解決空
間不足
提高作
業道數
單道連續
分配
1 界地址寄存器、越界
檢查機構
-- -- 覆蓋 交換
多道固定
連續分配
<=N
(使用者空間劃
為N塊)
上下界寄存器、越界檢查機構 基地址寄存器、長度寄存器、動態地址轉換機構 -- --
多道可變連續分配 數組 鏈表 緊湊

以上三種記憶體分區管理方法有一共同特點,即使用者進程(或作業)在主存中都是連續存放的。這裡對它們進行比較和總結,見表3-1。

3.4 記憶體非連續分配管理方式 非連續分配允許一個程式分散地裝入到不相鄰的記憶體分區中,根據分區的大小是否固定分為分頁儲存管理方式和分段儲存管理方式。

分頁儲存管理方式中,又根據運行作業時是否要把作業的所有頁面都裝入記憶體才能運行分為基本分頁儲存管理方式和請求分頁儲存管理方式。下面介紹基本分頁儲存管理方式。 基本分頁儲存管理方式 固定分區會產生內部片段,動態分區會產生外部片段,這兩種技術對記憶體的利用率都比較低。我們希望記憶體的使用能盡量避免片段的產生,這就引入了分頁的思想:把主存空間劃分為大小相等且固定的塊,塊相對較小,作為主存的基本單位。每個進程也以塊為單位進行劃分,進程在執行時,以塊為單位逐個申請主存中的塊空間。

分頁的方法從形式上看,像分區相等的固定分區技術,分頁管理不會產生外部片段。但它又有本質的不同點:塊的大小相對分區要小很多,而且進程也按照塊進行劃分,進程運行時按塊申請主存可用空間並執行。這樣,進程只會在為最後一個不完整的塊申請一個主存塊空間時,才產生主存片段,所以儘管會產生內部片段,但是這種片段相對於進程來說也是很小的,每個進程平均只產生半個塊大小的內部片段(也稱頁內片段)。 1) 分頁儲存的幾個基本概念 ①頁面和頁面大小。進程中的塊稱為頁(Page),記憶體中的塊稱為頁框(Page Frame,或頁幀)。外存也以同樣的單位進行劃分,直接稱為塊(Block)。進程在執行時需要申請主存空間,就是要為每個頁面分配主存中的可用頁框,這就產生了頁和頁框的一一對應。

為方便地址轉換,頁面大小應是2的整數冪。同時頁面大小應該適中,如果頁面太小,會使進程的頁面數過多,這樣頁表就過長,佔用大量記憶體,而且也會增加硬體地址轉換的開銷,降低頁面換入/換出的效率;頁面過大又會使頁內片段增大,降低記憶體的利用率。所以頁面的大小應該適中,考慮到耷間效率和時間效率的權衡。

②地址結構。分頁儲存管理的邏輯地址結構如圖3-7所示。



圖3-7  分頁儲存管理的地址結構
地址結構包含兩部分:前一部分為頁號P,後一部分為頁內位移量W。地址長度為32 位,其中0~11位為頁內地址,即每頁大小為4KB;12~31位為頁號,地址空間最多允許有2^20頁。

③頁表。為了便於在記憶體中找到進程的每個頁面所對應的物理塊,系統為每個進程建立一張頁表,記錄頁面在記憶體中對應的物理塊號,頁表一般存放在記憶體中。

在配置了頁表後,進程執行時,通過尋找該表,即可找到每頁在記憶體中的物理塊號。可見,頁表的作用是實現從頁號到物理塊號的地址映射,如圖3-8所示。



圖3-8  頁表的作用 2) 基本地址變換機構 地址變換機構的任務是將邏輯地址轉換為記憶體中物理地址,地址變換是藉助於頁表實現的。圖3-9給出了分頁儲存管理系統中的地址變換機構。



圖3-9  分頁儲存管理的地址變換機構
在系統中通常設定一個頁表寄存器(PTR),存放頁表在記憶體的始址F和頁表長度M。進程未執行時,頁表的始址和長度存放在進程式控制制塊中,當進程執行時,才將頁表始址和長度存入頁表寄存器。設頁面大小為L,邏輯地址A到物理地址E的變換過程如下: 計算頁號P(P=A/L)和頁內位移量W (W=A%L)。 比較頁號P和頁表長度M,若P >= M,則產生越界中斷,否則繼續執行。 頁表中頁號P對應的頁表項地址 = 頁表起始地址F + 頁號P * 頁表項長度,取出該頁表項內容b,即為物理塊號。 計算E=b*L+W,用得到的物理地址E去訪問記憶體。
以上整個地址變換過程均是由硬體自動完成的。

例如,若頁面大小L為1K位元組,頁號2對應的物理塊為b=8,計算邏輯地址A=2500 的物理地址E的過程如下:P=2500/1K=2,W=2500%1K=452,尋找得到頁號2對應的物理塊的塊號為 8,E=8*1024+452=8644。

下面討論分頁管理方式存在的兩個主要問題: 每次訪存操作都需要進行邏輯地址到物理地址的轉換,地址轉換過程必須足夠快,否則訪存速度會降低; 每個進程引入了頁表,用於儲存映射機制,頁表不能太大,否則記憶體利用率會降低。 3) 具有快表的地址變換機構 由上面介紹的地址變換過程可知,若頁表全部放在記憶體中,則存取一個資料或一條指令至少要訪問兩次記憶體:一次是訪問頁表,確定所存取的資料或指令的物理地址,第二次才根據該地址存取資料或指令。顯然,這種方法比通常執行指令的速度慢了一半。

為此,在地址變換機構中增設了一個具有並行尋找能力的高速緩衝儲存空間——快表,又稱聯想寄存器(TLB),用來存放當前訪問的若干頁表項,以加速地址變換的過程。與此對應,主存中的頁表也常稱為慢表,配有快表的地址變換機構如圖3-10所示。



圖3-10  具有快表的地址變換機構
在具有快表的分頁機制中,地址的變換過程: CPU給出邏輯地址後,由硬體進行地址轉換並將頁號送入快取寄存器,並將此頁號與快表中的所有頁號進行比較。 如果找到匹配的頁號,說明所要訪問的頁表項在快表中,則直接從中取出該頁對應的頁框號,與頁內位移量拼接形成物理地址。這樣,存取資料僅一次訪存便可實現。 如果沒有找到,則需要訪問主存中的頁表,在讀出頁表項後,應同時將其存入快表,以便後面可能的再次訪問。但若快表已滿,則必須按照一定的演算法對舊的頁表項進行替換。
注意:有些處理機設計為快表和慢表同時尋找,如果在快表中尋找成功則終止慢表的尋找。

一般快表的命中率可以達到90%以上,這樣,分頁帶來的速度損失就降低到10%以下。快表的有效性是基於著名的局部性原理,這在後面的虛擬記憶體中將會具體討論。 4) 兩級頁表 第二個問題:由於引入了分頁管理,進程在執行時不需要將所有頁調入記憶體頁框中,而只要將儲存有映射關係的頁表調入記憶體中即可。但是我們仍然需要考慮頁表的大小。 以32 位邏輯地址空間、頁面大小4KB、頁表項大小4B為例,若要實現進程對全部邏輯地址空間的映射,則每個進程需要2^20,約100萬個頁表項。也就是說,每個進程僅頁表這一項就需要4MB主存空間,這顯然是不切實際的。而即便不考慮對全部邏輯地址空間進行映射的情況,一個邏輯地址空間稍大的進程,其頁表大小也可能是過大的。 以一個40MB的進程為例,頁表項共40KB,如果將所有頁表項內容儲存在記憶體中,那麼需要10個記憶體頁框來儲存整個頁表。整個進程大小約為1萬個頁面,而實際執行時只需要幾十個頁面進入記憶體頁框就可以運行,但如果要求10個頁面大小的頁表必須全部進入記憶體,這相對實際執行時的幾十個進程頁面的大小來說,肯定是降低了記憶體利用率的;從另一方面來說,這10頁的頁表項也並不需要同時儲存在記憶體中,因為大多數情況下,映射所需要的頁表項都在頁表的同一個頁面中。

將頁表映射的思想進一步延伸,就可以得到二級分頁:將頁表的10頁空間也進行地址映射,建立上一級頁表,用於儲存頁表的映射關係。這裡對頁表的10個頁面進行映射只需要10個頁表項,所以上一級頁表只需要1頁就足夠(可以儲存2^10=1024個頁表項)。在進程執行時,只需要將這1頁的上一級頁表調入記憶體即可,進程的頁表和進程本身的頁面,可以在後面的執行中再i周入記憶體。

如圖3-11所示,這是Intel處理器80x86系列的硬體分頁的地址轉換過程。在32位系統中,全部32位邏輯地址空間可以分為2^20(4GB/4KB)個頁面。這些頁面可以再進一步建立頂級頁表,需要2^10個頂級頁表項進行索引,這正好是一頁的大小,所以建立二級頁表即可。



圖3-11  硬體分頁地址轉換
舉例,32位系統中進程分頁的工作過程:假定核心已經給一個正在啟動並執行進程分配的邏輯地址空間是0x20000000到0x2003FFFF,這個空間由64個頁面組成。在進程運行時,我們不需要知道全部這些頁的頁框的物理地址,很可能其中很多頁還不在主存中。這裡我們只注意在進程運行到某一頁時,硬體是如何計算得到這一頁的頁框的物理地址即可。現在進程需要讀邏輯地址0x20021406中的位元組內容,這個邏輯地址按如下進行處理:
    邏輯地址: 0x20021406 (0010 0000 0000 0010 0001 0100 0000 0110 B)
    頂級頁表欄位:0x80 (00 1000 0000 B)
    二級頁表欄位:0x21 (00 0010 0001B)
    頁內位移量欄位:0x406  (0100 0000 0110 B)

頂級頁表欄位的0x80用於選擇頂級頁表的第0x80表項,此表項指向和該進程的頁相關的二級頁表;二級頁表欄位0x21用於選擇二級頁表的第0x21表項,此表項指向包含所需頁的頁框;最後的頁內位移量欄位0x406用於在目標頁框中讀取位移量為0x406中的位元組。

這是32位系統下比較實際的一個例子。看似較為複雜的例子,有助於比較深入地理解,希望讀者能自己動手計算一遍轉換過程。

建立多級頁表的目的在於建立索引,這樣不用浪費主存空間去儲存無用的頁表項,也不用盲目地順序式尋找頁表項,而建立索引的要求是最高一級頁表項不超過一頁的大小。在 64位作業系統中,頁表的劃分則需要重新考慮,這是很多教材和輔導書中的常見題目,但是很多都給出了錯誤的分析,需要注意。

我們假設仍然釆用4KB頁面大小。位移量欄位12位,假設頁表項大小為8B。這樣,其上一級分頁時,每個頁框只能儲存29(4KB/8B)個頁表項,而不再是210個,所以上一級頁表欄位為9位。後面同理繼續分頁。64=12+9+9+9+9+9+7,所以需6級分頁才能實現索引。很多書中仍然按4B頁表項分析,雖然同樣得出6級分頁的結果,但顯然是錯誤的。這裡給出兩個實際的64位作業系統的分頁層級(注意:裡面沒有使用全部64位定址,不過由於地址位元組對齊的設計考慮,仍然使用8B大小的頁表項),理解了表3-2中的分級方式,相信對多級分頁就非常清楚了。

表3-2 兩種系統的分級方式
平台 頁面大小 定址位元 分頁級數 具體分級
Alpha 8KB 43 3 13+10+10+10
X86_64 4 KB 48 4 12+9+9+9+9
基本分段儲存管理方式 分頁管理方式是從電腦的角度考慮設計的,以提高記憶體的利用率,提升電腦的效能, 且分頁通過硬體機制實現,對使用者完全透明;而

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.