1. 程式人生 > 其它 >作業系統(二) to be continued

作業系統(二) to be continued

3 儲存管理

邏輯地址與實體地址

  • 邏輯地址,使用者程式設計使用的地址空間

  • 實體地址,程式執行使用的地址空間

  • 地址轉換:將邏輯地址轉換為實體地址

主存複用

  • 多道程式設計需要複用主存

  • 按照分割槽複用:

    • 主存劃分為多個固定/可變尺寸的分割槽
    • 一個程式/程式段佔用一個分割槽
  • 按照頁架複用:

    • 主存劃分成多個固定大小的頁架
    • 一個程式/程式段佔用多個頁架
  • 段式程式設計:把一個程式設計成多個段,程式碼段、資料段、堆疊段、等等

儲存管理

  1. 段式儲存管理:段式二維邏輯地址空間的程式佔用多個主存可變分割槽

  2. 頁式儲存管理:一維邏輯地址空間的程式佔用多個主存頁架區

  3. 段頁式儲存管理:段式二維邏輯地址空間的程式佔用多個主存頁架區

儲存保護

  • 為避免主存中的多個程序相互干擾,必須對主存中的程式和資料進行保護

    • 私有主存區中的資訊:可讀可寫
    • 公共區中的共享資訊:根據授權
    • 非本程序資訊:不可讀寫
  • CPU檢查是否允許訪問,不允許則產生地址保護異常

虛擬儲存

  • 引入原因:

    • 使用者編寫程式必須考慮主存容量限制
    • 多道程式設計的道數受到限制
  • 可行原因:

    • 程式執行區域性性原理:在一段較短的時間內,程式的執行僅限於某個部分,相應地,它所訪問的儲存空間也侷限於某個區域。
  • 實現思路:(核心)

    • 區域性性原理:一個程式只要部分裝入記憶體就可以執行
    • (磁碟)虛擬地址空間:容納程序裝入
    • (主存)實際地址空間:承載程序執行
  • 使用者視角,計算機系統具有一個容量大得多的主存空間,即虛擬儲存器

固定分割槽與可變分割槽

  • 固定分割槽,既不適應大尺寸程式,又存在記憶體內零頭,有浪費

  • 可變分割槽:

    • 按程序的記憶體需求來動態劃分分割槽
    • 建立一個程序時,根據程序所需主存量檢視主存中是否有足夠的空閒空間
      • 若有,則按需要量分割一個分割槽
      • 若無,則令該程序等待主存資源
    • 由於分割槽大小按照程序實際需要量來確定,因此主存內的分割槽個數是隨機變化的,會產生記憶體外零頭,通過移動分割槽解決。

分頁儲存

  • 分頁實現:
  1. 主存劃分為固定大小的頁架

  2. 程式根據頁架尺寸將邏輯地址分頁

  3. 不同的頁可以放在不同頁架中,不需要連續

  4. 利用頁表完成邏輯地址到實體地址轉換

    • 邏輯地址;頁號+單元號,實體地址:頁架號+單元號。從頁號到頁架號,查頁表
  5. 基本思想:區域性性原理,把程序全部頁面裝入虛擬儲存器,執行時先把部分頁面裝入實際記憶體,然後,根據執行行為,動態調入不在主存的頁,同時進行必要的頁面調出

  • 頁的共享:不同程序通過頁的共享來完成資料共享和程式共享

  • 快表機制:

    • 原因:頁表放在主存,每次地址轉換得訪問兩次主存。降低了存取速度。
      • 第一次,訪問頁表,完成頁號到頁架號的轉換
      • 第二次,訪問主存中的絕對地址(頁架號+單元號)
    • 解決:利用Cache存放部分經常訪問的頁表,快表記憶體放頁號到頁架號的對映
  • 缺頁中斷:

    • 訪問的頁不在主存,由CPU發出缺頁中斷,需要作業系統將其調入主存後再進行訪問。
      • 主存若有空閒頁架,則調入頁
      • 主存若無空閒頁架,則通過頁面排程演算法淘汰頁,如果調出的頁有修改,則寫回磁碟
      • 更新快表和頁表

分段儲存

  • 基本思想:把程序的所有分段都存放在輔存中,程序執行時先把當前需要的一段或幾段裝入主存,在執行過程中訪問到不在主存的段時再把它們動態裝入。引入段表。

  • 分段把主存分為多個段,段定義一組邏輯資訊,程式碼段、資料段、堆疊段等等。更符合使用者的需要。而分頁是為了消減記憶體的外零頭,通過離散分配和固定頁架大小實現,提高記憶體利用率。頁大小是固定的,段大小是可變的

段頁式儲存

  • 段式儲存管理可以基於頁式儲存管理實現。每一段不必佔據連續的儲存空間,可存放在不連續的主存頁架中。
  • 通過裝入段中部分頁面擴充為段頁式儲存管理。引入段頁表。

頁面排程演算法

  • 頁面排程演算法設計不當,會出現抖動:剛被淘汰的頁面立即又要調入,並如此反覆。
排程演算法 原理
OPT(最佳) 當要調入新頁面時,首先淘汰以後不再訪問的頁,然後選擇距現在最長時間後再訪問的頁。只可模擬,不可實現。
FIFO(先入先出) 總是淘汰最先調入主存的那一頁,或者說主存駐留時間最長的那一頁。只考慮到程式執行的順序性,沒考慮到迴圈性。
LRU(最近最少使用) 淘汰最近一段時間較久未被訪問的那一頁。嚴格實現的代價大(需要維持特殊佇列)
LFU(最不常用) 淘汰最近一段時間內訪問次數較少的頁面。每訪問頁1次就給這個頁計數器加1,選擇計數值最小的頁面淘汰。
CLOCK(時鐘排程) 採用迴圈佇列機制構造頁面佇列,形成了一個類似於鐘錶面的環形表。佇列指標則相當於鐘錶面上的錶針,指向可能要淘汰的頁面。頁面調入主存或被訪問時,其引用標誌位置1。淘汰頁面時,從指標當前指向的頁面開始掃描迴圈佇列。把所遇到的引用標誌位是1的頁面的引用標誌位清0,並跳過。把所遇到的引用標誌位是0的頁面淘汰,指標推進一步。每次逐出最近未使用的,是對LRU的一個低成本的模擬。LRU演算法快取淘汰演算法雖然好,但是它的時間複雜度一定是o(n),因為需要遍歷歷史的資料。

MMU與反置頁表

  • 記憶體管理單元MMU:CPU管理虛擬/物理儲存器的控制線路,把虛擬地址對映為實體地址,並提供儲存保護,必要時確定淘汰頁面

  • 反置頁表

    • MMU用的資料結構,表項包含:正在訪問該頁框的程序標識、頁號、標誌位(有效、修改、鎖定等資訊)、雜湊鏈指標。
    • 反置頁表是以頁架號為索引,根據頁架號來查頁號,完成實體地址到邏輯地址的轉換
  • 反置頁表引入原因:

    • 一般頁表存在的問題:大多數的作業系統會為每個程序提供一個頁表。很佔實體記憶體。
    • 反置頁表,所有程序共同使用一張頁表,這張頁表中的條目的數量和記憶體中物理的頁框的數量是一樣的,控制了頁表的大小。使用反置頁表雖然減少了記憶體的浪費,但是增加了查詢時間並且增加了共享記憶體的難度。
  • 基於反置頁表的地址轉換過程:

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