1. 程式人生 > >段式儲存、頁式儲存及段頁式存 詳解

段式儲存、頁式儲存及段頁式存 詳解

[百度百科同名詞條,下同]

段式管理(segmentation),是指把一個程式分成若干個段(segment)進行儲存,每個段都是一個邏輯實體(logical entity),程式設計師需要知道並使用它。它的產生是與程式的模組化直接有關的。段式管理是通過段表進行的,它包括段號或段名、段起點、裝入位、段的長度等。此外還需要主存佔用區域表、主存可用區域表。

段式管理原理:

為了進行段式管理,每道程式在系統中都有一個段(映象)表來存放該道程式各段裝入主存的狀況資訊。段表中的每一項(對應表中的每一行)描述該道程式一個段的基本狀況,由若干個欄位提供。段名欄位用於存放段的名稱,段名一般是有其邏輯意義的,也可以轉換成用段號指明。由於段號從0開始順序編號,正好與段表中的行號對應,如2段必是段表中的第3行,這樣,段表中就可不設段號(名)欄位。裝入位欄位用來指示該段是否已經調入主存,“1”表示已裝入,“0”表示未裝入。在程式的執行過程中,各段的裝入位隨該段是否活躍而動態變化。當裝入位為“1”時,地址欄位用於表示該段裝入主存中起始(絕對)地址,當裝入位為“0”時,則無效(有時機器用它表示該段在輔存中的起始地址)。段長欄位指明該段的大小,一般以字數或位元組數為單位,取決於所用的編址方式。段長欄位是用來判斷所訪問的地址是否越出段界的界限保護檢查用的。訪問方式欄位用來標記該段允許的訪問方式,如只讀、可寫、只能執行等,以提供段的訪問方式保護。除此之外,段表中還可以根據需要設定其它的欄位。段表本身也是一個段,一般常駐在主存中,也可以存在輔存中,需要時再調入主存。假設系統在主存中最多可同時有N道程式,可設N個段表基址暫存器。對應於每道程式,由基號(程式號)指明使用哪個段表基址暫存器。段表基址暫存器中的段表基址欄位指向該道程式的段表在主存中的起始地址。段表長度欄位指明該道程式所用段表的行數,即程式的段數。

段式管理怎麼執行命令:

由系統賦給某道程式(使用者、程序)一個基號,並在調入調出過程中對有關段表基址暫存器和段表的內容進行記錄和修改,所以這些都不用使用者程式設計師來管。某道活躍的程式在執行過程中產生的指令或運算元地址只要與基號組合成系統的程式地址,即可通過查表自動轉換成主存的實體地址。分段方法能使大程式分模組編制,從而可以多個程式設計師並行程式設計,縮短程式設計時間,在執行或編譯過程中對不斷變化的可變長段也便於處理。各個段的修改、增添並不影響其它各段的編制,各使用者以段的連線形成的程式空間可以與主存的實際容量無關。分段還便於幾道程式共用已在主存內的程式和資料,如編譯程式、各種子程式、各種資料和裝入程式等。不必在主存中重複儲存,只需把它們按段儲存,並在幾道程式的段表中有公用段的名稱及同樣的基址值即可。由於各段是按其邏輯特點組合的,容易以段為單位實現儲存保護。例如,可以安排成常數段只能讀不能寫;運算元段只能讀或寫,不能作為指令執行;子程式段只能執行,不能修改;有的過程段只能執行,不能讀也不能寫,如此等等。一旦違反規定就中斷,這對發現程式設計錯誤和非法使用是很有用的。段式管理的虛擬儲存器由於各個段的長度完全取決於段自身,當然不會恰好如下圖那樣是1K的整數倍,段在主存中的起點也會是隨意的,這就給高效地調入段分配主存區域帶來困難。

進行段式管理

為了進行段式管理,除了系統需要為每道程式分別設定段映象表外,還得由作業系統為整個主存系統建立一個實主存管理表,它包括佔用區域表和可用區域表兩部分。佔用區域表的每一項(行)用來指明主存中哪些區域已被佔用,被哪道程式的哪個段佔用以及該段在主存的起點和長度。此外,還可以設定諸如該段是否進入主存後被改寫過的欄位,以便該段由主存中釋放時,決定是否還要將其寫回到輔存中原先的位置來減少輔助操作。可用區域表的每一項(行)則指明每一個未被佔用的基地址和區域大小。當一個段從輔存裝入主存時,作業系統就在佔用區域表中增加一項,並修改可用區域表。而當一個段從主存中退出時,就將其在佔用區域表的項(行)移入可用區域表中,並進行有關它是否可與其它可用區歸併的處理,修改可用區域表。當某道程式全部執行結束或者是被優先順序更高的程式所取代時,也應將該道程式的全部段的項從佔用區域表移入可用區域表並作相應的處理。

