覆蓋技術:
-
程序設計分爲常駐區以及覆蓋區
-
覆蓋區可以通過運行與阻塞時換入換出實現內存空間的共享
-
同一覆蓋區的程序模塊之間必須不存在相互調用關係
交換技術:
- 將進程的整個地址空間在某個時刻導入到外存或從外存導入內存
- 交換技術的問題:
- 開銷比較大,只有當內存不足時再換入換出
- 硬盤中交換區必須足夠大以存放所有用戶進程的所有內存的拷貝
- 程序換入時的重定位,動態地址映射方法。
覆蓋和交換的區別:
- 覆蓋發生在一個程序裏面,通過沒有調用關係的模塊共享一個內存區使得空間充分利用,但需要程序員手動指定之間覆蓋模塊的邏輯關係。
- 交換每次是換入換出一個程序,開銷比較大,但由操作系統,不需要程序員手動操作。
虛擬內存:
在頁式或段式內存管理的基礎上實現
- 在裝入程序時,不必將全部裝入內存,只需將當前需要執行的部分頁面或段裝入內存
- 在程序執行過程中,如果需執行的指令或訪問數據未在內存(缺頁或缺段),則處理器通知操作系統將相應的頁面或段調入到內存,然後繼續執行程序。
- 另外,操作系統將內存中暫時不使用的頁面或段調出保存在外存上,從而騰出更多空閒空間存放將要裝入的程序
需要程序具有較好的局部性
以便不需要多次與外存進行換入換出,也就是減少缺頁率。
程序的局部性原理:程序在執行過程中一個較短的時期,所執行的指令地址和指令的操作數地址,分別侷限於一定區域。
- 時間局部性:一次指令的一次執行和下次執行,一個數據的一次訪問和下次訪問都集中在一個較短的時期。
- 空間局部性:當前指令和鄰近幾條指令,當前訪問的數據和鄰近幾個數據都集中在一個較小的區域內。
虛擬內存特徵:
- 大的用戶空間:將物理內存和外存結合起來。
- 部分交換:與交換技術相比,虛擬內存的調入調出是對部分虛擬空間地址進行的。
- 不連續性
虛擬頁式內存管理:
大部分虛擬存儲系統都採用頁式存儲管理技術,即在頁式存儲管理的基礎上,增加請求調頁和頁面置換功能。
缺頁中斷:
分段內存管理:
-
段號+偏移量
-
具有處理不斷增長的數據結構的能力
-
支持共享和保護
段頁式內存管理:
用戶程序的地址空間被劃分爲很多段,再把每個段分爲若干個頁
段號+段內頁號+頁內地址
虛擬內存的操作系統策略:
讀取策略:
何時讀入內存
- 請求分頁(缺頁時纔讀入內存),運行期間調入。
- 預先分頁:局部性原理,一次性調入若干相鄰的頁面。但可能調入的大多數未被訪問,則降低效率。所以實際應用中主要用於進程的首次調入。
當一個進程被換出內存並被置於掛起狀態,它的駐留頁都被換出。當進程被喚醒時,所有以前在內存中的頁都被重新讀回內存。
放置策略:
進程塊在內存中的實際位置
- 純分段機制可以使用最佳適配等方法
- 段頁式或頁式可以有硬件高效實現
置換策略:
最佳置換算法(OPT)
-
淘汰的頁面是以後永不使用或在最長時間內不再訪問的頁面或在較長時間內不再訪問。
-
需要看之後的頁面號引用串,淘汰最長時間不被引用的。
-
但是該算法前提條件是知道之後引用的頁面,而實際運行中操作系統不可能事先知道頁面的訪問序列,因而這種算法只是一種理想算法,實際並不會實現。
先進先出置換算法(FIFO)
-
淘汰最早進入內存的頁面
-
系統維持一個置換隊列,隊列中節點數等於爲進程分配的內存塊數,每次置換刪除隊首節點,新節點插入隊尾。
-
該算法會造成Belady異常,也就是分配多的內存缺頁次數反而增多。
最近最久未使用置換算法(LRU)
- 每次淘汰的頁面是最近最久未使用的頁面
- 性能好,但是實現困難,需要硬件支持,開銷大
時鐘置換算法(CLOCK)
-
也稱爲最近未用算法(NRU)
-
每個頁面都有一個訪問位,將內存中的頁面通過鏈接指針鏈接成一個循環隊列。當頁面被訪問時,其訪問位置置爲1。當需要淘汰一個頁面時,只需要檢查頁面的訪問位。如果是0,則選擇該頁換出;如果是1,則將其置爲0,暫不換出,繼續檢查下一個頁面。若第一輪掃描所有頁面都是1,則將這些頁依次置爲0後,再進行第二輪掃描。
-
若頁面已經存在循環鏈表中,則不需要移動指針。因爲不會查看置換隊列。
改進型時鐘置換算法
-
簡單時鐘置換算法僅考慮一個頁面最近是否被訪問過。事實上如果被淘汰的頁面沒有被修改過,則不需要執行I/O操作寫回外存。所以在其他條件相同情況下,優先淘汰沒有修改過的頁面。
-
因此增加一個修改位,修改位爲1表示頁面被修改過。
-
算法規則:將所有可能被置換的頁面排成一個循環隊列(訪問位,修改位),淘汰一個頁面最多經過四輪掃描
- 第一輪:淘汰(0, 0)。本輪掃描不修改任何標誌位。淘汰優先級爲(0, 0)
- 第二輪:淘汰第一個(0, 1)。本輪掃描所有的訪問位置爲0。淘汰優先級爲(0, 1)
- 第三輪:淘汰第一個(0, 0)。本輪掃描不修改任何標誌位。淘汰優先級爲(1, 0)
- 第四輪:淘汰第一個(0, 1)。淘汰優先級(1, 1)
分配策略:
駐留集:請求分頁存儲管理中給進程分配的物理塊(頁框)的集合,在虛存中駐留集大小一般小於進程的總大小。
若駐留集太小會導致缺頁頻繁,若太大則可能導致多道程序中資源利用率低。
駐留集的大小:
- 固定分配:OS爲每個進程分配一組固定數量的物理塊,在進程運行期間不再改變,駐留集不變
- 可變分配:先爲每個進程分配一定數量的物理塊,在進程運行期間可根據情況做適當的增加或減少。駐留集可變
置換範圍:
- 局部置換:置換隻能選擇進程內部的物理塊
- 全局置換:可以將操作系統保留的空閒物理塊分配給缺頁進程,也可以將別的進程持有的物理塊置換到外存,再分配給缺頁進程。
固定分配局部置換
可變分配全局置換:剛開始爲每個進程分配一定數量的物理塊。操作系統會保持一個空閒物理塊隊列。當某進程缺頁時,從空閒物理塊中取出一塊分配給該進程;若無空閒物理塊。則可選擇一個未鎖定頁面換出外存,再將該物理塊分配給缺頁的進程。
可變分配局部置換
抖動(顛簸)現象
頻繁的頁面換入換出行爲,原因是分配給進程的物理塊不夠
防止方法:
工作集:進程在某段時間間隔實際訪問的頁面集合。
工作集大小可能小於窗口尺寸,根據工作集大小動態調整窗口尺寸,一般來說駐留集大小不能小於工作集大小。
調入策略:
從何處調入頁面