操作系統:離散分配存儲管理方式


離散分配方式

連續分配方式會形成許多外部碎片,雖然可通過“緊湊”方法將許多碎片拼接成可用的大塊空間,但緊湊的時間開銷和復雜度都很高。如果允許將一個進程直接分散地裝入到許多不相鄰接的分區中,便可充分地利用內存空間,也就是采用離散分配的方式。根據在離散分配時所分配地址空間的基本單位的不同,又可將離散分配分為以下三種:

  1. 分頁存儲管理方式:將用戶程序的地址空間分為若干個固定大小的“頁面”,也將內存空間分為若干個頁框,將用戶程序的任一頁放入任一物理塊中;
  2. 分段存儲管理方式:把用戶程序的地址空間分為若干個大小不同的段,以段為單位進行分配,這些段在內存中可以不相鄰接;
  3. 段頁式存儲管理方式:將分頁和分段兩種存儲管理方式相結合。

分頁存儲管理

分頁存儲的結構

分頁存儲管理將進程的邏輯地址空間分成若干個頁面,並為各頁加以編號。相應地也把內存的物理地址空間分成若干個物理塊,同樣也加以編號。在為進程分配內存時,以塊為單位,將進程中的若干個頁分別裝入到多個可以不相鄰接的物理塊中。若頁面大小設置得較小,可以減小內存碎片並提高內存利用率,但會造成每個進程占用較多的頁面,從而導致進程的頁表過長、占用大量內存和降低頁面換進換出的效率。如果選擇的頁面過大,雖然可以減少頁表的長度,提高頁面換進換出的速度,但卻又會使頁內碎片增大。因此頁面的大小應選擇適中,且頁面大小應是 2 的冪,通常為 1KB~8KB。
分頁地址中的地址長度為 32 位,地址結構包含兩部分內容。前一部分為頁號 P,占在 12 ~ 31 位,地址空間最多允許有 1M 頁。后一部分為位(偏)移量 W(頁內地址),占在 0 ~ 11 位,每頁的大小為 4KB。

對某特定機器的地址結構是一定的,若給定一個邏輯地址空間中的地址為 A,頁面的大小為 L,則頁號 P 和頁內地址 d 可按下式求得,其中 INT 是整除函數。例如系統的頁面大小為 1KB,設 A = 2170B,則由公式可以求得 P = 2,d = 122。

在分頁系統中,允許將進程的各個頁離散地存儲在內存的任一物理塊中。為了能在內存中找到每個頁面所對應的物理塊,系統又為每個進程建立了一張頁面映像表實現從頁號到物理塊號的地址映射,簡稱頁表。在進程地址空間內的所有頁(0 ~ n),依次在頁表中有一頁表項,其中記錄了相應頁在內存中對應的物理塊號。進程執行時通過查找該表,即可找到每頁在內存中的物理塊號。

基本的地址變換機構

為了能將用戶地址空間中的邏輯地址轉換為內存空間中的物理地址,在系統中必須設置地址變換機構。由於頁內地址和物理地址是一一對應的(例如對於頁面大小是 1KB 的頁內地址是 0 ~ 1023,其相應的物理塊內的地址也是 0 ~ 1023),因此地址變換機構的任務實際上只是將邏輯地址中的頁號轉換為內存中的物理塊號。
頁表大多駐留在內存中,在系統中只設置一個頁表寄存器 PTR(Page-Table Register),存放頁表在內存的始址和頁表的長度。平時,進程未執行時,頁表的始址和頁表長度存放在本進程的 PCB 中。當調度程序調度到某進程時,才將這兩個數據裝入頁表寄存器中。
當進程要訪問某個邏輯地址中的數據時,分頁地址變換機構會自動地將有效地址 A(相對地址)分為頁號 P 和頁內地址 W 兩部分。在執行檢索之前,先將頁號與頁表長度進行比較。如果頁號大於或等於頁表長度,則表示本次所訪問的地址已超越進程的地址空間,需要產生地址越界中斷。若未出現越界錯誤,則將頁表始址 F 與頁號 P 和頁表項長度 M 的乘積相加,便得到該表項在頁表中的位置,進而從頁表得到該頁的物理塊號。將塊號和頁內地址送入物理地址寄存器的塊內地址字段中,完成從邏輯地址到物理地址的變換。

