存儲器管理與虛擬存儲器
存儲器的功能是保存數據,存儲器的發展方向是高速、大容量和小體積
重定位:實現邏輯地址(相對地址)到物理地址(絕對地址)的映射
程序的裝入和鏈接
裝入
編輯----編譯----鏈接----裝入----運行
絕對裝入
- 編譯后,裝入前已產生了絕對地址(內存地址),裝入時不再作地址重定位
- 絕對地址的產生:1. 由編譯器完成,2. 由程序員編程完成
- 對 1. 而言,編程用符號地址。
可重定位裝入
- 靜態重定位:地址轉換在裝入時一次完成,由軟件實現(重定位裝入程序完成)。
缺點:不允許程序運行時在內存中移動位置。
動態運行時裝入
- 在裝入后不能移動
- 該情況一般在執行時才完成相對地址向絕對地址的轉換,需要硬件地址變換 “重定位寄存器”的支持,才能保證進程的可移動性
鏈接
靜態鏈接
- 對相對地址的修改
- 變換外部調用符號
裝入時動態鏈接
- 便於修改和更新
- 便於實現對目標模塊的共享
運行時動態鏈接
連續分配方式
單一連續分配
- 內存分為兩個區域:系統區,用戶區。應用程序裝入到用戶區,可使用用戶區全部空間
- 最簡單,適用於單用戶、單任務的OS
- 優點:易於管理
- 缺點:對要求內存空間少的程序,造成內存浪費;程序全部裝入,很少使用的程序部分也占用內存
分區式連續分配
固定式
將內存划分成若干個連續區域,稱為分區。每個分區只能存儲一個程序,而且程序也只能在它所駐留的分區中運行。有n個分區,則可同時裝入n個作業/任務。
- 分區大小:
相等
不相等:不相等利用率更高 - 內存分配:
數據結構- 分區表:將分區按大小排序,並將其地址、分配標識作記錄
例:dos的MCB
- 分區表:將分區按大小排序,並將其地址、分配標識作記錄
- 優缺點:
優點:簡單;缺點:有碎片(內零頭)
可變式
內存不預先划分好,當作業裝入時,根據作業的需求和內存空間的使用情況決定是否分配。若有足夠的空間,則按需分割一部分分區給該進程。
數據結構:
- 空閑分區表
- 空閑分區鏈
分配算法:
- 首次適應算法
要求:分區按低址---高址鏈接,找到第一個大小滿足的分區
低址部分不斷划分留下碎片,低址內存使用頻繁 - 循環首次適應算法
從首次適應中上次找到的空閑分區的下一個開始查找
空閑分區分布均勻,提高了查找速度,但缺乏大的空閑分區 - 最佳適應算法(和最壞適應算法)
分區按大小遞增排序;分區釋放時需插入到適當位置
內存回收:
- 上鄰空閑區:合並,改大小
- 下鄰空閑區:合並,改大小,首址
- 上、下鄰空閑區:合並,改大小
- 不鄰接,則建立一新表項
可重定位
連續式分配中,總量大於作業大小的多個小分區不能容納作業
緊湊:
- 通過作業移動將原來分散的小分區拼接成一個大分區
- 作業的移動需重定位,是動態(因作業已經裝入)
對換
- 將阻塞進程,暫時不用的程序,數據換出
- 將具備運行條件的進程換入
- 類型
- 整體對換:進程對換,解決內存緊張
- 部分對換:頁面對換/分段對換:提供虛存支持
- 對換空間的管理
外存
對換區比文件區側重於對換速度,因此,對換區一般采用連續分配
采用數據結構和分配回收類似於可變化分區分配 - 換出
- 選出被換出進程:
因素:優先級,駐留時間,進程狀態 - 換出過程:
對於共享段:計數減1, 是0則換出,否則不換
修改PCB和MCB(或內存分配表)
- 選出被換出進程:
- 換入
- 選擇換入進程:優先級,換出時間等
- 申請內存
- 換入
基本分頁存儲管理
連續分配引起碎片問題
碎片問題的解決方案:緊湊方式消耗系統開銷
離散分配:分頁、分段、段頁
分頁:將用戶程序地址分為若干個大小固定的區域,也就是頁
頁面和頁表
頁面和物理塊:邏輯空間和內存空間
頁面大小 :
- 頁太大,頁內碎片大
- 頁太小:頁表可能很長,換入/出效率低
地址結構:
邏輯地址A;頁大小L;頁內偏移d,則頁號P和頁內地址d:
例:系統頁面大小為1kb,A=2170B,P=2,d=122
地址變換機構
基本任務:邏輯地址——物理地址的映射
- 頁號→塊號:通過頁表來完成
- 頁內地址→塊內地址:無需轉換
基本地址變換機構:
- 越界保護
- 每個進程對應一頁表,其信息(如長度、始址)放在PCB中,執行時將其首地址裝入頁表寄存器
需要考慮的問題:
-
頁表放在哪里?整個系統的頁表空間有多大?
-
直接映像的分頁系統對系統效能的不利影響?(影響執行速度,因為CPU至少要訪問兩次主存才能存取到所要數據)
-
基本的地址變換機構
①頁表駐留在內存中
②系統中設置一個頁表寄存器存放頁表在內存中的始址和頁表的長度
③缺點:兩次訪問主存,速度降低近1/2
假設訪問一次內存時間為t
快表:
減少一次內存訪問
假設命中率為a,查找快表需要時間為λ,訪問一次內存時間為t
多級頁表
- 頁表可能很大,將其離散存放在不同頁塊中。
- 建一“外部頁表”來管理這些離散頁表塊。
相當於單級頁表中的頁表寄存器,一般應常駐內存。
每項記錄頁表始址,且增加存在位。 - 64位機器頁表一般>3級,最外層頁表常駐。
基本分段存儲管理
按程序的邏輯結構,將程序的地址空間划分為若干段,各段大小可不相同。在進行存儲分配時,以段為單位,這些段在內存中可以不相鄰接。
每個段有其邏輯意義和功能,便於
- 方便編程
- 分段共享
- 分段保護
- 動態鏈接
- 動態增長
分段地址結構
段表
地址變換
分頁和分段的主要區別
- 頁是信息的物理單位,段是邏輯單位
- 頁長度固定,段長度不固定(由用戶指定)
- 一維與二維
段式管理的優缺點
優點:
- 程序的各段可獨立編譯(修改一個過程不會影響其它無關過程)
- 可采用不同的保護措施(段只包含一種類型的對象,可以有針對這種特定類型的合適的保護)
- 便於共享某些段(常見的例子是共享庫,如圖形庫)
缺點:
- 段長受限制(段長不定會出現空閑區上內存的浪費)
- 段是作為一個整體調入調出,操作時間長
段頁式存儲管理
將用戶程序分成諾干段,把每個段分成若干頁
采用段頁式存儲管理,在CPU中應設置段表控制寄存器
地址變換過程
段頁式存儲管理中,訪問快表失敗時,每訪問一條指令或存取一個操作數都要3次訪問主存
虛擬存儲器
常規存儲器管理方式的特征
- 一次性(指全部裝入)
- 駐留性(指駐留在內存不換出)
局部性原理
- 時間局部性:如循環執行
- 空間局部性:如順序執行
虛擬存儲器
- 具有請求調入功能和置換功能,能從邏輯上對內存容量進行擴充的一種存儲系統
- 實質:以時間換空間,但時間犧牲不大
虛存的實現方式:
- 需要動態重定位
請求分頁系統
- 以頁為單位轉換
- 需硬件
- 請求分頁的頁表機制
- 缺頁中斷
- 地址變換機構
- 需實現請求分頁機制的軟件(置換軟件等)
請求分段系統
- 以段為單位轉換
- 請求分段的段表結構
- 缺段中斷
- 地址變換機構
- 需實現請求分段機制的軟件(置換軟件等)
虛存特征:
- 離散性:部分裝入(若連續則不可能提供虛存),無法支持大作業小內存運行
- 多次性:局部裝入,多次裝入
- 對換性
- 虛擬性
請求分頁
需要:請求頁表機制,缺頁中斷機制,地址變換機制
請求頁表機制
狀態位指示是否已調入內存
缺頁中斷機制
每當所訪問的頁面不存在時,便產生一缺頁中斷,請求OS將所缺頁調入內存
- 一般中斷在CPU一條指令執行完后才檢查,而缺頁中斷在指令執行期間立刻處理
- 一條指令執行期間可能產生多次缺頁中斷
地址變換機制
請求分頁的內存分配
最小物理塊數:能保證進程正常運行所需的最小
- 單地址指令,直接尋址:2塊(一塊存放指令頁面,另一塊存放數據頁面
- 允許間接尋址:3塊
內存分配策略:
- 固定分配局部置換:
固定分配:為每個進程分配一定物理塊,不再改變
局部置換:缺頁只能從分配的n個頁中選一換出,再調入
-難以確定固定分配的頁數(少:置換率高; 多:浪費) - 可變分配全局置換:
可變分配:為每個進程分配一定物理塊,運行期間可增減
全局置換:缺頁從OS保留的空閑塊取出分配,或以所有進程物理塊為目標選出一塊換出,再分配 - 可變分配局部置換
可變分配:為每個進程分配一定物理塊,運行期間可增減
局部置換:只允許再該進程的頁面中選擇患處換入,如果頻繁發生中斷,OS再為其分配若干附加物理塊知道缺頁率減少
物理塊分配算法:
-
平均分配
-
按進程大小比例分配:
n個進程,頁面數為Si,總頁面數為S,總物理塊m,分配到物理塊bi=\[b_{i}=\frac{S_{i}}{S}m \] -
優先權:一部分按比例,一部分考慮優先權
頁面調入策略:
調入時機:
- 預調:(根據空間局部性)目前:成功率≤50%
- 請求調入:較費系統開銷,各有優劣
從何處調頁:
- 對換區(連續):全部從對換區調入所需頁面, 快
- 文件區(離散):修改過的頁面換出到對換區, 稍慢
- UNIX方式:
未運行過的頁面,都應從文件區調入
曾經運行過但又被換出的頁面,從對換區調入
對共享頁,應判斷其是否在內存區
頁面調入過程:
訪問頁面狀態位為0,向CPU發出缺頁中斷,中斷程序先保留CPU環境,查找頁表找到該頁所在的外存物理塊,若此時能容納新頁面,則啟動磁盤I/O,調入內存,修改頁表;若已滿,則按照置換算法,選一頁換出,如果該頁修改位為0,則不必寫回磁盤,繁殖則寫回磁盤。再調入所缺頁,並寫入快表。最后利用修改后的頁表訪問數據物理地址,再訪問數據
缺頁率:進程邏輯空間為n頁,系統分配物理塊數m,訪問頁面成功的次數為S,失敗的次數為F,A=S+F,缺頁率f=
頁面置換算法
先進先出(FIFO):淘汰最先進入內存的頁面
最佳(Optimal):淘汰最長(未來)時間內不再被訪問的頁面
最近最久未使用(LRU):
須為每個在內存中的頁面配置一個移位寄存器:R=Rn-1Rn-2...R1R0,訪問某物理塊時將相應寄存器的Rn-1位置1,定時信號每個一段時間寄存器右移1位,具有最小數值的寄存器就是LRU
然后再用棧保存當前頁面:
Clock置換算法:
為每頁設置一位訪問位,將內存中所有頁面通過指針鏈接成一個循環隊列,被訪問時訪問位置1
淘汰時:訪問位是0,則換出;訪問位是1,則置0,給予頁面第二次駐留內存的機會,再按照FIFO檢查下一個頁面
改進Clock:對於修改過的頁面,換出時所付出的開銷更大
訪問位A,修改位M:A=0,M=0:未被訪問,未被修改,最佳淘汰頁
- 掃描循環隊列,尋找上述最佳淘汰頁,第一次掃描不改變A
- 1失敗則進入第二輪,尋找A=0,M=1;所有掃描過的頁面A置0
- 2失敗則進入第三輪,重復1,再失敗則進入2,一定能找到
性能分析
-
被訪問頁在內存中,且在快表中
內存訪問有效時間EAT=查找快表時間λ+訪問實際物理地址時間t\[EAT=λ+t \] -
被訪問頁在內存中,不在快表中
查找快表+查找頁表+修改快表+訪問實際物理地址\[EAT=λ+t+λ+t \] -
不在內存
查找快表+查找頁表+缺頁中斷處理時間ε+修改快表+訪問實際物理地址\[EAT=λ+t+ ε+λ+t =ε+2(λ+t) \]
考慮到命中率a,缺頁率f:
僅考慮缺頁率,λ=0,a=0
CPU利用率與多道程序度的關系:多道程序度指在內存中並發執行的程序數目。在低度情況下,CPU利用率呈線性變化關系。隨着度的上升,CPU利用率也逐漸上升,最終上升到一個最大值,若在這種情況下,進一步增加度,則系統發生抖動,且CPU利用率將迅速惡化.