分頁式儲存管理

頁式管理是一種記憶體空間儲存管理的技術,頁式管理分為靜態頁式管理和動態頁式管理。

基本原理:

將各程序的虛擬空間劃分成若干個長度相等的頁(page),頁式管理把記憶體空間按頁的大小劃分成片或者頁面(page frame),然後把頁式虛擬地址與記憶體地址建立一一對應頁表,並用相應的硬體地址變換機構,來解決離散地址變換問題。頁式管理採用請求調頁或預調頁技術實現了內外存儲存器的統一管理。

段式儲存、頁式儲存及段頁式儲存


段式儲存、頁式儲存及段頁式儲存

靜態頁式管理:

記憶體頁面分配與回收

段式儲存、頁式儲存及段頁式儲存
段式儲存、頁式儲存及段頁式儲存

靜態分頁管理的第一步是為要求記憶體的作業或程序分配足夠的頁面。系統通過儲存頁面表、請求表以及頁表來完成記憶體的分配工作。

頁表:記憶體中的一塊固定儲存區。頁式管理時每個程序至少有一個頁表。

請求表:用來確定作業或程序的虛擬空間的各頁在記憶體中的實際對應位置;

儲存頁面表:整個系統有一個儲存頁面表,其描述了實體記憶體空間的分配使用狀況。

儲存頁面表有兩種構成方法:

1、位示圖法

2、空閒頁面連結串列發

分配演算法

段式儲存、頁式儲存及段頁式儲存

首先,請求表給出程序或作業要求的頁面數。然後,由儲存頁面表檢查是否有足夠的空閒頁面,如果沒有,則本次無法分配。如果有則首先分配設定頁表,並請求表中的相應表項後,按一定的查詢演算法搜尋出所要求的空閒頁面,並將對應的頁好填入頁表中。

地址變換:

首先,需要有一個裝置頁表始址和頁表長度用的控制暫存器。系統所排程執行的程序頁表始址和長度從請求表中取出送入控制暫存器中。然後,由控制暫存器頁表始址可以找到頁表所在位置。

靜態頁式管理解決了分割槽管理時的碎片問題。但是,由於靜態頁式管理要求程序或作業在執行前全部裝入記憶體,如果可用頁面數小於使用者要求時,該作業或程序只好等待。而且作業和程序的大小仍受記憶體可用頁面數的限制。

動態頁式管理:

段式儲存、頁式儲存及段頁式儲存

動態頁式管理是在靜態頁式管理的基礎上發展起來的。它分為請求頁式管理和預調入頁式管理。

請求頁式管理和預調入頁式管理在作業或程序開始執行之前,都不把作業或程序的程式段和資料段一次性地全部裝入記憶體,而只裝入被認為是經常反覆執行和呼叫的工作區部分。其它部分則在執行過程中動態裝入。請求頁式管理與預調入頁式管理的主要區別在它們的調入方式上。請求頁式管理的調入方式是,當需要執行某條指令而又發現它不在記憶體時或當執行某條指令需要訪問其它的資料或指令時.這些指令和資料不在記憶體中,從而發生缺頁中斷,系統將外存中相應的頁面調入記憶體。

預調入方式是,系統對那些在外存中的頁進行調入順序計算。估計出這些頁中指令和資料的執行和被訪問的順序,並按此順序將它們順次調入和調出記憶體。除了在調入方式上請求頁式管理和預調入管理有些區別之外,其它方面這兩種方式基本相同。因此,下面我們主要介紹請求頁式管理。

請求頁式管理的地址變換過程與靜態頁式管理時的相同,也是通過頁表查出相應的頁面號之後,由頁面號與頁內相對地址相加而得到實際實體地址,但是,由於請求頁式管理只讓程序或作業的部分程式和資料駐留在記憶體中,因此,在執行過程中,不可避免地會出現某些虛頁不在記憶體中的問題。怎樣發現這些不在記憶體中虛頁以及怎樣處理這種情況.是請求頁式管理必須解決的兩個基本問題。