例如若頁面大小 L 為 1K 字節,頁號 2 對應的內存塊號 b = 8,要將邏輯地址 A = 2500 轉換為物理地址 E。頁面大小為 1K 字節,說明一個頁面的大小為
2^10B = 1KB,首先根據公式計算出頁號、頁內偏移量:

頁號 P = A / L = 2500 / 1024 = 2
頁內偏移量 W = A % L = 2500 % 1024 = 452

根據題中條件可知,頁號 2 沒有越界,其存放的內存塊號 b = 8,即可計算出物理地址。

物理地址 E = b * L + W = 8 * 1024 + 425 = 8644

在分頁存儲管理(頁式管理)的系統中,只要確定了每個頁面的大小,邏輯地址結構就確定了。因此只要給出一個邏輯地址,系統就可以自動地算出頁號、頁內偏移量兩個部分,並不需要顯式地告訴系統。

反置頁表

反置頁表的引入

在分頁系統中為每個進程配置了一張頁表,進程邏輯地址空間中的每一頁在頁表中都對應有一個頁表項。在現代計算機系統中,通常允許一個進程的邏輯地址空間非常大,因此就需要有許多的頁表項,而因此也會占用大量的內存空間。為了減少頁表占用的內存空間,引入了反置頁表。反置頁表(Inverted Page Table)則為每一個物理塊設置一個頁表項,並將它們按物理塊的編號排序,其中的內容則是頁號和其所隸屬進程的標識符。

地址變換

在利用反置頁表進行地址變換時,是根據進程標識符和頁號檢索反置頁表。如果檢索到與之匹配的頁表項,則該頁表項(中)的序號 i 便是該頁所在的物理塊號,可用該塊號與頁內地址一起構成物理地址送內存地址寄存器。若檢索了整個反置頁表仍未找到匹配的頁表項,則表明此頁尚未裝入內存。對於不具有請求調頁功能的存儲器管理系統,此時則表示地址出錯。
然而在該表中只包含了已經調入內存的頁面,並未包含尚未調入內存的頁面,因此還必須為每個進程建立一個外部頁表。(External Page Table)。該頁表與傳統的頁表一樣,當所訪問的頁面在內存時,並不需要訪問外部頁表,僅當發現所需之頁面不在內存時才使用。在頁表中包含了各個頁在外存的物理位置,通過它可將所需之頁面調入內存。
由於在反置頁表中是為每一個物理塊設置一個頁表項,當內存容量很大時,頁表項的數目還是會非常大的。要利用進程標識符和頁號去檢索這樣大的一張線性表是相當費時的,可利用 Hash 算法來進行檢索。

快表

具有快表的地址變換機構

由於頁表是存放在內存中的,這使 CPU 在每存取一個數據時都要兩次訪問內存。第一次是訪問內存中的頁表找到物理塊號 b,再將塊號與頁內偏移量 W 拼接形成物理地址,第二次訪問內存時,才是從所得地址中讀寫數據。
為了提高地址變換速度,可在地址變換機構中增設一個具有並行查尋能力的特殊高速緩沖寄存器,又稱為“聯想寄存器”(Associative Memory)或“快表 TLB(Translation Look aside Buffer)”。在 CPU 給出有效地址 A 后,由地址變換機構自動地將頁號 P 送入 TLB 並和其中所有頁號進行比較。若其中有與此相匹配的頁號,便表示所要訪問的頁表項在 TLB 中,就可直接從快表中讀出對應的物理塊號 b。如在快表中未找到對應的頁表項,則還須再訪問內存中的頁表,找到后把從頁表項中讀出的物理塊號 b 送往地址寄存器,同時再將此頁表項存入 TLB 的一個寄存器單元中。但如果聯想寄存器已滿,則 OS 必須找到一個被認為是不再需要的頁表項將它換出。

