1. 程式人生 > >計算機作業系統(五)——儲存管理

計算機作業系統(五)——儲存管理

儲存管理

邏輯地址(相對地址):使用者程式設計所使用的地址空間

邏輯地址從0開始編號,兩種形式:

  1. 一維邏輯地址(地址)
  2. 二維邏輯地址(段號:段內地址)

段式程式設計

  1. 把一個程式設計成多個段
    1. 程式碼段、資料段、堆疊段等等
  2. 使用者可以自己應用段覆蓋技術擴充記憶體空間使用量
    1. 這一技術是程式設計技術,不是OS儲存管理的功能

實體地址(絕對地址):程式執行所使用的地址空間

  1. 處理器執行指令時按照實體地址進行

主儲存器的複用

  1. 多道程式設計需要複用主存
  2. 按照分割槽複用:
    1. 主存劃分為多個固定/可變尺寸的分割槽
    2. 一個程式/程式段佔用一個分割槽
  3. 按照頁架複用:
    1. 主存劃分成多個固定大小的頁架
    2. 一個程式/程式段佔用多個頁架

儲存管理的基本模式

  1. 單連續儲存管理:一維邏輯地址空間的程式佔用一個主存固定分割槽或可變分割槽
  2. 段式儲存管理:段式二維邏輯地址空間的程式佔用多個主存可變分割槽
  3. 頁式儲存管理:一維邏輯地址空間的程式佔用多個主頁頁架區
  4. 段頁式儲存管理:段式二維邏輯地址空間的程式佔用多個主存頁架區

地址轉換(重定位):把邏輯地址轉換成絕對地址

  1. 靜態重定位:在程式裝入記憶體時進行地址轉換
    1. 由裝入程式執行,早期小型OS使用
  2. 動態重定位:在CPU執行程式時進行地址轉換
    1. 從效率出發,依賴硬體地址轉換機構

主儲存器空間的分配與去配

  1. 分配:程序裝入主存時,儲存管理軟體進行具體的主存分配操作,並設定一個表格記錄主存空間的分配情況
  2. 去配:當某個程序撤離或主動歸還主存資源時,儲存管理軟體要收回它所佔用的全部或者部分儲存空間,調整主存分配表資訊

主儲存器空間的共享

  1. 多個程序共享主儲存器資源:多道程式設計技術使若干個程式同時進入主儲存器,各自佔用一定數量的儲存空間,共同使用一個主儲存器
  2. 多個程序共享主儲存器的某些區域:若干個協作程序有共同的主存程式塊或者主存資料塊

儲存保護

  1. 為避免主存中的多個程序相互干擾,必須對主存中的程式和資料進行保護
    1. 私有主存區中的資訊:可讀可寫
    2. 公共區中的共享資訊:根據授權
    3. 非本程序資訊:不可讀寫
  2. 這一功能需要軟硬體協同完成
    1. CPU檢查是否允許訪問,不允許則產生地址保護異常,由OS進行相應處理

主儲存器空間的擴充

  1. 儲存擴充:把磁碟作為主存擴充,只把部分程序或程序的部分內容裝入記憶體
    1. 對換技術:把部分不執行的程序調出
    2. 虛擬技術:只調入程序的部分內容
  2. 這一工作需要軟硬體協作完成
    1. 對換程序決定對換,硬體機構調入
    2. CPU處理到不在主存的地址,發出虛擬地址異常,OS將其調入,重執指令

虛擬儲存器思想的提出

主存容量限制帶來諸多不便

  1. 使用者編寫程式必須考慮主存容量限制
  2. 多道程式設計的道數受到限制

使用者程式設計行為分析

  1. 全面考慮各種情況,執行時有互斥性
  2. 順序性和迴圈性等空間區域性性行為
  3. 某一階段執行的時間區域性性行為

考慮部分調入程序內容

基本思想

  1. 儲存管理把程序全部資訊放在輔存中,執行時先將其中一部分裝入主存,以後根據執行行為隨用隨調入
  2. 如主存中沒有足夠的空閒空間,儲存管理需要根據執行行為把主存中暫時不用的資訊調出到輔存上去

