作業系統(二) to be continued
3 儲存管理
邏輯地址與實體地址
-
邏輯地址,使用者程式設計使用的地址空間
-
實體地址,程式執行使用的地址空間
-
地址轉換:將邏輯地址轉換為實體地址
主存複用
-
多道程式設計需要複用主存
-
按照分割槽複用:
- 主存劃分為多個固定/可變尺寸的分割槽
- 一個程式/程式段佔用一個分割槽
-
按照頁架複用:
- 主存劃分成多個固定大小的頁架
- 一個程式/程式段佔用多個頁架
-
段式程式設計:把一個程式設計成多個段,程式碼段、資料段、堆疊段、等等
儲存管理
-
段式儲存管理:段式二維邏輯地址空間的程式佔用多個主存可變分割槽
-
頁式儲存管理:一維邏輯地址空間的程式佔用多個主存頁架區
-
段頁式儲存管理:段式二維邏輯地址空間的程式佔用多個主存頁架區
儲存保護
-
為避免主存中的多個程序相互干擾,必須對主存中的程式和資料進行保護
- 私有主存區中的資訊:可讀可寫
- 公共區中的共享資訊:根據授權
- 非本程序資訊:不可讀寫
-
CPU檢查是否允許訪問,不允許則產生地址保護異常
虛擬儲存
-
引入原因:
- 使用者編寫程式必須考慮主存容量限制
- 多道程式設計的道數受到限制
-
可行原因:
- 程式執行區域性性原理:在一段較短的時間內,程式的執行僅限於某個部分,相應地,它所訪問的儲存空間也侷限於某個區域。
-
實現思路:(核心)
- 區域性性原理:一個程式只要部分裝入記憶體就可以執行
- (磁碟)虛擬地址空間:容納程序裝入
- (主存)實際地址空間:承載程序執行
-
使用者視角,計算機系統具有一個容量大得多的主存空間,即虛擬儲存器
固定分割槽與可變分割槽
-
固定分割槽,既不適應大尺寸程式,又存在記憶體內零頭,有浪費
-
可變分割槽:
- 按程序的記憶體需求來動態劃分分割槽
- 建立一個程序時,根據程序所需主存量檢視主存中是否有足夠的空閒空間
- 若有,則按需要量分割一個分割槽
- 若無,則令該程序等待主存資源
- 由於分割槽大小按照程序實際需要量來確定,因此主存內的分割槽個數是隨機變化的,會產生記憶體外零頭,通過移動分割槽解決。
分頁儲存
- 分頁實現:
-
主存劃分為固定大小的頁架
-
程式根據頁架尺寸將邏輯地址分頁
-
不同的頁可以放在不同頁架中,不需要連續
-
利用頁表完成邏輯地址到實體地址轉換
- 邏輯地址;頁號+單元號,實體地址:頁架號+單元號。從頁號到頁架號,查頁表
-
基本思想:區域性性原理,把程序全部頁面裝入虛擬儲存器,執行時先把部分頁面裝入實際記憶體,然後,根據執行行為,動態調入不在主存的頁,同時進行必要的頁面調出
-
頁的共享:不同程序通過頁的共享來完成資料共享和程式共享
-
快表機制:
- 原因:頁表放在主存,每次地址轉換得訪問兩次主存。降低了存取速度。
- 第一次,訪問頁表,完成頁號到頁架號的轉換
- 第二次,訪問主存中的絕對地址(頁架號+單元號)
- 解決:利用Cache存放部分經常訪問的頁表,快表記憶體放頁號到頁架號的對映
- 原因:頁表放在主存,每次地址轉換得訪問兩次主存。降低了存取速度。
-
缺頁中斷:
- 訪問的頁不在主存,由CPU發出缺頁中斷,需要作業系統將其調入主存後再進行訪問。
- 主存若有空閒頁架,則調入頁
- 主存若無空閒頁架,則通過頁面排程演算法淘汰頁,如果調出的頁有修改,則寫回磁碟
- 更新快表和頁表
- 訪問的頁不在主存,由CPU發出缺頁中斷,需要作業系統將其調入主存後再進行訪問。
分段儲存
-
基本思想:把程序的所有分段都存放在輔存中,程序執行時先把當前需要的一段或幾段裝入主存,在執行過程中訪問到不在主存的段時再把它們動態裝入。引入段表。
-
分段把主存分為多個段,段定義一組邏輯資訊,程式碼段、資料段、堆疊段等等。更符合使用者的需要。而分頁是為了消減記憶體的外零頭,通過離散分配和固定頁架大小實現,提高記憶體利用率。頁大小是固定的,段大小是可變的
段頁式儲存
- 段式儲存管理可以基於頁式儲存管理實現。每一段不必佔據連續的儲存空間,可存放在不連續的主存頁架中。
- 通過裝入段中部分頁面擴充為段頁式儲存管理。引入段頁表。
頁面排程演算法
- 頁面排程演算法設計不當,會出現抖動:剛被淘汰的頁面立即又要調入,並如此反覆。
排程演算法 | 原理 |
---|---|
OPT(最佳) | 當要調入新頁面時,首先淘汰以後不再訪問的頁,然後選擇距現在最長時間後再訪問的頁。只可模擬,不可實現。 |
FIFO(先入先出) | 總是淘汰最先調入主存的那一頁,或者說主存駐留時間最長的那一頁。只考慮到程式執行的順序性,沒考慮到迴圈性。 |
LRU(最近最少使用) | 淘汰最近一段時間較久未被訪問的那一頁。嚴格實現的代價大(需要維持特殊佇列) |
LFU(最不常用) | 淘汰最近一段時間內訪問次數較少的頁面。每訪問頁1次就給這個頁計數器加1,選擇計數值最小的頁面淘汰。 |
CLOCK(時鐘排程) | 採用迴圈佇列機制構造頁面佇列,形成了一個類似於鐘錶面的環形表。佇列指標則相當於鐘錶面上的錶針,指向可能要淘汰的頁面。頁面調入主存或被訪問時,其引用標誌位置1。淘汰頁面時,從指標當前指向的頁面開始掃描迴圈佇列。把所遇到的引用標誌位是1的頁面的引用標誌位清0,並跳過。把所遇到的引用標誌位是0的頁面淘汰,指標推進一步。每次逐出最近未使用的,是對LRU的一個低成本的模擬。LRU演算法快取淘汰演算法雖然好,但是它的時間複雜度一定是o(n),因為需要遍歷歷史的資料。 |
MMU與反置頁表
-
記憶體管理單元MMU:CPU管理虛擬/物理儲存器的控制線路,把虛擬地址對映為實體地址,並提供儲存保護,必要時確定淘汰頁面
-
反置頁表
- MMU用的資料結構,表項包含:正在訪問該頁框的程序標識、頁號、標誌位(有效、修改、鎖定等資訊)、雜湊鏈指標。
- 反置頁表是以頁架號為索引,根據頁架號來查頁號,完成實體地址到邏輯地址的轉換
-
反置頁表引入原因:
- 一般頁表存在的問題:大多數的作業系統會為每個程序提供一個頁表。很佔實體記憶體。
- 反置頁表,所有程序共同使用一張頁表,這張頁表中的條目的數量和記憶體中物理的頁框的數量是一樣的,控制了頁表的大小。使用反置頁表雖然減少了記憶體的浪費,但是增加了查詢時間並且增加了共享記憶體的難度。
-
基於反置頁表的地址轉換過程:
- MMU通過雜湊表把程序標識和虛頁號轉換成一個雜湊值,指向反置頁表的一個表目
- MMU遍歷雜湊鏈找到所需程序的虛頁號,該項的索引就是頁架號,通過拼接位移便可生成實體地址
- 若遍歷整個反置頁表中未能找到匹配頁表項,說明該頁不在記憶體,產生缺頁中斷,請求作業系統調入