由於查詢快表的速度比查詢頁表的速度快很多,因此只要快表命中就可以節省很多時間。雖然快表的容量有限,但是一般來說快表的命中率可以達到 90% 以上。

訪問內存的有效時間

從進程發出指定邏輯地址的訪問請求,經過地址變換,到在內存中找到對應的實際物理地址單元並取出數據,所需要花費的總時間稱為內存的有效訪問時間(Effective AccessTime,EAT)
假設訪問一次內存的時間為 t,在基本分頁存儲管理方式中,有效訪問時間分為 2 次訪問內存時間之和:

EAT = t + t = 2t

在引入快表的分頁存儲管理方式中,如果快表命中可以直接得到邏輯頁所對應的物理塊號,減少了一次內存訪問。命中率是指使用快表並在其中成功查找到所需頁面的表項的比率,引入 TLB 的分頁存儲管理方式的 EAT 計算公式如下,其中 λ 表示查找快表所需要的時間,a 表示命中率,t 表示訪問一次內存所需要的時間。

EAT = a × λ + (t + λ)(1 - a) + t 
    = 2t + λ - t x a

例如某系統使用基本分頁存儲管理,並采用了具有快表的地址變換機構。訪問一次快表耗時 1us,訪問一次內存耗時 100us,若快表的命中率為 90%,訪問一個邏輯地址的平均耗時通過計算可以得到。

快表和慢表分開查找:(1 + 100) * 0.9 + (1 + 100 + 100) * 0.1 = 111 us
快表和慢表同時查找:(1 + 100) * 0.9 + (100 + 100)     * 0.1 = 110.9 us

若未采用快表機制,則訪問一個邏輯地址需要 100 + 100 = 200us,顯然引入快表機制后訪問一個邏輯地址的速度被加快。

兩級和多級頁表

引入多級頁表的動機

現代的大多數計算機系統都支持非常大的邏輯地址空間,導致頁表要占用相當大的內存空間。例如對於一個具有 32 位邏輯地址空間的分頁系統,規定頁面大小為 4KB,則在每個進程頁表中的頁表項數可達 1MB。又因為每個頁表項占用一個字節,故每個進程僅僅的頁表就要占用 1MB 的連續的內存空間。
引入多級頁表是為了使用離散分配方式,以解決難以找到一塊連續的大內存空間的問題。同時實現只將當前需要的部分頁表項調入內存,其余的頁表項仍駐留在磁盤上,需要時再調入。

兩級頁表

為了解決進程在內存中的連續存儲問題,做法是將進程地址空間分頁,並為其建立一張頁表,記錄各頁面的存放位置。同樣的思路也可用於解決頁表存放的問題,把必須連續存放的頁表再分頁,使每個內存塊剛好可以放入一個分組。比如頁面大小 4KB,每個頁表項 4B,每個頁面可存放 1K 個頁表項。因此每 1K 個連續的頁表項為一組,每組剛好占一個內存塊,再講各組離散地放到各個內存塊中。這種結構為兩級頁表(Two-Level Page Table),實現時要為離散分配的頁表再建立一張頁表,稱為頁目錄表或外層頁表或頂層頁表。

在頁表的每個表項中,存放的是進程的某頁在內存中的物理塊號,而在外層頁表的每個頁表項中所存放的是某頁表分頁的首址。在地址變換機構中同樣需要增設一個外層頁表寄存器,用於存放外層頁表的始址。地址轉換時首先按照地址結構將邏輯地址拆分成三部分,接着從 PCB 中讀出頁目錄表始址,再根據一級頁號查頁目錄表,找到下一級頁表在內存中的存放位置。然后根據二級頁號查表,找到最終想訪問的內存塊號,最后結合頁內偏移量得到物理地址。
兩級頁表的訪存次數為 3 次,第一次訪存訪問內存中的頁目錄表,第二次訪存訪問內存中的二級頁表,第三次訪存訪問目標內存單元。