實現思路

  1. 需要建立與自動管理兩個地址空間
    1. (輔存)虛擬地址空間:容納程序裝入
    2. (主存)實際地址空間:承載程序執行
  2. 對於使用者,計算機系統具有一個容量大得多的主存空間,即虛擬儲存器
  3. 虛擬儲存器是一種地址空間擴充套件技術,通常意義上對使用者程式設計是透明的,除非使用者需要進行高效能的程式設計

儲存管理涉及的儲存物件

  1. 儲存管理是OS管理主儲存器的軟體部分
  2. 為獲得更好的處理效能,部分主存程式與資料(特別是關鍵效能資料)被調入Cache,儲存管理需要對其進行管理,甚至包括對聯想儲存器的管理
  3. 為獲得更大的虛擬地址空間,儲存管理需要對存放在硬碟、固態硬碟、甚至網路硬碟上的虛擬儲存器檔案進行管理

快取記憶體儲存器(Cache)

  1. Cache是介於CPU和主儲存器間的高速小容量儲存器,由靜態儲存晶片SRAM組成,容量較小但比主存DRAM技術更加昂貴而快速,接近於CPU的速度
    1. CPU往往需要重複讀取同樣的資料庫,Cache的引入與快取容量的增大,可以大幅提升CPU內部讀取資料的命中率,從而提高系統性能
  2. 構成
    1. 高速儲存器
    2. 聯想儲存器:根據內容進行定址的儲存器
    3. 地址轉換部件:通過聯想儲存器建立目錄表以實現快速地址轉換。命中時直接訪問Cache;未命中時從記憶體讀取放入Cache
    4. 替換部件:在快取已滿時按一定策略進行資料塊替換,並修改地址轉換部件
  3. 分級:由於CPU芯片面積和成本,Cache很小。根據成本控制,劃分L1,L2,L3三級
    1. L1 Cache:分為資料快取和指令快取;內建;成本最高,對CPU的效能影響最大;通常在32KB-256KB之間
    2. L2 Cache:分內建和外接兩種,後者效能低一些;通常在512KB-8MB之間
    3. L3 Cache:多為外接,在遊戲和伺服器領域有效;但對很多應用來說,匯流排改善比設定L3更加有利於提升系統性能

單連續分割槽儲存管理:每個程序佔用一個物理上完全連續的儲存空間(區域)

  1. 主存區域劃分為系統區和使用者區
  2. 設定一個柵欄暫存器界分兩個區域,硬體用它在執行時進行儲存保護
  3. 一般採用靜態重定位進行地址轉換
    1. 靜態重定位:在裝入一個作業時,把該作業中程式的指令地址和資料地址全部轉換成絕對地址
  4. 硬體實現代價低
  5. 適用於單使用者單任務作業系統,如DOS

可變分割槽儲存管理:按照程序的記憶體需求來動態劃分

基本思想

  1. 固定分割槽儲存管理不夠靈活,既不適應大尺寸程式,又存在記憶體內零頭,有浪費
  2. 能否按照程序實際記憶體需求動態劃分分割槽,並允許分割槽個數可變

建立一個程序時,根據程序所需主存量檢視主存中是否有足夠的空閒時間

  1. 若有,則按需要量分割一個分割槽
  2. 若無,則令該程序等待主存資源

由於分割槽大小按照程序實際需要量來確定,因此分割槽個數是隨機變化的

記憶體分配

  1. 最先適應分配演算法
  2. 鄰近適應分配演算法
  3. 最優適應分配演算法
  4. 最壞適應分配演算法

記憶體零頭

  1. 固定分割槽方式會產生記憶體內零頭,可變分割槽方式也會隨著程序的記憶體分配產生一些小的不可用的記憶體分割槽,稱為記憶體外零頭
  2. 最優適配演算法最容易產生外零頭
  3. 任何適配演算法都不能避免產生外零頭

移動技術

  1. 移動分割槽以解決記憶體外零頭
  2. 需要動態重定位支撐