第一個問題可以用擴充頁表的方法解決。即與每個虛頁號相對應,除了頁面號之外,再增設該頁是否在記憶體的中斷位以及該頁在外存中的副本起始地址。

段式儲存、頁式儲存及段頁式儲存

關於虛頁不在記憶體時的處理,涉及到兩個問題。第一,採用何種方式把所缺的頁調入記憶體。第二,如果記憶體中沒有空閒頁面時,把調進來的頁放在什麼地方。也就是說,採用什麼樣的策略來淘汰已佔據記憶體的頁。還有,如果在記憶體中的某一頁被淘汰,且該頁曾因程式的執行而被修改,則顯然該頁是應該重新寫到外存上加以儲存的。而那些未被訪問修改的頁、因為外存已保留有相同的副本,寫回外存是沒有必要的。因此,在頁表中還應增加一項以記錄該頁是否曾被改變。

在動態頁管理的流程中,有關地址變換部分是由硬體自動完成的。當硬體變換機構發現所要求的頁不在記憶體時,產生缺頁中斷訊號,由中斷處理程式做出相應的處理。中斷處理程式是由軟體實現的。除了在沒有空閒頁面時要按照置換演算法選擇出被淘汰頁面之外,還要從外存讀入所需要的虛頁。這個過程要啟動相應的外存和涉及到檔案系統。因此,請求頁式管理是一個十分複雜的處理過程,記憶體的利用率的提高是以犧牲系統開銷的代價換來的。

請求頁式管理中的置換演算法:

功能:需要調入頁面時,選擇記憶體中哪個物理頁面被置換。稱為replacement policy。

出發點:把未來不再使用的或短期內較少使用的頁面調出,通常只能在區域性性原理指導下依據過去的統計資料進行預測。

頁面鎖定(frame locking):用於描述必須常駐記憶體的作業系統的關鍵部分或時間關鍵(time-critical)的應用程序。實現方法為在頁表中加上鎖定標誌位(lock bit)。

隨機淘汰演算法:

隨機淘汰演算法(random golongram):在系統設計人員認為無法確定哪些頁被訪問的概率較低時,隨機地選擇某個使用者的頁面並將其換出將是一種明智的作法。

輪轉法和先進先出演算法:

輪轉法(RR,round robin)和先進先出演算法(FIFO,first in first out):輪轉法循回換出記憶體可用區內一個可以被換出的頁,無論該頁是剛被換進或已換進記憶體很長時間。FIFO演算法總是選擇在記憶體駐留時間最長的一員將其淘汰。

FIFO演算法認為先調入記憶體的頁不再被訪問的可能性要比其它頁大,因而選擇最先調入記憶體的頁換出。實現FIFO演算法需要把各個已分配頁面按分配時間順序連結起來,組成FIFO佇列,並設定一置換指標指向FIFO佇列的隊首頁面。這樣,當要進行置換時,只需把置換指標所指的FIFO佇列前頭的頁順次換出,而把換入的頁連結在FIFO隊尾即可。

由實驗和測試發現FIPO演算法和RR演算法的記憶體利用率不高。這是因為,這兩種演算法都是基於CPU按線性順序訪問地址空間這一假設。事實上,許多時候.CPU不是按線性順序訪問地址空間的。

Belady現象:一般來說,對於任一作業或程序,如果給它分配的記憶體頁面數越接近於它所要求的頁面數,則發生缺頁的次數會越少。在極限情況下,這個推論是成立的。因為如果給一個程序分配了它所要求的全部頁面,則不會發生缺頁現象。但是,使用FIFO演算法時,在未給程序或作業分配足它所要求的頁面數時,有時會出現分配的頁面數增多,缺頁次數反而增加的奇怪現象。這種現象稱為Belady現象。

最近最久未使用頁面置換演算法:

最近最久未使用頁面置換演算法(LRU, Least Recently Used):

選擇記憶體中最久未使用的頁面被置換。這是區域性性原理的合理近似,效能接近最佳演算法。但由於需要記錄頁面使用時間的先後關係,硬體開銷太大。硬體機構如:

(1) 一個特殊的棧:把被訪問的頁面移到棧頂,於是棧底的是最久未使用頁面。

(2) 每個頁面設立移位暫存器:被訪問時左邊最高位置1,定期右移並且最高位補0,於是暫存器數值最小的是最久未使用頁面。

比較常用的近似演算法有:

(a) 最不經常使用頁面淘汰演算法(LFU, Least Frequently Used)

(b) 最近沒有使用頁面淘汰(NRU, Not Recently Used)

理想型淘汰演算法:

理想型淘汰演算法(OPT,Optimal Replacement Algorithm)

該演算法淘汰在訪問串中將來再也不出現的或是離當前最遠的位置上出現的頁。它是一種理想化的演算法,效能最好,但在實際上難於實現。

儲存保護:

頁式管理可以為記憶體提供兩種方式的保護。一種是地址越界保護,另一種是通過頁表控制對記憶體資訊的操作方式以提供保護。

地址越界保護可由地址變換機構中的控制暫存器的值一一頁表長度和所要訪問的慮地址相比較完成。

存取控制保護的實現則是在頁表中增加相應的保護位即可。

頁式管理的優缺點:

優點:

1、由於它不要求作業或程序的程式段和資料在記憶體中連續存放,從而有效地解決了碎片問題。

2、動態頁式管理提供了記憶體和外存統一管理的虛存實現方式,使使用者可以利用的儲存空間大大增加。這既提高了主存的利用紐,又有利於組織多道程式執行。

缺點:

1、要求有相應的硬體支援。例如地址變換機構,缺頁中斷的產生和選擇淘汰頁面等都要求有相應的硬體支援。這增加了機器成本。

2、增加了系統開銷,例如缺頁中斷處理機,

3、請求調頁的演算法如選擇不當,有可能產生抖動現象。

4、雖然消除了碎片,但每個作業或程序的最後一頁內總有一部分空間得不到利用果頁面較大,則這一部分的損失仍然較大。

段頁式儲存管理方式:

基本原理

段頁式系統的基本原理,是基本分段儲存管理方式和基本分頁儲存管理方式原理的結合,即先將使用者程式分成若干個段,再把每個段分成若干個頁,併為每一個段賦予一個段名。下圖示出了一個作業的地址空間和地址結構。

段式儲存、頁式儲存及段頁式儲存

該作業有三個段,頁面大小為4 KB。在段頁式系統中,其地址結構由段號、段內頁號及頁內地址三部分所組成,如下圖所示。 

段式儲存、頁式儲存及段頁式儲存

地址變換過程:

在段頁式系統中,為了便於實現地址變換,須配置一個段表暫存器,其中存放段表始址和段表長TL。進行地址變換時,首先利用段號S,將它與段表長TL進行比較。若S

段式儲存、頁式儲存及段頁式儲存

在段頁式系統中,為了獲得一條指令或資料,須三次訪問記憶體。第一次訪問是訪問記憶體中的段表,從中取得頁表始址;第二次訪問是訪問記憶體中的頁表,從中取出該頁所在的物理塊號,並將該塊號與頁內地址一起形成指令或資料的實體地址;第三次訪問才是真正從第二次訪問所得的地址中,取出指令或資料。

顯然,這使訪問記憶體的次數增加了近兩倍。為了提高執行速度,在地址變換機構中增設一個高速緩衝暫存器。每次訪問它時,都須同時利用段號和頁號去檢索快取記憶體,若找到匹配的表項,便可從中得到相應頁的物理塊號,用來與頁內地址一起形成實體地址;若未找到匹配表項,則仍須再三次訪問記憶體。

區別及優缺點

虛擬儲存器可以分為兩類:頁式和段式。頁式虛擬儲存器把空間劃分為大小相同的塊,稱為頁面。而段式虛擬儲存器則把空間劃分為可變長的塊,稱為段。頁面是對空間的機械劃分,而段則往往是按程式的邏輯意義進行劃分。
  頁式儲存管理的優點是頁表對程式設計師來說是透明的,地址變換快,調入操作簡單;缺點是各頁不是程式的獨立模組,不便於實現程式和資料的保護。
  段式儲存管理的優點是消除了記憶體零頭,易於實現儲存保護,便於程式動態裝配;缺點是調入操作複雜,地址變換速度慢於頁式儲存管理。