此時可以實現可以在需要訪問頁面時才把頁面調入內存,通過在頁表項中增加一個標志位,用於表示該頁面是否已經調入內存。若想訪問的頁面不在內存中,則產生缺頁中斷(內中斷),然后將目標頁面從外存調入內存。

多級頁表

當使用的計算機的位數不同時,可能會繼續拓展到多級頁表,將外層頁表再進行分頁,將各分頁離散地裝入到不相鄰接的物理塊中,再利用第 2 級的外層頁表來映射它們之間的關系。若采用多級頁表機制,則各級頁表的大小不能超過一個頁面。例如某系統按字節編址,采用 40 位邏輯地址,頁面大小為 4KB,頁表項大小為 4B,假設采用純頁式存儲,則要采用幾級頁表?頁內偏移量為幾位?
首先頁面大小 = 4KB = 2^12B,按字節編址的頁內偏移量為 12 位。頁號 = 40 - 12 = 28 位,頁面大小 = 2^12B,頁表項大小 = 4B,則每個頁面可存放 212 / 4 = 210 個頁表項。此時需要 10 位二進制位才能映射到 210 個頁表項,因此每一級的頁表對應頁號應為 10 位。總共 28 位的頁號至少要分為三級。

分段存儲管理

引入分段存儲管理的動機

引入分段存儲管理方式主要有 2 方面的原因,一方面是由於通常的程序都可分為若干個段,每個段大多是一個相對獨立的邏輯單位。另一方面實現和滿足信息共享、信息保護、動態鏈接以及信息的動態增長等需要,也都是以段為基本單位的。分段存儲管理方式更符合用戶和程序員的需要,具體的需求有如下幾點。

需求 說明
方便編程 程序員訪問的邏輯地址是由段名(段號)和段內偏移量(段內地址)決定的
信息共享 在實現對程序和數據的共享時是以信息的邏輯單位為基礎的,以段為單位更利於信息共享
信息保護 信息保護同樣是以信息的邏輯單位為基礎的,以段為單位更利於信息保護
動態增長 在應用中存在着一些段,在使用過程中所需要的存儲空間需要動態增加
動態鏈接 當需要調用某個目標程序時才將其調入內存並進行鏈接,動態鏈接以段作為鏈接的基本單位

分段存儲管理的基本結構

分段

作業的地址空間被划分為若干個段,每個段定義了一組邏輯信息。通常可用一個段號來代替段名,每個段都從 0 開始編址,並采用一段連續的地址空間。段的長度由相應的邏輯信息組的長度決定,因此各段的長度並不相等。整個作業的地址空間由於被分成多個段,其邏輯地址由段號(段名)和段內地址所組成。

分段方式已得到許多編譯程序的支持,編譯程序能自動地根據源程序的情況產生若干個段。

段表

在分段式存儲管理系統中,內存為每個分段分配一個連續的分區,進程中的各個段可以離散地裝入內存中不同的分區中。為保證程序能正常運行,就必須能從物理內存中找出每個邏輯段所對應的位置,為此需為每個進程建立一張段映射表。每個段在表中占有一個表項,記錄了該段在內存中的起始地址(基址)段的長度。在配置了段表后,執行中的進程可通過查找段表,找到每個段所對應的內存區。

各個段表項的長度是相同的,例如某系統按字節尋址且采用分段存儲管理,邏輯地址結構為段號 16 位、段內地址 16 位),因此用 16 位即可表示最大段長。物理內存大小為 4GB,因此可以讓每個段表項占 16 + 32 = 48 位(6B)。由於段表項長度相同,因此段號可以是隱含的,不占存儲空間。若段表存放的起始地址為 M,則 K 號段對應的段表項存放的地址為 M + K * 6。

分段地址變換機構

為了實現進程從邏輯地址到物理地址的變換功能,在系統中設置了段表寄存器存放段表始址和段表長度 TL。在進行地址變換時,系統將邏輯地址中的段號 S 與段表長度 TL 進行比較。若 S > TL 表示段號太大訪問越界,於是產生越界中斷信號。若未越界則根據段表的始址和該段的段號,計算出該段對應段表項的位置,從中讀出該段在內存的起始地址。然后再檢查段內地址 d 是否超過該段的段長 SL 。若 d>SL 同樣發出越界中斷信號,若未越界則將該段的基址 d 與段內地址 W 相加,得到要訪問的內存物理地址。

