存儲器管理知識點總結
文章目錄
- 存儲器管理知識點總結
- 存儲管理
- 邏輯地址(相對地址):用戶編程所使用的地址空間
- 物理地址(絕對地址):程序執行所使用的地址空間
- 主存儲器的複用
- 存儲管理的基本模式
- 地址轉換(重定位):把邏輯地址轉換成絕對地址
- 主存儲器空間的分配與去配
- 主存儲器空間的共享
- 存儲保護
- 主存儲器空間的擴充
- 虛擬存儲器思想的提出
- 存儲管理涉及的存儲對象
- 高速緩存存儲器(Cache)
- 單連續分區存儲管理:每個進程佔用一個物理上完全連續的存儲空間(區域)
- 可變分區存儲管理:按照進程的內存需求來動態劃分
- 固定分區存儲管理
- 頁式存儲管理
- 段式存儲管理
存儲管理
邏輯地址(相對地址):用戶編程所使用的地址空間
邏輯地址從0開始編號,兩種形式:
- 一維邏輯地址(地址)
- 二維邏輯地址(段號:段內地址)
段式程序設計
- 把一個程序設計成多個段
- 代碼段、數據段、堆棧段等等
- 用戶可以自己應用段覆蓋技術擴充內存空間使用量
- 這一技術是程序設計技術,不是OS存儲管理的功能
物理地址(絕對地址):程序執行所使用的地址空間
- 處理器執行指令時按照物理地址進行
主存儲器的複用
- 多道程序設計需要複用主存
- 按照分區複用:
- 主存劃分爲多個固定/可變尺寸的分區
- 一個程序/程序段佔用一個分區
- 按照頁架複用:
- 主存劃分成多個固定大小的頁架
- 一個程序/程序段佔用多個頁架
存儲管理的基本模式
- 單連續存儲管理:一維邏輯地址空間的程序佔用一個主存固定分區或可變分區
- 段式存儲管理:段式二維邏輯地址空間的程序佔用多個主存可變分區
- 頁式存儲管理:一維邏輯地址空間的程序佔用多個主頁頁架區
- 段頁式存儲管理:段式二維邏輯地址空間的程序佔用多個主存頁架區
地址轉換(重定位):把邏輯地址轉換成絕對地址
- 靜態重定位:在程序裝入內存時進行地址轉換
- 由裝入程序執行,早期小型OS使用
- 動態重定位:在CPU執行程序時進行地址轉換
- 從效率出發,依賴硬件地址轉換機構
主存儲器空間的分配與去配
- 分配:進程裝入主存時,存儲管理軟件進行具體的主存分配操作,並設置一個表格記錄主存空間的分配情況
- 去配:當某個進程撤離或主動歸還主存資源時,存儲管理軟件要收回它所佔用的全部或者部分存儲空間,調整主存分配表信息
主存儲器空間的共享
- 多個進程共享主存儲器資源:多道程序設計技術使若干個程序同時進入主存儲器,各自佔用一定數量的存儲空間,共同使用一個主存儲器
- 多個進程共享主存儲器的某些區域:若干個協作進程有共同的主存程序塊或者主存數據塊
存儲保護
- 爲避免主存中的多個進程相互干擾,必須對主存中的程序和數據進行保護
- 私有主存區中的信息:可讀可寫
- 公共區中的共享信息:根據授權
- 非本進程信息:不可讀寫
- 這一功能需要軟硬件協同完成
- CPU檢查是否允許訪問,不允許則產生地址保護異常,由OS進行相應處理
主存儲器空間的擴充
- 存儲擴充:把磁盤作爲主存擴充,只把部分進程或進程的部分內容裝入內存
- 對換技術:把部分不運行的進程調出
- 虛擬技術:只調入進程的部分內容
- 這一工作需要軟硬件協作完成
- 對換進程決定對換,硬件機構調入
- CPU處理到不在主存的地址,發出虛擬地址異常,OS將其調入,重執指令
虛擬存儲器思想的提出
主存容量限制帶來諸多不便
- 用戶編寫程序必須考慮主存容量限制
- 多道程序設計的道數受到限制
用戶編程行爲分析
- 全面考慮各種情況,執行時有互斥性
- 順序性和循環性等空間局部性行爲
- 某一階段執行的時間局部性行爲
考慮部分調入進程內容
基本思想
- 存儲管理把進程全部信息放在輔存中,執行時先將其中一部分裝入主存,以後根據執行行爲隨用隨調入
- 如主存中沒有足夠的空閒空間,存儲管理需要根據執行行爲把主存中暫時不用的信息調出到輔存上去
實現思路
- 需要建立與自動管理兩個地址空間
- (輔存)虛擬地址空間:容納進程裝入
- (主存)實際地址空間:承載進程執行
- 對於用戶,計算機系統具有一個容量大得多的主存空間,即虛擬存儲器
- 虛擬存儲器是一種地址空間擴展技術,通常意義上對用戶編程是透明的,除非用戶需要進行高性能的程序設計
存儲管理涉及的存儲對象
- 存儲管理是OS管理主存儲器的軟件部分
- 爲獲得更好的處理性能,部分主存程序與數據(特別是關鍵性能數據)被調入Cache,存儲管理需要對其進行管理,甚至包括對聯想存儲器的管理
- 爲獲得更大的虛擬地址空間,存儲管理需要對存放在硬盤、固態硬盤、甚至網絡硬盤上的虛擬存儲器文件進行管理
高速緩存存儲器(Cache)
- Cache是介於CPU和主存儲器間的高速小容量存儲器,由靜態存儲芯片SRAM組成,容量較小但比主存DRAM技術更加昂貴而快速,接近於CPU的速度
- CPU往往需要重複讀取同樣的數據庫,Cache的引入與緩存容量的增大,可以大幅提升CPU內部讀取數據的命中率,從而提高系統性能
- 構成
- 高速存儲器
- 聯想存儲器:根據內容進行尋址的存儲器
- 地址轉換部件:通過聯想存儲器建立目錄表以實現快速地址轉換。命中時直接訪問Cache;未命中時從內存讀取放入Cache
- 替換部件:在緩存已滿時按一定策略進行數據塊替換,並修改地址轉換部件
- 分級:由於CPU芯片面積和成本,Cache很小。根據成本控制,劃分L1,L2,L3三級
- L1 Cache:分爲數據緩存和指令緩存;內置;成本最高,對CPU的性能影響最大;通常在32KB-256KB之間
- L2 Cache:分內置和外置兩種,後者性能低一些;通常在512KB-8MB之間
- L3 Cache:多爲外置,在遊戲和服務器領域有效;但對很多應用來說,總線改善比設置L3更加有利於提升系統性能
單連續分區存儲管理:每個進程佔用一個物理上完全連續的存儲空間(區域)
- 主存區域劃分爲系統區和用戶區
- 設置一個柵欄寄存器界分兩個區域,硬件用它在執行時進行存儲保護
- 一般採用靜態重定位進行地址轉換
- 靜態重定位:在裝入一個作業時,把該作業中程序的指令地址和數據地址全部轉換成絕對地址
- 硬件實現代價低
- 適用於單用戶單任務操作系統,如DOS
可變分區存儲管理:按照進程的內存需求來動態劃分
基本思想
- 固定分區存儲管理不夠靈活,既不適應大尺寸程序,又存在內存內零頭,有浪費
- 能否按照進程實際內存需求動態劃分分區,並允許分區個數可變
創建一個進程時,根據進程所需主存量查看主存中是否有足夠的空閒時間
- 若有,則按需要量分割一個分區
- 若無,則令該進程等待主存資源
由於分區大小按照進程實際需要量來確定,因此分區個數是隨機變化的
內存分配
- 最先適應分配算法
- 鄰近適應分配算法
- 最優適應分配算法
- 最壞適應分配算法
內存零頭
- 固定分區方式會產生內存內零頭,可變分區方式也會隨着進程的內存分配產生一些小的不可用的內存分區,稱爲內存外零頭
- 最優適配算法最容易產生外零頭
- 任何適配算法都不能避免產生外零頭
移動技術
- 移動分區以解決內存外零頭
- 需要動態重定位支撐
主存分區表
已分配區情況表
起址 | 長度 | 標誌 |
---|---|---|
4K | 6K | J1 |
46K | 6K | J2 |
空 | ||
空 | ||
… | … | … |
未分配區情況表
起址 | 長度 | 標誌 |
---|---|---|
10K | 36K | 未分配 |
52K | 76K | 未分配 |
空 | ||
空 | ||
… | … | … |
固定分區存儲管理
-
支持多個分區
-
分區數量固定
-
分區大小固定
-
可用靜態重定位
-
硬件實現代價低
-
早期OS採用
-
主存分配表
分區號 起始地址 長度 佔用標誌 1 4K 8K 0 2 12K 16K Job1 3 28K 16K 0 4 44K 24K 0 5 68K 24K Job2 6 92K 36K 0
頁式存儲管理
基本原理
- 分頁存儲器將主存劃分成多個大小相等的頁架
- 受頁架尺寸限制,程序的邏輯地址也自然分成頁
- 不同的頁可以放在不同頁架中,不需要連續
- 頁表用於維繫進程的主存完整性
地址
- 頁式存儲管理的邏輯地址由兩部分組成:頁號和單元號
- 物理地址:頁架號和單元號
- 地址轉換可以通過查頁表完成
內存分配/去配
- 用一張位示圖來記錄主存分配情況
- 建立進程頁表維護主存邏輯完整性
頁的共享
- 頁式存儲管理能夠實現多個進程共享程序和數據
- 數據共享:不同進程可以使用不同頁號共享數據頁
- 程序共享:不同進程必須使用相同頁號共享代碼頁
- 共享代碼頁中的(JMP<頁內地址>)指令,使用不同頁號是做不到
地址轉換代價
- 頁表放在主存:每次地址轉換必須訪問兩次主存
- 按頁號讀出頁表中的相應頁架號
- 按計算出來的絕對地址進行讀寫
- 存在問題:降低了存取速度
- 解決辦法:利用Cache存放部分頁表
快表:存放在高速存儲器中的頁表部分
- 爲提供地址轉換速度,設置一個專用的高速存儲器,用來存放頁表的一部分
- 快表表項:頁號,頁架號
- 這種高速存儲器是聯想存儲器,即按照內容尋址,而非按照地址訪問·
引入快表後的地址轉換代價
- 假設主存訪問時間爲200毫微秒,快表訪問時間爲40毫微秒,查快表的命中率是90%,平均地址轉換代價爲(200+40)*90%+(200+200)*10%=256毫微秒
- 比兩次訪問主存時間(400毫微秒)下降了36%((400-256)/400)
基於快表的地址轉換流程
- 按邏輯地址中的頁號查快表
- 若該頁已在快表中,則由頁架號和單元號形成絕對地址
- 若該頁不在快表中,則再查主存頁表形成絕對地址,同時將該頁登記到快表中
- 當快表填滿後,又要登記新頁時,則需在快表中按一定策略淘汰一箇舊登記項
多道程序環境下的進程表
-
進程表中登記了每個進程的頁表
-
進程佔有處理器運行時,其頁表起始地址和長度送入頁表控制寄存器
-
頁表控制寄存器
用戶作業名 頁表地址 頁表長度 AB 0010 4 CD 0014 3 EF 0017 7
頁式虛擬存儲管理
定義
- 把進程全部裝入虛擬存儲器,執行時先把部分頁面裝入實際內存,然後,根據執行行爲,動態調入不在主存的頁,同時進行必要的頁面調出
- 現代OS的主流存儲管理技術
- 首次只把進程第一頁信息裝入內存,稱爲請求頁式存儲管理
頁式虛擬存儲管理的頁表
標誌位 | 主存塊號 | 輔助存儲器地址 |
---|---|---|
擴充頁表項,指出:
- 每頁的虛擬地址、實際地址
- 主存駐留地址、寫回標誌、保護標誌、引用標誌、可移動標誌
實現
- CPU處理地址
- 若頁駐留,則獲得塊號形成絕對地址
- 若頁不在內存,則CPU發出缺頁中斷
- OS處理缺頁中斷
- 若有空閒頁架,則根據輔存地址調入頁,更新頁表與快表等
- 若無空閒頁架,則決定淘汰頁,調出已修改頁,調入頁,更新頁表與快表
頁面調度
- 當主存空間已滿而又需要裝入新頁時,頁式虛擬存儲管理必須按照一定的算法把已在主存的一些頁調出去
- 選擇淘汰頁的工作稱爲頁面調度
- 選擇淘汰頁的算法稱爲頁面調度算法
- 頁面調度算法設計不當,會出現(剛被淘汰的頁面立即又要調入,並如此反覆)
- 這種現象稱爲抖動或顛簸
- 先進先出FIFO頁面調度算法
- 總是淘汰最先調入主存的那一頁,或者說主存駐留時間最長的那一頁(常駐的除外)
- 模擬的是程序執行的順序性,有一定合理性
- 最近最少用LRU頁面調度算法
- 淘汰最近一段時間較久未被訪問的那一頁,即那些剛被使用過的頁面,可能馬上還要被使用到
- OPT頁面調度算法:
- 當要調入新頁面時,首先淘汰以後不再訪問的頁,然後選擇距現在最長時間後再訪問的頁
- 該算法由Belady提出,稱爲Belady算法,又稱最佳算法(OPT,Optimal page replacement)
- OPT只可模擬,不可實現
- OPT頁面調度算法:
- 模擬了程序執行的局部屬性,既考慮了循環性又兼顧了順序性
- 嚴格實現的代價大(需要維持特殊隊列)
- 模擬實現:
- 每頁建一個引用標誌,供硬件使用
- 設置一個時間間隔中斷:中斷時頁引用標誌置0
- 地址轉換時,頁引用標誌置1
- 淘汰頁面時,從頁引用標誌爲0z的頁中間隨機選擇
- 時間間隔多長是個難點
- 淘汰最近一段時間較久未被訪問的那一頁,即那些剛被使用過的頁面,可能馬上還要被使用到
- 最不常用LFU頁面調度算法
- 淘汰最近一段時間內訪問次數較少的頁面,對OPT的模擬性比LRU更好
- 基於時間間隔中斷,並給每一頁設置一個計數器
- 時間間隔中斷髮生後,所有計數器清0
- 每訪問頁1次就給計數器加1
- 選擇計數值最小的頁面淘汰
- 時鐘CLOCK頁面調度算法
- 採用循環隊列機制構造頁面隊列,形成了一個類似於鍾表面的環形表
- 隊列指針則相當於鍾表面上的錶針,指向可能要淘汰的頁面
- 使用頁引用標誌位
- 工作流程:
- 頁面調入主存時,其引用標誌位置1
- 訪問主存頁面時,其引用標誌位置1
- 淘汰頁面時,從指針當前指向的頁面開始掃描循環隊列
- 把所遇到的引用標誌位是1的頁面的引用標誌位清0,並跳過
- 把所遇到的引用標誌位是0的頁面淘汰,指針推進一步
缺頁中斷率
- 假定進程P共n頁,系統分配頁架數m個
- P運行中成功訪問次數爲S,不成功訪問次數爲F,總訪問次數A=S+F
- 缺頁中斷率定義爲:f=F/A
- 缺頁中斷率是衡量存儲管理性能和用戶編程水平的重要依據
- 影響因素
- 分配給進程的頁架數:可用頁架數越多,則缺頁中斷率就越低
- 頁面的大小:頁面尺寸越大,則缺頁中斷率就越低
- 用戶的程序編制方法:在大數據量情況下,對缺頁中斷率也有很大影響
// 程序將數組置爲“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)次缺頁中斷
反置頁表
提出:
- 頁面及相關硬件機制在地址轉換、存儲保護、虛擬地址訪問中發揮了關鍵作用
- 爲頁式存儲管理設置專門硬件機構
- 內存管理單元MMU:CPU管理虛擬/物理存儲器的控制線路,把虛擬地址映射爲物理地址,並提供存儲保護,必要時確定淘汰頁面
- 反置頁表IPT:MMU用的數據結構
基本設計思想
- 針對內存中的每個頁架建立一個頁表,按照塊號排序
- 表項包含:正在訪問改頁框的進程標識、頁號及特徵位和哈希鏈指針等
- 用來完成內存頁架到訪問進程頁號的對應,即物理地址到邏輯地址的轉換
頁表項
- 頁號:虛擬地址頁號
- 進程標誌符:使用該頁的進程號(頁號和進程標誌符結合起來標誌一個特定進程的虛擬地址空間的一頁)
- 標誌位:有效、引用、修改、保護的鎖定等標誌信息
- 鏈指針:哈希鏈
基於反置頁表的地址轉換過程
- MMU通過哈希表把進程標識和虛頁號轉換成一個哈希值,指向IPT的一個表目
- MMU遍歷哈希鏈找到所需進程的虛頁號,該項的索引就是頁架號,通過拼接位移便可生成物理地址
- 若遍歷整個反置頁表中未能找到匹配頁表項,說明該頁不在內存,產生缺頁中斷,請求操作系統調入
段式存儲管理
段式程序設計
- 每個程序可由若干段組成,每一段都可以從“0”開始編址,段內的地址是連續的
- 分段存儲器的邏輯地址由兩部分組成,段號、單元號
基本思想
- 段式存儲管理基於可變分區存儲管理實現,一個進程要佔用多個分區
- 硬件需要增加一組用戶可見的段地址寄存器(代碼段、數據段、堆棧段、附加段),供地址轉換使用
- 存儲管理需要增加設置一個段表,每個段佔用一個段表項,包括:段始址、段限長,以及存儲保護、可移動、可擴充等標誌位
段的共享
- 通過不同進程段表中的項指向同一個段基址來實現
- 對共享段的信息必須進行保護,如規定只能獨處不能寫入,不滿足保護條件則產生保護中斷
段式虛擬存儲管理的基本思想
- 把進程的所有分段都存放在輔存中,進程運行時先把當前需要的一段或幾段裝入主存,在執行過程中訪問到不在主存的段時再把它們動態裝入
- 段式虛擬存儲管理中段的調進調出是由OS自動實現的,對用戶透明
- 與段覆蓋技術不同,它是用戶控制的主存擴充技術,OS不感知
段表擴充
-
特徵位:00(不在內存)01(在內存)11(共享段)
-
存取權限:00(可執行)01(可讀)11(可寫)
-
擴充位:0(固定長)1(可擴充)
-
標誌位:00(未修改)01(已修改)11(不可移動)
段號 特徵 存取權限 擴充位 標誌位 主存始址
段頁式存儲管理
- 基本思想
- 段式存儲管理可以基於頁式存儲管理實現
- 每一段不必佔據連續的存儲空間,可存放在不連續的主存頁架中
- 能夠擴充爲段頁式虛擬存儲管理
- 裝入部分段,或者裝入段中部分頁面