主存分割槽表

已分配區情況表

起址 長度 標誌
4K 6K J1
46K 6K J2

未分配區情況表

起址 長度 標誌
10K 36K 未分配
52K 76K 未分配

固定分割槽儲存管理

  1. 支援多個分割槽

  2. 分割槽數量固定

  3. 分割槽大小固定

  4. 可用靜態重定位

  5. 硬體實現代價低

  6. 早期OS採用

  7. 主存分配表

    分割槽號 起始地址 長度 佔用標誌
    1 4K 8K 0
    2 12K 16K Job1
    3 28K 16K 0
    4 44K 24K 0
    5 68K 24K Job2
    6 92K 36K 0

頁式儲存管理

基本原理

  1. 分頁儲存器將主存劃分成多個大小相等的頁架
  2. 受頁架尺寸限制,程式的邏輯地址也自然分成頁
  3. 不同的頁可以放在不同頁架中,不需要連續
  4. 頁表用於維繫程序的主存完整性

地址

  1. 頁式儲存管理的邏輯地址由兩部分組成:頁號和單元號
  2. 實體地址:頁架號和單元號
  3. 地址轉換可以通過查頁表完成

記憶體分配/去配

  1. 用一張位示圖來記錄主存分配情況
  2. 建立程序頁表維護主存邏輯完整性

頁的共享

  1. 頁式儲存管理能夠實現多個程序共享程式和資料
  2. 資料共享:不同程序可以使用不同頁號共享資料頁
  3. 程式共享:不同程序必須使用相同頁號共享內碼表
    1. 共享內碼表中的(JMP<頁內地址>)指令,使用不同頁號是做不到

地址轉換代價

  1. 頁表放在主存:每次地址轉換必須訪問兩次主存
    1. 按頁號讀出頁表中的相應頁架號
    2. 按計算出來的絕對地址進行讀寫
  2. 存在問題:降低了存取速度
  3. 解決辦法:利用Cache存放部分頁表

快表:存放在高速儲存器中的頁表部分

  1. 為提供地址轉換速度,設定一個專用的高速儲存器,用來存放頁表的一部分
  2. 快表表項:頁號,頁架號
  3. 這種高速儲存器是聯想儲存器,即按照內容定址,而非按照地址訪問·

引入快表後的地址轉換代價

  1. 假設主存訪問時間為200毫微秒,快表訪問時間為40毫微秒,查快表的命中率是90%,平均地址轉換代價為(200+40)*90%+(200+200)*10%=256毫微秒
  2. 比兩次訪問主存時間(400毫微秒)下降了36%((400-256)/400)

基於快表的地址轉換流程

  1. 按邏輯地址中的頁號查快表
  2. 若該頁已在快表中,則由頁架號和單元號形成絕對地址
  3. 若該頁不在快表中,則再查主存頁表形成絕對地址,同時將該頁登記到快表中
  4. 當快表填滿後,又要登記新頁時,則需在快表中按一定策略淘汰一箇舊登記項

多道程式環境下的程序表

  1. 程序表中登記了每個程序的頁表

  2. 程序佔有處理器執行時,其頁表起始地址和長度送入頁表控制暫存器

  3. 頁表控制暫存器

    使用者作業名 頁表地址 頁表長度
    AB 0010 4
    CD 0014 3
    EF 0017 7

頁式虛擬儲存管理

定義

  1. 把程序全部裝入虛擬儲存器,執行時先把部分頁面裝入實際記憶體,然後,根據執行行為,動態調入不在主存的頁,同時進行必要的頁面調出
  2. 現代OS的主流儲存管理技術
  3. 首次只把程序第一頁資訊裝入記憶體,稱為請求頁式儲存管理

頁式虛擬儲存管理的頁表

標誌位 主存塊號 輔助儲存器地址

擴充頁表項,指出:

  1. 每頁的虛擬地址、實際地址
  2. 主存駐留地址、寫回標誌、保護標誌、引用標誌、可移動標誌

