4 2 虛擬記憶體

2021-10-06 07:33:51 字數 2941 閱讀 2490

​ 虛擬記憶體將記憶體抽象成乙個巨大的,統一的陣列,進而將使用者看到的邏輯記憶體與物理記憶體分開,使使用者程式產生已經被分配了連續記憶體的錯覺。使得我們程式設計時不再受物理記憶體大小的限制。虛擬記憶體通過按需分配物理記憶體空間,所以記憶體中可以載入更多的程式,提高了併發度。

2.1.1 定義

​ 按需調頁就是先將程序儲存在磁碟上,在需要的時候才將相應的頁調入記憶體。

2.1.2 實現方法

​ 當程序訪問頁時,先檢查程序內部頁表,如果頁表中的該頁對應的位是「無效位「,那麼就將會產生乙個頁錯誤(中斷),然後作業系統負責找到乙個空閒幀,再把磁碟上對應的頁載入到這個空閒幀,最後重新開始因為陷阱而中斷的指令。

2.1.3 效能分析

​ 因為按需調頁在產生頁錯誤後會訪問磁碟,如果頁錯誤率太高會導致效能下降,所以降低也錯誤率是實現虛擬記憶體的關鍵所在。

2.2.1 引入

​ 在上面的換入過程中提到了作業系統查詢乙個空閒幀,但是如果記憶體已經被佔滿了,那麼就必須找到乙個幀作為犧牲幀,將犧牲幀寫到磁碟,然後把該幀所占用的記憶體空閒出來,將新的頁載入到這個幀裡面。

​ 上述過程就是頁面置換的思想,為了找到合適的犧牲幀,必須使用合適的頁置換演算法,否則會使系統的頁錯誤率上公升。

2.2.2 fifo 演算法

​ 開發演算法的時候總是從最簡單的思路入手,我們很容易想到的就是將最早被分配的頁置換出去,但這種演算法的效能一般也不太好,在頁置換中,fifo 會引起最高的頁錯誤率(因為剛被換出的頁在最近就可能被使用)。

​ 該演算法在如圖所示的情況下會引起 15 次頁錯誤。

2.2.3 最優置換演算法

​ 選取最遠將使用的頁淘汰,該演算法法引發的頁錯誤率是最低的。

​ 在同樣的情況下,最優置換演算法只發生了 9 次頁錯誤。但是該演算法是實現不了的,因為我們無法知道將來到底哪些頁需要被使用。

2.2.4 lru 頁置換

​ 就如程序排程演算法中的最短作業優先排程一樣,我們無法知道將來哪個程序將使用最短的 cpu 區間,但是我們可以用最近的情況來**將來的情況。在頁置換演算法中也可以使用同樣的演算法,如果乙個頁在最近一段時間內使用的次數最少,那麼我們就可以大致地認為該頁在將來也會最晚被使用,這就是 lru(最近最少使用) 演算法

​ 在同樣的情況下,lru 演算法發生了 12 次頁錯誤,依然優於 lru 演算法。

時鐘方法實現:為每個頁都維護乙個時鐘用來記錄該頁最後被使用的時間,在淘汰的時候就選擇時鐘最小的進行淘汰,尋找最小的時鐘是需要進行搜尋。

棧方法實現:使用具有頭指標和尾指標的雙向鍊錶來實現,將最近最少使用的頁放到棧頂,最近使用的頁放到棧的底部,這樣每當彈出乙個元素時只需要改變指標即可,避免了搜尋。

現實情況:如果沒有足夠的硬體支援,那麼每次進行記憶體訪問,都需要產生中斷,陷入作業系統來更新時鐘或者棧,這將會使記憶體引用慢至少 10 倍。所以這種方法基本是不使用的。

2.2.5 近似 lru 頁置換

​ 硬體很難提供實現 lru 所需的功能,但是我們可以近似 lru,作業系統為頁表中的每一項都提供乙個引用位,每當引用乙個頁時,相應頁表的引用位就會被硬體修改。

​ 開始,作業系統將所有的引用位都清零。隨著使用者程序的執行,與引用頁相關聯的引用位被硬體置位(置位 1)。通過檢查引用位就可以確定哪些頁被使用過而哪些頁未被使用過。在此基礎上就可以開發演算法:

1. 二次機會演算法(clock 演算法)

**存在的問題**:如果所有頁的引用位都為 1,那麼必須轉一圈後將第一頁淘汰,clock 演算法就退化成了 fifo 演算法。
2. 二次機會演算法的改進

​ 按照 fifo 的方式定時將一定個數的 1 清為 0.

3. 增強型的二次機會演算法

​ 在二次機會演算法中,我們選擇乙個頁的時候,只考慮到了其最近是否被引用,而沒有考慮到是否被修改。事實上,如果乙個頁沒有被修改,那麼則不用將其寫到磁碟,這樣可以減少一次 io,所以我們可以增加乙個位來表示其是否被修改,使用有序數對的方式來實現:

​ (0, 0):最近沒被使用,且沒被修改——用於置換的最佳頁

​ (0, 1):最近沒有使用但修改過

​ (1, 0):最近使用過但沒修改

​ (1, 1):最近使用過且修改過

​ 因為我們的置換演算法一般是區域性置換的,這樣可以不影響其他程序,所以給每個程序分配多少幀成了問題,我們可以使用平均分配,或者按照程序的優先順序進行分配。

​ 但是如果給乙個程序分配了過多的幀,會浪費資源,如果分配的過少,就會產生顛簸

​ 顛簸:系統內的程序增多 => 每個程序的缺頁率增大 => 缺頁率增大到一定程度,程序總是等待調頁完成 => cpu 利用率降低 => 程序進一步增多,缺頁率更大…

虛擬記憶體應用

虛擬記憶體的重要性體現在下面幾個方面 1 虛擬記憶體可以對映到硬碟,以達到擴充套件記憶體的作用,這樣系統在物理記憶體已經用滿的情況下,就不會因為沒有記憶體可用,而導致系統崩潰。2 虛擬記憶體是以程序空間為定址空間的,一般情況,程序使用者模式下的定址空間 是2g,為了避免記憶體的碎片,可以把2g程序空...

虛擬記憶體(Virtual Memory)

虛擬記憶體 virtual memory 是windows管理所有可用記憶體的方式。對於32位windows系 統,每個程序所用到的虛擬記憶體位址從0到2 32 1,總容量4gb,其中2gb是與作業系統以 及其他所有程序所共享,另外2gb分派給程序獨佔 這就是常說的32位windows中乙個進 程最...

虛擬記憶體使用

虛擬記憶體使用一 簡介windows 提供了3 中進行記憶體管理的方法,包括 虛擬記憶體 一般用來管理大型資料結構,受到硬碟調頁檔案的支援 記憶體對映檔案 常用來管理大型資料流和多程序共享。記憶體堆 最適合用來管理大量的小物件。二 虛擬記憶體的使用 1 我們可以在程序的位址空間中保留乙個區域 pvo...