1. 程式人生 > >第五章虛擬儲存器

第五章虛擬儲存器

1.虛擬儲存器的基本概念
分析常規儲存器管理不足的原因:
1)常規儲存器管理方式的特徵
一次性:作業在執行前一次性地全部裝入記憶體
駐留性:作業裝入記憶體後,便一直駐留在記憶體中,直至作業執行結束。
:一次性及駐留性在程式執行時是否是必須的?
NO。程式執行有區域性性。
程式執行的特點:
多數情況下仍是順序執行。
少部分的轉移和過程呼叫指令會使程式執行由一部分割槽域轉至另一部分割槽域(但研究表明呼叫深度多數情況下不超過5)
許多由少數指令構成的迴圈結構會多次執行。
對許多資料結構的處理(如陣列)往往侷限於很小的範圍內。
所有上述情況都表現出程式執行的區域性性:
時間區域性性(temporal locality)
被引用過一次的儲存器位置很可能在不遠的將來再被多次引用。
空間區域性性(spatial locality)
如果一個儲存器位置被引用了一次,那麼程式很可能在不遠的將來引用附近的一個儲存器位置。
基於區域性性原理
程式執行前,不需全部裝入記憶體(打破一次性)
僅裝入當前要執行的部分頁面或段即可執行,其餘部分暫留在外存上。
缺頁/段的情況:要訪問的頁(段) 尚未調入記憶體。程式應利用OS所提供的請求調頁(段)功能,將它們調入記憶體,使程式繼續執行。
調入需要的頁/段時,如果記憶體已滿,無法再裝入新頁(段),通過置換功能將記憶體中暫時不用的頁(段)調至外存,騰出足夠的記憶體空間。(不總駐留)
交換技術與虛存使用的調入調出技術有何相同和不同之處?
主要相同點是都要在記憶體與外存之間交換資訊;
主要區別在於交換技術換出換進一般是整個程序(proc結構和共享正文段除外),因此一個程序的大小受物理儲存器的限制;
而虛存中使用的調入調出技術在記憶體與外存之間來回傳遞的是儲存頁或儲存段,而不是整個程序,從而使得程序對映具有了更大的靈活性,且允許程序的大小比可用的物理儲存空間大的多 。
3)虛擬儲存的定義
所謂“虛擬儲存器”,是指具有請求調入功能和置換功能,能從邏輯上對記憶體容量加以擴充的一種儲存器系統。
虛擬儲存管理下
記憶體邏輯容量由記憶體容量和外存容量之和所決定
執行速度接近於記憶體速度
每位的成本卻接近於外存。
4)虛擬儲存管理:
允許將一個作業分多次調入記憶體。
若採用連續分配方式,需申請足夠空間,再分多次裝入,造成記憶體資源浪費,並不能從邏輯上擴大記憶體容量。
虛擬的實現建立在離散分配儲存管理基礎上
方式:請求分頁/請求分段系統
細節:分頁/段機構、中斷機構、地址變換機構、軟體支援
5)虛擬儲存器的特點
離散分配方式是基礎
多次性:一個作業被分成多次調入記憶體執行
對換性:允許在作業的執行過程中進行換進、換出。(程序整體對換不算虛擬)
最終體現虛擬性:能夠從邏輯上擴充記憶體容量,使使用者所看到的記憶體容量遠大於實際記憶體容量。
2.請求分頁儲存管理方式
基本分頁 + “請求調頁”和“頁面置換”功能。
換入和換出基本單位都是長度固定的頁面
1)硬體支援
一臺具有一定容量的內/外存的計算機

  • 頁表機制
  • 缺頁中斷機構
  • 地址轉換機構
    頁表基本功能不變:邏輯地址對映為實體地址
    缺頁中斷處理
    每當要訪問的頁面不在記憶體時,便產生一缺頁中斷通知OS,OS則將所缺之頁調入記憶體。作為中斷,需經歷幾個步驟:
    “保護CPU環境”
    “分析中斷原因”
    “轉入缺頁中斷處理程式”
    “恢復CPU環境”等。
    作為一種特殊中斷,與一般中斷有明顯區別:
    (1) 在指令執行期間產生和處理中斷訊號。
    (2) 一條指令在執行期間,可能產生多次缺頁中斷。
    地址變換機構
    分頁系統地址變換機構的基礎上增加
    產生和處理缺頁中斷(請求調入)
    從記憶體中換出一頁的功能(置換)
    在這裡插入圖片描述
    2.記憶體分配
    作業不一次裝入,部分裝入的情況下如何為程序分配記憶體,涉及三個問題:
    最小物理塊數的確定
    少於此數量程序將不能執行
    與計算機的硬體結構有關,取決於指令的格式、功能和定址方式
    物理塊的分配策略
    物理塊的分配演算法
    物理塊的分配策略
    考慮:固定OR可變分配、全域性OR區域性置換。
    組合出三種適合的策略。
    固定分配、區域性置換
    為每個程序分配一定數目的物理塊,在整個執行期間不再改變(基於程序的型別,或根據程式設計師、程式管理員的建議)
    執行中缺頁時,只能從該程序記憶體中n個頁面中選出一頁換出,然後再調入一頁。
    困難:難以把握為每個程序分配“適量”物理塊數
    可變分配、全域性置換
    先為每個程序分配一定數目的物理塊
    OS管理一個空閒物理塊佇列,發生缺頁時,系統從佇列中取出一塊分配給該程序,將欲調入的頁裝入(動態增長型,全域性空閒空間都可分配使用)
    空閒空間不足時,可與其他任何程序頁面置換。“會使其他程序缺頁率提高,影響執行”
    最易實現
    可變分配、區域性置換
    為每個程序分配一定數目的物理塊
    缺頁時,只允許換出該程序在記憶體的頁面,不影響其他程序執行。
    根據缺頁率增減程序的物理塊數:若頻繁缺頁中斷,則系統再為程序分配若干物理快;若缺頁率特別低,則適當減少分配給該程序的物理塊。
    物理塊的分配演算法
    固定分配策略時,分配物理塊可採用以下幾種演算法:
    平均分配演算法
    將所有可供分配的物理塊平均分配給各程序。
    缺點:未考慮各程序本身的大小,利用率不均。
    按比例分配演算法
    根據程序的大小按比例分配物理塊。
    設系統中共有n個程序
    則,每個程序能分到的物理塊數:bi=si/s*m
    Si:程序i頁面數為;
    S:n個程序頁面數總和;
    m:可用物理塊總數
    3)調頁策略
    ① 何時調入頁面
    預調頁策略
    以預測為基礎,將預計不久後便會被訪問的若干頁面,預先調入記憶體。
    優點:一次調入若干頁,效率較好
    缺點:預測不一定準確,預調入的頁面可能根本不被執行到。主要用於程序的首次調入,由程式設計師指出應該先調入哪些頁。
    請求調頁策略
    執行中需要的頁面不在記憶體,便立即提出請求,由OS將其調入記憶體。
    優點:由請求調頁策略所確定調入的頁,一定會被訪問;比較容易實現。
    缺點:每次僅調入一頁,需花費較大的系統開銷,增加了磁碟I/O的啟動頻率。
    外存:檔案區、對換區
    系統擁有足夠的對換區空間:
    系統缺少足夠的對換區空間:
    UNIX方式:首次->檔案區/再請調->對換區
    ③ 頁面調入過程
    程式執行前需要裝入記憶體:上述的②步策略處理何處調入;
    開始執行:先預調入一部分頁面;
    執行中:需要的頁面不在記憶體時,
    向CPU發出一缺頁中斷,“中斷處理程式”開始工作:
    首先保留CPU環境
    分析中斷原因後,轉入缺頁中斷處理程式。
    處理:判斷是否置換、頁表資訊更新
    恢復現場,重新操作頁面。
    3.頁面置換演算法
    程序執行過程中,訪問的頁面不在記憶體,調入時記憶體已無空閒空間,需要將記憶體中的一頁程式或資料調到外存。
    頁面置換演算法(page replacement algorithms):選擇換出哪些頁面的演算法,其好壞直接影響系統的效能。
    應具有較低的缺頁率:
    頁面調入次數(缺頁次數)/總的頁面使用次數
    1)最佳(Optimal)置換演算法
    Belady,1966年提出的一種理論上的演算法
    換出以後永不再用的,或在最長(未來)時間內不再被訪問的頁面。
    優點:保證獲得最低的缺頁率
    不足:無法實現,因為無法預知一程序將來的執行情況
    作用:作為參照標準,評價其他演算法。
    2)先進先出置換演算法(FIFO)
    先進入的先淘汰,即選擇記憶體中駐留時間最久的頁面予以淘汰。
    優點:實現簡單,把一程序已調入記憶體的頁面按先後次序組織成一個佇列,並設定一個指標(替換指標),使它總是指向隊首最老的頁面。
    不足:與程序實際執行規律不相適應(較早調入的頁往往是經常被訪問的頁,頻繁被對換造成執行效能降低)
    Belady現象:出現分配的頁面數增多,缺頁率反而提高的異常現象。
    描述:一個程序P要訪問M個頁,OS分配N個記憶體頁面給程序P;對一個訪問序列S,發生缺頁次數為PE(S,N)。當N增大時,PE(S, N)時而增大,時而減小。
    Belady現象的原因:FIFO演算法的置換特徵與程序訪問記憶體的動態特徵矛盾,即被置換的頁面並不是程序不會訪問的。
    在這裡插入圖片描述

    在這裡插入圖片描述
    不足:
    有時頁面過去和未來的走向之間並無必然的聯絡。
    相應的需較多的硬體支援:記錄每個頁面自上次被訪問以來所經歷的時間t,淘汰時選擇頁面t值最大的;以及需要快速地知道哪一頁是最近最久未使用的頁面,用暫存器或棧。
    ①暫存器記錄時間的原理
    一程序有8個頁面,每個頁面需配備一個8位的(移位)暫存器。
    移位暫存器表示為
    R=Rn-1Rn-2Rn-3…R2R1R0
    頁面被訪問後的操作:
    將該頁對應的暫存器的Rn-1位置為1
    如何記時:
    由系統發出定時訊號,每隔一定時間將所有暫存器右移1位。
    某一時刻,比較各暫存器的值,被用到的標誌1逐漸往低位上積累,若高位上沒有1,就說明最近沒用過。所以最近最久未使用的就是暫存器值最小的那個頁。
    在這裡插入圖片描述

    在這裡插入圖片描述
    在這裡插入圖片描述
    在這裡插入圖片描述
    在這裡插入圖片描述
    5)其他置換演算法
    最少使用 (LFU, Least Frequently Used)
    關鍵在次數記錄上
    每頁設定訪問計數器,每當頁面被訪問時,該頁面的訪問計數器加1;缺頁中斷時,淘汰計數值最小的頁面,並將所有計數清零;
    計數的實現類似LRU,用移位暫存器,但比較時不是簡單比較暫存器的值,而是比較暫存器每位的和∑Ri。
    LRU與LFU
    1000101
    0001111
    LFU置換次數少的。程式區域性性會導致一個頁面在一段時間內使用次數很多。但使用次數多並不能說明將來被用到的可能性大
    而LRU置換最近最久未用的,對未來的預計一般會更好些。
    所有,LRU相對得到較好的應用。
    頁面緩衝演算法PBA(page buffering algorithm)
    對FIFO演算法的發展,彌補了FIFO可能造成的I/O開銷,又不需要LRU等演算法的硬體支援。
    仍用FIFO演算法選擇被置換頁
    但並不將其馬上換入外存。
    系統將頁面放入兩個連結串列之一:如果頁面未被修改,就將其歸入到空閒頁面連結串列的末尾;否則將其歸入到已修改頁面連結串列。
    需要調入新的物理頁面時,將新頁面內容讀入到空閒頁面連結串列的第一項所指的頁面,然後將第一項刪除(從空閒連結串列摘下)。
    空閒頁面和已修改頁面,仍停留在記憶體中一段時間,如果這些頁面被再次訪問,只需較小開銷,而被訪問的頁面可以返還作為程序的記憶體頁。
    當已修改頁面達到一定數目後,再將它們一起調出到外存,然後將它們歸入空閒頁面連結串列,這樣能大大減少I/O操作的次數。
    常用防抖動方法:
    區域性置換策略;
    頁面調入記憶體前檢查各程序工作集,為缺頁率高的增加有限物理塊;
    L缺頁間的平均時間=S置換一個頁面所需時間,可使磁碟和cpu達到最大利用率;
    抖動發生時選擇暫停一些程序,調節多道程式度。
    缺頁率與物理塊數有關聯,基於程式區域性性原理,若能預知程式在某段時間要訪問的頁面並全部調入他們,將大大降低缺頁率。
    Denning提出工作集概念:
    某段時間間隔中,程序實際要訪問的頁面的集合。可以用一個二元函式W(t, )來表示, t是當前的執行時刻, 稱為工作集視窗(working-set window )。
    工作集模型的原理:
    作業系統跟蹤每個程序的工作集,併為程序分配大於其工作集的物理塊。
    如果還有空閒物理塊,則可以再調一個程序到記憶體以增加多道程式數。
    如果所有工作集之和增加以至於超過了可用物理塊的總數,那麼作業系統會暫停一個程序,將其頁面調出並且將其物理塊分配給其他程序,防止出現抖動現象。
    正確選擇工作集的大小,對儲存器的利用率和系統吞吐量的提嵩,都將產生重要影響。
    駐留集
    駐留(常駐)集是指在當前時刻,程序實際駐留在記憶體當中的頁面集合。
    工作集是程序在執行過程中固有的性質,而駐留集取決於系統分配給程序的物理頁面數目,以及所採用的頁面置換演算法;
    如果一個程序的整個工作集都在記憶體當中,即駐留集  工作集,那麼程序將很順利地執行,而不會造成太多的缺頁中斷(直到工作集發生劇烈變動,從而過渡到另一個狀態);
    當駐留集達到某個數目之後,再給它分配更多的物理頁面,缺頁率也不會明顯下降。
    4.請求分段管理方式
    在請求分段系統中,程式執行之前,只需先調入若干個分段(不必調入所有的分段),便可啟動執行。當所訪問的段不在記憶體中時,可請求OS將所缺的段調入記憶體。
    1)請求分段中的硬體支援
    段表機制
    缺段中斷機構
    地址變換機構
    在這裡插入圖片描述
    在這裡插入圖片描述
    在這裡插入圖片描述
    2)分段的共享和保護
    分段在邏輯意義上劃分,實現共享和保護都較方便。以下討論具體實現:
    ①實現共享:共享段表
    在記憶體中配置一張共享段表,每個共享段都佔有一表項,記錄如下內容:
    共享計數count:
    共享段為多個程序所需要,當某程序不再需要它而釋放它時,系統並不回收該段所佔記憶體區,僅當所有共享該段的程序全都不再需要它時,才由系統回收該段所佔記憶體區。設定count用於記錄有多少個程序需要共享該分段。
    ② 共享段如何分享與回收
    共享段的分配
    第一個請求使用該共享段的程序A:系統為該共享段分配一物理區,再把共享段裝入該區;
    將該區的始址填入A的段表相應項;
    共享段表中增加一表項,填寫有關資料,count置1;
    其他程序B也呼叫該共享段時,無需再為該段分配記憶體,只需在B的段表中增加一表項,填寫該共享段的實體地址;在共享段的段表中,填上呼叫程序的程序名、存取控制等,再執行count:=count+1操作。
    共享段的回收
    包括撤消在程序段表中共享段所對應的表項,執行count:=count-1。
    如果count為0,則由系統回收該共享段的實體記憶體,並取消共享段表中該段所對應的表項。
    ③ 分段保護
    越界檢查
    段表暫存器存放了段表長度;段表中存放了每個段的段長。
    在進行儲存訪問時,將段號與段表長度比較,段內地址與段長比較。
    存取控制檢查
    尤其表現在不同程序對共享段的不同使用上。段表每個表項都設定“存取控制”欄位,規定該段的訪問方式:只讀,只執行,讀/寫
    環保護機構
    規定:低編號的環具有高優先權
    遵循的原則:一個程式可以訪問駐留在相同環或較低特權環中的資料。一個程式可以呼叫駐留在相同環或較高特權環中的服務