實現

  1. CPU處理地址
    1. 若頁駐留,則獲得塊號形成絕對地址
    2. 若頁不在記憶體,則CPU發出缺頁中斷
  2. OS處理缺頁中斷
    1. 若有空閒頁架,則根據輔存地址調入頁,更新頁表與快表等
    2. 若無空閒頁架,則決定淘汰頁,調出已修改頁,調入頁,更新頁表與快表

頁面排程

  1. 當主存空間已滿而又需要裝入新頁時,頁式虛擬儲存管理必須按照一定的演算法把已在主存的一些頁調出去
  2. 選擇淘汰頁的工作稱為頁面排程
  3. 選擇淘汰頁的演算法稱為頁面排程演算法
  4. 頁面排程演算法設計不當,會出現(剛被淘汰的頁面立即又要調入,並如此反覆)
  5. 這種現象稱為抖動或顛簸
  6. 先進先出FIFO頁面排程演算法
    1. 總是淘汰最先調入主存的那一頁,或者說主存駐留時間最長的那一頁(常駐的除外)
    2. 模擬的是程式執行的順序性,有一定合理性
  7. 最近最少用LRU頁面排程演算法
    1. 淘汰最近一段時間較久未被訪問的那一頁,即那些剛被使用過的頁面,可能馬上還要被使用到
      1. OPT頁面排程演算法:
        1. 當要調入新頁面時,首先淘汰以後不再訪問的頁,然後選擇距現在最長時間後再訪問的頁
        2. 該演算法由Belady提出,稱為Belady演算法,又稱最佳演算法(OPT,Optimal page replacement)
        3. OPT只可模擬,不可實現
      2. 模擬了程式執行的區域性屬性,既考慮了迴圈性又兼顧了順序性
      3. 嚴格實現的代價大(需要維持特殊佇列)
      4. 模擬實現:
        1. 每頁建一個引用標誌,供硬體使用
        2. 設定一個時間間隔中斷:中斷時頁引用標誌置0
        3. 地址轉換時,頁引用標誌置1
        4. 淘汰頁面時,從頁引用標誌為0z的頁中間隨機選擇
        5. 時間間隔多長是個難點
  8. 最不常用LFU頁面排程演算法
    1. 淘汰最近一段時間內訪問次數較少的頁面,對OPT的模擬性比LRU更好
    2. 基於時間間隔中斷,並給每一頁設定一個計數器
    3. 時間間隔中斷髮生後,所有計數器清0
    4. 每訪問頁1次就給計數器加1
    5. 選擇計數值最小的頁面淘汰
  9. 時鐘CLOCK頁面排程演算法
    1. 採用迴圈佇列機制構造頁面佇列,形成了一個類似於鐘錶面的環形表
    2. 佇列指標則相當於鐘錶面上的錶針,指向可能要淘汰的頁面
    3. 使用頁引用標誌位
    4. 工作流程:
      1. 頁面調入主存時,其引用標誌位置1
      2. 訪問主存頁面時,其引用標誌位置1
      3. 淘汰頁面時,從指標當前指向的頁面開始掃描迴圈佇列
        1. 把所遇到的引用標誌位是1的頁面的引用標誌位清0,並跳過
        2. 把所遇到的引用標誌位是0的頁面淘汰,指標推進一步

缺頁中斷率

  1. 假定程序P共n頁,系統分配頁架數m個
  2. P執行中成功訪問次數為S,不成功訪問次數為F,總訪問次數A=S+F
  3. 缺頁中斷率定義為:f=F/A
  4. 缺頁中斷率是衡量儲存管理效能和使用者程式設計水平的重要依據
  5. 影響因素

    1. 分配給程序的頁架數:可用頁架數越多,則缺頁中斷率就越低
    2. 頁面的大小:頁面尺寸越大,則缺頁中斷率就越低
    3. 使用者的程式編制方法:在大資料量情況下,對缺頁中斷率也有很大影響
      // 程式將陣列置為“0”,假定僅分得一個主存頁架,頁面尺寸為128個字,陣列元素按行存放,開始時第一頁在主存
      int A[128][128];
      for (int j=0;j<128;j++)
          for (int i=0;i<128;i++)
              A[i][j]=0;
      // 每執行一次賦值就要產生一次缺頁中斷,共產生(128x128-1)次缺頁中斷
      
      int A[128][128];
      for (int i=0;i<128;i++)
          for (int j=0;j<128;j++)
              A[i][j]=0;
      // 共產生(128-1)次缺頁中斷