像分頁系統一樣,當段表放在內存中時,每要訪問一個數據都須訪問兩次內存。為了提高訪問速度也增設一個聯想存儲器,用於保存最近常用的段表項。

段頁式存儲管理方式

分段和分頁管理的異同

分頁和分段系統都采用離散分配方式,且都是通過地址映射機構實現地址變換。兩者完全不同主要表現在下述三個方面:

  1. 頁是信息的物理單位,采用分頁存儲管理方式是為提高內存的利用率,僅僅只是系統管理上的需要,對用戶是不可見的。分段存儲管理方式中的段則是信息的邏輯單位,它通常包含的是一組意義相對完整的信息,是為了能更好地滿足用戶的需要;
  2. 頁的大小固定且由系統決定,在采用分頁存儲管理方式的系統中,在硬件結構上就把用戶程序的邏輯地址划分為頁號和頁內地址兩部分。段的長度卻不固定,決定於用戶所編寫的程序;
  3. 分頁的用戶程序地址空間是一維的,用戶程序的地址是屬於單一的線性地址空間。在分段系統中用戶程序的地址空間是二維的,程序員在標識一個地址時需給出段名和段內地址。

段頁式管理的原理

分頁系統以頁面作為內存分配的基本單位,能有效地提高內存利用率,而分段系統以段作為內存分配的基本單位,它能夠更好地滿足用戶多方面的需要。如果能對兩種存儲管理方式“各取所長”,則可形成段頁式存儲管理方式。這種新的系統既具有分段系統的便於實現、分段可共享、易於保護、可動態鏈接等優點,又能像分頁系統那樣解決內存的外部碎片問題。
段頁式系統的基本原理是先將用戶程序分成若干個段,再把每個段分成若干個頁,並為每一個段賦予一個段名。在段頁式系統中,其地址結構由段號、段內頁號及頁內地址三部分所組成。段號的位數決定了每個進程最多可以分幾個段,頁號位數(段內頁號)決定了每個段最大有多少頁,頁內偏移量(頁內地址)決定了頁面大小、內存塊大小是多少。
例如若系統是按字節尋址的,段號占 16 位,因此在該系統中每個進程最多有 2^16 = 64K 個段。頁號占 4 位,因此每個段最多有 2^4 = 16 頁。頁內偏移量占 12 位,因此每個頁面\每個內存塊大小為 2^12 = 4096 = 4KB。

在段頁式系統中,為了實現從邏輯地址到物理地址的變換,系統中需要同時配置段表和頁表。段表的內容不再是內存始址和段長,而是頁表始址和頁表長度。

地址變換過程

在段頁式系統中須配置一個段表寄存器,其中存放段表始址和段長 TL。進行地址變換時首先利用段號 S,將它與段長 TL 進行比較。若 S < TL 表示未越界,於是利用段表始址和段號來求出該段所對應的段表項在段表中的位置,從中得到該段的頁表始址。利用邏輯地址中的段內頁號 P 來獲得對應頁的頁表項位置,讀出物理塊號b,再利用塊號 b 和頁內地址來構成物理地址。

在段頁式系統中,為了獲得一條指令或數據須三次訪問內存。第一次訪問是訪問內存中的段表,從中取得頁表始址。第二次訪問是訪問內存中的頁表,從中取出該頁所在的物理塊號,並將該塊號與頁內地址一起形成指令或數據的物理地址。第三次訪問才是真正從第二次訪問所得的地址中,取出指令或數據。這使訪問內存的次數增加了近兩倍。為了提高執行速度,在地址變換機構中增設一個高速緩沖寄存器。

參考資料

《計算機操作系統(第四版)》,湯小丹 梁紅兵 哲鳳屏 湯子瀛 編著,西安電子科技大學出版社


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM