計算機作業系統(第四版)之儲存器管理要點梳理
儲存器管理
儲存器的層次結構
多層結構的儲存器系統
- 儲存器的多層結構。
儲存層次至少應具有三級:最高層為 CPU 暫存器,中間為主存,最底層是輔存。還可以根據具體的功能分工細劃為暫存器、快取記憶體、主儲存器、磁碟快取、固定磁碟、可移動儲存介質等 6 層。在儲存層次中越往上,儲存介質的訪問速度越快,價格也越高,相對儲存容量也越小。
暫存器、快取記憶體、主儲存器和磁碟快取均屬於作業系統儲存管理的管轄範疇,掉電後它們儲存的資訊不再存在。固定磁碟和可移動儲存介質屬於裝置管理的管轄範疇,它們儲存的資訊將被長期儲存。 - 可執行儲存器。
暫存器和主儲存器又被稱為可執行儲存器。
主儲存器與暫存器
- 主儲存器。
主儲存器簡稱記憶體或主存。由於主儲存器的訪問速度遠低於 CPU 執行指令的速度,為緩和這一矛盾,在計算機系統中引入了暫存器和快取記憶體。 - 暫存器。
暫存器具有與處理機相同的速度。主要用於存放處理機執行時的資料。如用暫存器存放運算元,或用作地址暫存器加快地址轉換速度等。
快取記憶體和磁碟快取
- 快取記憶體。
快取記憶體是介於暫存器和儲存器之間的儲存器,主要用於備份主存中較常用的資料。其容量遠大於暫存器,而比記憶體約小兩到三個數量級左右。
根據程式執行的區域性性原理(即程式在執行時將呈現出區域性性規律,在一較短的時間內,程式的執行僅侷限於某個部分),將主存中一些經常訪問的資訊存放在快取記憶體中。當 CPU 訪問一組特定資訊時,首先檢查它是否在快取記憶體中,在則直接取出使用,否則再從主存中讀取。 - 磁碟快取。
由於目前磁碟的 I/O 速度遠低於對主存的訪問速度,因此將頻繁使用的一部分磁碟資料和資訊,暫時存放在磁碟快取中,可減少訪問磁碟的次數。但磁碟快取與快取記憶體不同,它本身並不是一種實際存在的儲存介質,而是利用主存中的部分儲存空間暫存從磁碟中讀出(或寫入)的資訊。
程式的裝入和連結
使用者程式要在系統中執行,必須先將它裝入記憶體,然後再將其轉變為一個可以執行的程式,通常都要經過以下幾個步驟:
1)編譯,由編譯程式將使用者原始碼編譯成若干個目標模組。
2)連結,由連結程式將編譯後形成的一組目標模組,以及它們所需要的庫函式連結在一起,形成一個完整的裝入模組。
3)裝入,由裝入程式將裝入模組裝入記憶體。
程式的裝入
- 絕對裝入方式。
僅能執行單道程式時可以採用該種方式。裝入模組被裝入記憶體後,程式中的邏輯地址與實際記憶體地址完全相同。 - 可重定位裝入方式。
採用可重定位裝入方式,根據記憶體的當前情況,將裝入模組裝入到記憶體的適當位置。值得注意的是,在採用可重定位裝入程式將裝入模組裝入記憶體後,會使裝入模組中的所有邏輯地址與實際裝入記憶體的實體地址不同。通常是把在裝入時對目標程式中指令和資料地址的修改過程稱為重定位。又因為地址變換通常是在裝入時一次完成的,以後不再改變,故稱為靜態重定位。 - 動態執行時裝入方式。
動態執行時的裝入程式在把裝入模組裝入記憶體後,並不立即把裝入模組中的相對地址轉換為絕對地址,而是把這種地址轉換推遲到程式真正要執行時才進行。因此,裝入記憶體後的所有地址都仍是相對地址。為使地址轉換不影響指令的執行速度,這種方式需要一個重定位暫存器的支援。
程式的連結
- 靜態連結方式。
在程式執行之前,先將各目標模組及它們所需的庫函式,連結成一個完整的裝配模組,以後不再拆開。在將這幾個目標模組裝配成一個裝入模組時,須解決以下兩個問題:
1)對相對地址進行修改。這是因為在由編譯程式所產生的所有目標模組中,使用的都是相對地址,其起始地址都為 0,每個模組中的地址都是相對於起始地址計算的。
2)變換外部呼叫符號。將每個模組中所用的外部呼叫符號也都變換為相對地址。
這種先進行連結所形成的一個完整的裝入模組,又稱為可執行檔案。 - 裝入時動態連結。
指使用者源程式經編譯後所得的目標模組,在裝入記憶體時採用邊裝入邊連結的連結方式。這樣便於裝入前修改和更新,以及實現對目標模組的共享。 - 執行時動態連結。
將對某些模組的連結推遲到程式執行時才進行連結,亦即,在執行過程中,當發現一個被呼叫模組尚未裝入記憶體時,立即由 OS 去找到該模組並將之裝入記憶體,把它連結到呼叫者模組上。凡在執行過程中未被用到的目標模組,都不會被調入記憶體和被連結到裝入模組上,這樣不僅可加快程式的裝入過程,而且可節省大量的記憶體空間。
連續分配儲存管理方式
為了能將使用者程式裝入記憶體,必須為它分配一定大小的記憶體空間。
單一連續分配
只能用於單道程式環境下,整個記憶體的使用者空間由一個程式獨佔。
固定分割槽分配
將記憶體使用者空間劃分為若干個固定大小的區域,在每個分割槽中只裝入一道作業。
- 劃分分割槽的方法。
分割槽大小相等、分割槽大小不等。 - 記憶體分配。
通常將分割槽按大小進行排隊,併為之建立一張分割槽使用表,其中各表項包括每個分割槽的起始地址、大小及狀態(是否已分配)。當有一使用者程式要裝入時,由記憶體分配程式檢索該表,從中找出一個能滿足要求的、尚未分配的分割槽,將之分配給該程式,然後將該表項中的狀態置為“已分配”。
動態分割槽分配
又稱可變分割槽分配。
- 動態分割槽分配中的資料結構。
常用的資料結構有以下兩種形式:
空閒分割槽表,表目:分割槽號、分割槽大小、分割槽始址、狀態。
空閒分割槽鏈,在每個分割槽的起始部分設定一些用於控制分割槽分配的資訊,以及用於連結各分割槽所用的前向指標;在分割槽尾部則設定一後向指標,以及前後都重複設定狀態位和分割槽大小表目。通過前、後向連結指標,可將所有的空閒分割槽連結成一個雙向鏈。 - 動態分割槽分配演算法。
順序式搜尋演算法、索引式搜尋演算法。 - 分割槽分配操作。
1)分配記憶體:
系統應利用某種分配演算法,從空閒分割槽鏈(表)中找到所需大小的分割槽。設請求的分割槽大小為 u.size,表中每個空閒分割槽的大小可表示為 m.size。若 m.size-u.size≤size(size 是事先規定的不再切割的剩餘分割槽的大小),說明多餘部分太小,可不再切割,將整個分割槽分配給請求者;否則(即多餘部分超過 size),從該分割槽中按請求的大小劃分出一塊記憶體空間分配出去,餘下的部分仍留在空閒分割槽鏈(表)中。然後,將分配區的首址返回給呼叫者。
2)回收記憶體:
當程序執行完畢釋放記憶體時,系統根據回收區的首址,從空閒區鏈(表)中找到相應的插入點,此時可能出現以下四種情況之一:
①回收區與插入點的前一個空閒分割槽相鄰接,此時應將回收區與插入點的前一分割槽合併。
②回收分割槽與插入點的後一空閒分割槽相鄰接,此時也可將兩分割槽合併。
③回收區同時與插入點的前、後兩個分割槽鄰接,此時將三個分割槽合併。
④回收區既不與前一個鄰接,又不與後一個鄰接,這時應為回收區單獨建立一新表項,填寫回收區的首址和大小,並根據其首址插入到空閒鏈中的適當位置。
基於順序搜尋的動態分割槽分配演算法
順序搜尋,是指依次搜尋空閒分割槽鏈上的空閒分割槽,去尋找一個其大小能滿足要求的分割槽。
碎片:記憶體空間不斷被劃分,會留下許多難以利用的、很小的空閒分割槽。
- 首次適應演算法。
要求空閒分割槽鏈以地址遞增的次序連結。在分配記憶體時,從鏈首開始順序查詢,直至找到一個大小能滿足要求的空閒分割槽為止,缺點是低址部分會不斷被劃分,形成碎片。 - 迴圈首次適應演算法。
在為程序分配記憶體空間時,不再是每次都從鏈首開始查詢,而是從上次找到的空閒分割槽的下一個空閒分割槽開始查詢。實現可通過設定一起始查尋指標,用於指示下一次起始查尋的空閒分割槽,並採用迴圈查詢方式。缺點缺乏大的空閒分割槽。 - 最佳適應演算法。
總是把能滿足要求、又是最小的空閒分割槽分配給作業,為了加速尋找,該演算法要求將所有的空閒分割槽按其容量以從小到大的順序形成一空閒分割槽鏈。缺點產生許多碎片。 - 最壞適應演算法。
在掃描整個空閒分割槽表或連結串列時,總是挑選一個最大的空閒區,分割一部分空間給作業使用。要求將所有的空閒分割槽按其容量以從大到小的順序形成一空閒分割槽鏈,查詢時只要看第一個分割槽能否滿足作業要求即可。缺點缺乏大的空閒分割槽。
基於索引搜尋的動態分割槽分配演算法
- 快速適應演算法。
又稱為分類搜尋法。是將空閒分割槽根據其容量大小進行分類,對於每一類具有相同容量的所有空閒分割槽,單獨設立一個空閒分割槽連結串列,同時在記憶體中設立一張管理索引表,該表的每一個表項對應了一種空閒分割槽型別,並記錄了該型別空閒分割槽連結串列表頭的指標。
該演算法僅需要根據程序的長度,尋找到能容納它的最小空閒區連結串列,並取下第一塊進行分配即可。在分配過程中,不會對任何分割槽產生分割。 夥伴系統。
規定,無論已分配分割槽或空閒分割槽,其大小均為 2 的 k 次冪(k 為整數,l≤k≤m)。通常 2^m是整個可分配記憶體的大小。
對於每一類具有相同大小的所有空閒分割槽,單獨設立一個空閒分割槽雙向連結串列。
當需要為程序分配一個長度為 n 的儲存空間時,首先計算一個 i 值,使 2^(i-1) < n ≤ 2^i,然後在空閒分割槽大小為 2^i 的空閒分割槽連結串列中查詢。若找到則直接分配。否則,則在分割槽大小為 2^(i+1) 的空閒分割槽連結串列中尋找。若存在 2^(i+1) 的一個空閒分割槽,則把該空閒分割槽分為相等的兩個分割槽,這兩個分割槽稱為一對夥伴,其中的一個分割槽用於分配,而把另一個加入分割槽大小為 2^i 的空閒分割槽連結串列中。若仍然找不到,依次類推去尋找更高1次冪的分割槽。
與一次分配可能要進行多次分割一樣,一次回收也可能要進行多次合併,如回收大小為 2^i的空閒分割槽時,若事先已存在回收塊所對應的2^i夥伴塊的空閒分割槽時,則應將其與夥伴分割槽合併為大小為2^(i+1)的空閒分割槽,若事先已存在新合併空閒塊對應的2^(i+1)夥伴塊的空閒分割槽時,依次類推合併。
對於一個大小為2^k,地址為x的記憶體塊,其夥伴塊的地址則用buddy k (x)表示,其通式為:
if(x MOD 2^(k+1) == 0) {
buddy k (x) = x + 2^k;
}
else if(x MOD 2^(k+1) == 2^k) {
buddy k (x) = x - 2^k;
}
雜湊演算法。
構造一張以空閒分割槽大小為關鍵字的雜湊表,該表的每一個表項記錄了一個對應的空閒分割槽連結串列表頭指標。
動態可重定位分割槽分配
- 緊湊。
在連續分配方式中,必須把一個系統或使用者程式裝入一連續的記憶體空間。當一臺計算機運行了一段時間後,它的記憶體空間將會被分割成許多小的分割槽,而缺乏大的空閒分割槽。
通過移動記憶體中作業的位置,以把原來多個分散的小分割槽拼接成一個大分割槽的方法,稱為“拼接”或“緊湊”。由於經過緊湊後的某些使用者程式在記憶體中的位置發生了變化。為此,在每次“緊湊”後,都必須對移動了的程式或資料進行重定位。 - 動態重定位。
在動態執行時裝入的方式中,作業裝入記憶體後的所有地址都仍然是相對(邏輯)地址,將相對地址轉換為實體地址的工作,被推遲到程式指令要真正執行時進行。
地址變換過程是在程式執行期間,隨著對每條指令或資料的訪問藉助重定位暫存器自動進行的,故稱為動態重定位。當系統對記憶體進行了“緊湊”而使若干程式從記憶體的某處移至另一處時,不需對程式做任何修改,只要用該程式在記憶體的新起始地址,去置換原來的起始地址即可。 - 動態重定位分割槽分配演算法。
動態重定位分割槽分配演算法與動態分割槽分配演算法基本上相同,差別僅在於:在這種分配演算法中,增加了緊湊的功能。
對換
多道程式環境下的對換技術
- 對換的引入。
所謂“對換”,是指把記憶體中暫時不能執行的程序或者暫時不用的程式和資料調出到外存上,以便騰出足夠的記憶體空間,再把已具備執行條件的程序或程序所需要的程式和資料調入記憶體。 - 對換的型別。
1)整體對換。
處理機中級排程實際上就是儲存器的對換功能。其目的用於解決記憶體緊張問題。由於中級排程是以程序為單位的,故又稱之為“程序對換”或“整體對換”。
2)頁面(分段)對換。
以程序的一個“頁面”或“分段”為單位進行的,分別稱為“頁面對換”、“分段對換”,又統稱為“部分對換”。
在此,我們只介紹程序對換,而分頁或分段對換將放在虛擬儲存器中介紹。
對換空間的管理
- 對對換空間管理的主要目標。
在具有對換功能的 OS 中,通常把外存分為檔案區和對換區。
1)對檔案區管理的主要目標。
是提高檔案儲存空間的利用率,為此,對檔案區採取離散分配方式。
2)對對換區管理的主要目標。
對換操作較頻繁。故是提高程序換入和換出的速度。為此,採取的是連續分配方式,較少考慮外存中的碎片問題。 - 對換空間空閒盤塊管理中的資料結構。
與動態分割槽分配方式中的資料結構相似,即空閒分割槽表或空閒分割槽鏈。在每個表目中包含兩項:對換區的首址及其大小,分表用盤塊號和盤塊數表示。 - 對換空間的分配與回收。
與動態分割槽分配方式中記憶體分配與回收方法雷同。
程序的換出與換入
- 程序的換出。
換出過程:
1)選擇被換出的程序。首先選擇處於阻塞或睡眠狀態的程序,如果有多個,則選擇優先順序最低的程序。在有的系統除了考慮優先順序,還需考慮程序在記憶體的駐留時間。如果系統中已無阻塞程序且記憶體仍不足時,則選擇優先順序最低的就緒程序換出。
2)程序換出過程。只能換出非共享的程式和資料段,對於共享的只要還有程序需要,就不能換出。在進行換出時,①需要申請對換空間。②若申請成功,就啟動磁碟,將該程序的程式和資料傳送到磁碟的對換區上。③若傳送成功,便可回收該程序所佔的記憶體空間,並對該程序的PCB和記憶體分配表等進行相應的修改,若還有可換出程序,則繼續換出,直至記憶體中再無阻塞程序為止。 - 程序的換入。
定時執行換入操作。找出“就緒”狀態但已換出的程序,將其中換出時間最久的程序作為換入程序,為它申請記憶體。若申請成功則調入,若失敗則需先將記憶體中的某些程序換出,再將程序換入。直到外存中再無“就緒且換出”狀態的程序為止,或者已無足夠的記憶體來換入程序時,對換程序停止換入。
分頁儲存管理方式
基於允許將一個程序直接分散地裝入到許多不相鄰接的分割槽中,則無須再進行“緊湊” 的思想而產生了離散分配方式。分為以下三種:
1)分頁儲存管理方式:將使用者程式的地址空間分為若干個固定大小的區域,稱為“頁”或者“頁面”。也將記憶體空間分為若干個物理塊或頁框,頁和框的大小相同。
2)分段儲存管理方式:把使用者程式的地址空間分為若干個大小不同的段。分配以段為單位。
3)段頁式儲存管理方式:是分頁和分段兩種儲存方式相結合的產物。
分頁儲存管理的基本方法
- 頁面和物理塊。
1)頁面:將一個程序的邏輯地址空間分成若干個大小相等的片,稱為頁面或頁,併為各頁加以編號。相應地,也把記憶體的物理空間分成若干個塊,併為各塊加以編號。在為程序分配記憶體時,以塊為單位將程序中的若干個頁分別裝入到多個可以不相鄰接的物理塊中。由於程序的最後一頁經常裝不滿一塊而形成了不可利用的碎片,稱之為“頁內碎片”。
2)頁面大小:頁面的大小應選擇適中,且頁面大小應是 2 的冪,通常為 1 KB~8 KB。 - 地址結構。
邏輯地址的地址結構如下:
含有兩部分:前一部分為頁號 P,後一部分為位移量 W(或稱為頁內地址)。圖中的地址長度為 32 位,其中 0~11 位為頁內地址,即每頁的大小為 4 KB;12~31 位為頁號,即地址空間最多允許有 1 M 頁。可見系統中允許的最大程序為4kb * 2^20 = 4GB。
對於某特定機器,其地址結構是一定的。若給定一個邏輯地址空間中的地址為 A,頁面的大小為 L,則頁號 P 和頁內地址 d 可按下式求得:
其中,INT 是整除函式,MOD 是取餘函式。例如,其系統的頁面大小為 1 KB,設 A = 2170 B,則由上式可以求得 P = 2,d = 122。 - 頁表。
為保證程序的正確執行,即能在記憶體中找到每個頁面所對應的物理塊。為此,系統又為每個程序建立了一張頁面映像表,簡稱頁表。在程序地址空間內的所有頁,依次在頁表中有一頁表項,其中記錄了相應頁在記憶體中對應的物理塊號。可見,頁表的作用是實現從頁號到物理塊號的地址對映。
地址變換機構
實現從邏輯地址到實體地址的轉換。由於頁內地址和實體地址是一一對應的(例如,對於頁面大小是 1 KB 的頁內地址是 0~1023,其相應的物理塊內的地址也是 0~1023,無須再進行轉換),因此,地址變換機構的任務實際上只是將邏輯地址中的頁號,轉換為記憶體中的物理塊號。又因為頁面對映表的作用就是用於實現從頁號到物理塊號的變換,因此,地址變換任務是藉助於頁表來完成的。
- 基本的地址變換機構。
頁表大多駐留在記憶體中。在系統中只設置一個頁表暫存器 PTR,在其中存放頁表在記憶體的始址和頁表的長度。平時,程序未執行時,頁表的始址和頁表長度存放在本程序的 PCB 中。當排程程式排程到某程序時,才將這兩個資料裝入頁表暫存器中。因此,在單處理機環境下,雖然系統中可以執行多個程序,但只需一個頁表暫存器。
當程序要訪問某個邏輯地址中的資料時,分頁地址變換機構會自動地將有效地址(相對地址)分為頁號和頁內地址兩部分,再以頁號為索引去檢索頁表。查詢操作由硬體執行。在執行檢索之前,先將頁號與頁表長度進行比較,如果頁號大於或等於頁表長度,則表示本次所訪問的地址已超越程序的地址空間。於是,這一錯誤將被系統發現併產生一地址越界中斷。若未出現越界錯誤,則將頁表始址與頁號和頁表項長度的乘積相加,便得到該表項在頁表中的位置,於是可從中得到該頁的物理塊號,將之裝入實體地址暫存器中。與此同時,再將有效地址暫存器中的頁內地址送入實體地址暫存器的塊內地址欄位中。這樣便完成了從邏輯地址到實體地址的變換。
- 具有快表的地址變換機構。
由於頁表是存放在記憶體中的,這使CPU在每存取一個數據時,都要兩次訪問記憶體。第一次是訪問記憶體中的頁表,從中找到指定頁的物理塊號,再將塊號與頁內偏移量W拼接,以形成實體地址。第二次訪問記憶體時,才是從第一次所得地址中獲得所需資料。
為了提高地址變換速度,可在地址變換機構中增設一個具有並行查尋能力的特殊高速緩衝暫存器,又稱為“聯想暫存器”,或稱為“快表”,在 IBM 系統中又取名為 TLB,用以存放當前訪問的那些頁表項。此時的地址變換過程是:在 CPU 給出有效地址後,由地址變換機構自動地將頁號 P 送入高速緩衝暫存器,並將此頁號與快取記憶體中的所有頁號進行比較,若其中有與此相匹配的頁號,便表示所要訪問的頁表項在快表中。於是,可直接從快表中讀出該頁所對應的物理塊號,並送到實體地址暫存器中。如在塊表中未找到對應的頁表項,則還須再訪問記憶體中的頁表,找到後,把從頁表項中讀出的物理塊號送地址暫存器;同時,再將此頁表項存入快表的一個暫存器單元中,亦即,重新修改快表。但如果聯想暫存器已滿,則 OS 必須找到一個老的且已被認為不再需要的頁表項,將它換出。
由於成本的關係,快表不可能做得很大,通常只存放 16~512 個頁表項,如果頁面大小為4kb,那麼支援的最大程序為2 MB,這對中、小型作業來說,已有可能把全部頁表項放在快表中。據統計,從快表中能找到所需頁表項的機率可達 90%以上。
訪問記憶體的有效時間
從程序發出指定邏輯地址的訪問請求,經過地址變換,到在記憶體中找到對應的實際實體地址單元並取出資料,所需要花費的總時間,稱為記憶體的有效訪問時間(EAT)。
假設訪問一次記憶體的時間為t,在基本分頁儲存管理方式中,有效訪問時間分為第一次訪問記憶體時間(即查詢頁表對應的頁表項所耗費的時間t)與第二次訪問記憶體時間(即訪問頁表項中的物理塊號與頁內地址所拼接成的實際實體地址所耗費的時間t)之和: EAT = t + t = 2t;
在快表中查詢到所需表項存在著命中率的問題。所謂命中率,是指使用快表並在其中成功查詢到所需頁面的表項的比率。
則:EAT = а×λ + (t+λ)(1-а) + t = 2t + λ - t×а;
上式中,λ表示查詢快表所需要的時間,а表示命中率,t表示訪問一次記憶體所需要的時間。
兩級和多級頁表
現代的大多數計算機系統,都支援非常大的邏輯地址空間,因此頁表就變得非常大,要佔用相當大的記憶體空間。因為每個頁表項佔用一個位元組,故頁表長度 * 1位元組就是頁表所佔的記憶體空間大小。且頁表記憶體空間還要求是連續的,顯然這是不現實的。解決方法:
(1) 對於頁表所需的記憶體空間,可採用離散分配方式來解決難以找到一塊連續的大記憶體空間的問題;
(2) 只將當前需要的部分頁表項調入記憶體,其餘的頁表項仍駐留在磁碟上,需要時再調入。
- 兩級頁表。
將頁表進行分頁,然後離散地將各個頁面分別存放在不同的物理塊中。也要為離散分配的頁表再建立一張頁表,稱為外層頁表,在每個頁表項中記錄了頁表頁面的物理塊號。
以前面的 32 位邏輯地址空間為例來說明,當頁面大小為 4 KB 時,採用兩級頁表結構時,再對頁表進行分頁,使每頁中包含 2^10 (即 1024)個頁表項,最多允許有 2^10個頁表分頁。此時的邏輯地址結構如下:
在頁表的每個表項中存放的是程序的某頁在記憶體中的物理塊號,而在外層頁表的每個頁表項中,所存放的是某頁表分頁的在記憶體中的物理塊號。可以利用外層頁表和頁表這兩級頁表,來實現從程序的邏輯地址到記憶體中實體地址間的變換。在地址變換機構中同樣需要增設一個外層頁表暫存器,用於存放外層頁表的始址,並利用邏輯地址中的外層頁號,找到指定頁表分頁的始址,再根據外層頁內地址找到指定的頁表項,再從該頁表項中讀出該頁在記憶體中的物理塊號。
雖然解決了對大頁表無需大片連續儲存空間的問題,但並未解決用較少的記憶體空間去存放大頁表的問題。只用離散分配空間的辦法並未減少頁表所佔用的記憶體空間。解決方法是把當前需要的一批頁表項調入記憶體,以後再根據需要陸續調入。在採用兩級頁表結構的情況下,對於正在執行的程序,必須將其外層頁表調入記憶體,而對頁表則只需調入一頁或幾頁。為了表徵某頁的頁表是否已經調入記憶體,還應在外層頁表項中增設一個狀態位 S,其值若為 0,表示該頁表分頁尚未調入記憶體;否則,
說明其分頁已在記憶體中。程序執行時,地址變換機構根據邏輯地址中的外層頁號 P1,去查詢外層頁表;若所找到的頁表項中的狀態位為 0,則產生一中斷訊號,請求 OS 將該頁表分頁調入記憶體。關於請求調頁的詳細情況,這是下一章虛擬儲存器中的知識。 - 多級頁表。
對於 32 位的機器,採用兩級頁表結構是合適的;但對於 64 位的機器,必須採用多級頁表,將外層頁表再進行分頁。
反置頁表
- 反置頁表的引入
在現代計算機系統中,通常允許一個程序的邏輯地址空間非常大,因此就需要有許多的頁表項,而因此也會佔用大量的記憶體空間。 引入反置頁表,一般頁表的頁表項是按頁號進行排序的,頁表項中的內容是物理塊號。而反置頁表則是為每一個物理塊設定一個頁表項,並按物理塊的編號排序。其中的內容是頁號和其所隸屬程序的識別符號。 - 地址變換。
利用反置頁表進行地址變換時,是根據程序識別符號和頁號,去檢索反置頁表。如果檢索到與之匹配的頁表項,則該頁表項(中)的序號i便是該頁所在的物理塊號,可用該塊號與頁內地址一起構成實體地址送記憶體地址暫存器。
在反置頁表可能只包含已經調入記憶體中的頁面,並未包含尚未調入記憶體的頁面。因此還必須為每個程序建立一個外部頁表。當發現所需之頁面不在記憶體時,因在外部頁表中包含了各個頁面在外存的實體地址,通過它可將所需之頁面調入記憶體。
當記憶體容量很大時,也表項的數目還是會非常大的。要利用程序識別符號和頁號去檢索這樣大的一個線性表是相當費時的。可利用Hash演算法來進行檢索,可以很快找到在反置頁表中相應頁表項,不過可能會出現所謂的“地址衝突”。
分段儲存管理方式
如果說推動儲存管理方式從固定分割槽到動態分割槽分配,進而又發展到分頁儲存管理方式的主要動力,是提高記憶體利用率,那麼,引入分段儲存管理方式的目的,則主要是為了滿足使用者(程式設計師)在程式設計和使用上多方面的要求。
分段儲存管理方式的引入
- 方便程式設計。
通常,使用者把自己的作業按照邏輯關係劃分為若干個段。程式設計師們都迫切地需要訪問的邏輯地址是由段名(段號)和段內偏移量(段內地址)決定的。 - 資訊共享。
實現對程式和資料的共享時,是以資訊的邏輯單位為基礎的。分頁系統中的“頁”只是存放資訊的物理單位(塊),並無完整的意義。而段卻是資訊的邏輯單位,因此可以為該被共享過程建立一個獨立的段,極大地簡化了共享的實現。 - 資訊保護。
資訊保護同樣是對資訊的邏輯單位進行保護的。在分頁系統中,一個函式可能要佔用若干個頁面,而且其中的第一個和最後一個頁面還會裝有其它程式段的資料,它們可能有著不同的保護屬性。 - 動態增長。
- 動態連結。
執行時動態連結要求的是以目標程式(即段)作為連結的基本單位,因此,分段儲存管理方式非常適合動態連結。
分段系統的基本原理
- 分段。
作業的地址空間被劃分為若干個段,每個段定義了一組邏輯資訊。每個段都從 0 開始編址,並採用一段連續的地址空間。段的長度由相應的邏輯資訊組的長度決定,因而各段長度不等。整個作業的地址空間由於是分成多個段,因而呈現出二維特性。其邏輯地址由短號和段內地址組成。
- 段表。
在分段式儲存管理系統中,則是為每個分段分配一個連續的分割槽,而程序中的各個段可以離散地移入記憶體中不同的分割槽中。在系統中為每個程序建立一張段對映表,簡稱“段表”。每個段在表中佔有一個表項,其中記錄了該段在記憶體中的起始地址(又稱為“基址”)和段的長度。可見,段表是用於實現從邏輯段到實體記憶體區的對映。 - 地址變換機構。
為了實現從程序的邏輯地址到實體地址的變換功能,在系統中設定了段表暫存器,用於存放段表始址和段表長度 TL。在進行地址變換時,系統將邏輯地址中的段號與段表長度TL 進行比較。若 S>TL,表示段號太大,是訪問越界,於是產生越界中斷訊號;若未越界,則根據段表的始址和該段的段號,計算出該段對應段表項的位置,從中讀出該段在記憶體的起始地址,然後,再檢查段內地址 d 是否超過該段的段長 SL。若超過,即 d>SL,同樣發出越界中斷訊號;若未越界,則將該段的基址與段內地址相加,即可得到要訪問的記憶體實體地址。
像分頁系統一樣,當段表放在記憶體中時,每要訪問一個數據,都須訪問兩次記憶體,從而極大地降低了計算機的速率。解決的方法也和分頁系統類似,再增設一個聯想儲存器,用於儲存最近常用的段表項。 - 分頁和分段的主要區別。
相似之處:
兩者都採用離散分配方式,且都要通過地址對映機構來實現地址變換。
不同:
1)頁是資訊的物理單位,分頁是為了提高記憶體的利用率。段則是資訊的邏輯單位,分段的目的是為了能更好地滿足使用者的需要。
2)頁的大小固定且由系統決定。而段的長度卻不固定,決定於使用者所編寫的程式。
3)分頁中使用者程式的的邏輯地址空間是一維的,分頁完全是系統的行為,只需要一個記憶符即可表示一個地址。而分段中使用者程式的邏輯地址空間是二維的,在標識一個地址時,既需給出段名, 又需給出段內地址(正是因為段的大小不固定導致的)。
資訊共享
- 分頁系統中對程式和資料的共享。
雖然也能實現對程式和資料的共享,但遠不如分段系統來得方便。 - 分段系統中對程式和資料的共享。
可重入程式碼又稱為“純程式碼”,是一種允許多個程序同時訪問的程式碼。可重入程式碼是一種不允許任何程序對它進行修改的程式碼。但事實上,大多數程式碼在執行時都可能有些改變。為此,在每個程序中,都必須配以區域性資料區,把在執行中可能改變的部分拷貝到該資料區,這樣,程式在執行時,只需對該資料區(屬於該程序私有)中的內容進行修改,並不去改變共享的程式碼,這時的可共享程式碼即成為可重入碼。
段頁式儲存管理方式
- 基本原理。
段頁式系統的基本原理是分段和分頁原理的結合,即先將使用者程式分成若干個段,再把每個段分成若干個頁,併為每一個段賦予一個段名。在段頁式系統中,其地址結構由段號、段內頁號及頁內地址三部分所組成。
為了實現從邏輯地址到實體地址的變換,系統中需要同時配置段表和頁表。段表的內容與分段系統略有不同,它不再是記憶體始址和段長,而是頁表始址和頁表長度。即一個分段對應一個頁表。 - 地址變換過程。
為了便於實現地址變換,須配置一個段表暫存器,其中存放段表始址和段長TL。進行地址變換時,首先利用段號S,將它與段長TL進行比較。若S < TL,表示未越界,於是利用段表始址和段號來求出該段所對應的段表項在段表中的位置,從中得到該段的頁表始址,並利用邏輯地址中的段內頁號P來獲得對應頁的頁表項位置,從中讀出該頁所在的物理塊號b,再利用塊號b和頁內地址來構成實體地址。
在段頁式系統中,為了獲得一條指令或資料,須三次訪問記憶體。第一次訪問是訪問記憶體中的段表,從中取得頁表始址;第二次訪問是訪問記憶體中的頁表,從中取出該頁所在的物理塊號,並將該塊號與頁內地址一起形成指令或資料的實體地址;第三次訪問才是真正從第二次訪問所得的地址中,取出指令或資料。
解決方法仍類似快表。在地址變換機構中增
設一個高速緩衝暫存器。每次訪問它時,都須同時利用段號和頁號去檢索快取記憶體,若找到匹配的表項,便可從中得到相應頁的物理塊號,用來與頁內地址一起形成實體地址;若未找到匹配表項,則仍須再三次訪問記憶體。
繼續加油~