反置頁表

提出:

  1. 頁面及相關硬體機制在地址轉換、儲存保護、虛擬地址訪問中發揮了關鍵作用
  2. 為頁式儲存管理設定專門硬體機構
  3. 記憶體管理單元MMU:CPU管理虛擬/物理儲存器的控制線路,把虛擬地址對映為實體地址,並提供儲存保護,必要時確定淘汰頁面
  4. 反置頁表IPT:MMU用的資料結構

基本設計思想

  1. 針對記憶體中的每個頁架建立一個頁表,按照塊號排序
  2. 表項包含:正在訪問改頁框的程序標識、頁號及特徵位和雜湊鏈指標等
  3. 用來完成記憶體頁架到訪問程序頁號的對應,即實體地址到邏輯地址的轉換

頁表項

  1. 頁號:虛擬地址頁號
  2. 程序標誌符:使用該頁的程序號(頁號和程序標誌符結合起來標誌一個特定程序的虛擬地址空間的一頁)
  3. 標誌位:有效、引用、修改、保護的鎖定等標誌資訊
  4. 鏈指標:雜湊鏈

基於反置頁表的地址轉換過程

  1. MMU通過雜湊表把程序標識和虛頁號轉換成一個雜湊值,指向IPT的一個表目
  2. MMU遍歷雜湊鏈找到所需程序的虛頁號,該項的索引就是頁架號,通過拼接位移便可生成實體地址
  3. 若遍歷整個反置頁表中未能找到匹配頁表項,說明該頁不在記憶體,產生缺頁中斷,請求作業系統調入

段式儲存管理

段式程式設計

  1. 每個程式可由若干段組成,每一段都可以從“0”開始編址,段內的地址是連續的
  2. 分段儲存器的邏輯地址由兩部分組成,段號、單元號

基本思想

  1. 段式儲存管理基於可變分割槽儲存管理實現,一個程序要佔用多個分割槽
  2. 硬體需要增加一組使用者可見的段地址暫存器(程式碼段、資料段、堆疊段、附加段),供地址轉換使用
  3. 儲存管理需要增加設定一個段表,每個段佔用一個段表項,包括:段始址、段限長,以及儲存保護、可移動、可擴充等標誌位

段的共享

  1. 通過不同程序段表中的項指向同一個段基址來實現
  2. 對共享段的資訊必須進行保護,如規定只能獨處不能寫入,不滿足保護條件則產生保護中斷

段式虛擬儲存管理的基本思想

  1. 把程序的所有分段都存放在輔存中,程序執行時先把當前需要的一段或幾段裝入主存,在執行過程中訪問到不在主存的段時再把它們動態裝入
  2. 段式虛擬儲存管理中段的調進調出是由OS自動實現的,對使用者透明
  3. 與段覆蓋技術不同,它是使用者控制的主存擴充技術,OS不感知

段表擴充

  1. 特徵位:00(不在記憶體)01(在記憶體)11(共享段)

  2. 存取許可權:00(可執行)01(可讀)11(可寫)

  3. 擴充位:0(固定長)1(可擴充)

  4. 標誌位:00(未修改)01(已修改)11(不可移動)

    段號 特徵 存取許可權 擴充位 標誌位 主存始址

段頁式儲存管理

  1. 基本思想
    1. 段式儲存管理可以基於頁式儲存管理實現
    2. 每一段不必佔據連續的儲存空間,可存放在不連續的主存頁架中
    3. 能夠擴充為段頁式虛擬儲存管理
    4. 裝入部分段,或者裝入段中部分頁面