本文是對操作系統概念(第七版)——虛擬內存的學習總結,不足之處,歡迎批評指正。
1、虛擬內存的理解:
先將部分程序導入內存,執行完成後導入下一部分程序,給我們的感覺是內存變大了,實際上物理內存的大小並未發生變化。
虛擬內存的優點:
(1)將邏輯內存和物理內存分開。
(2)虛擬內存允許文件和內存通過共享頁而爲兩個或多個進程所共享。
2、按需調頁
按需調頁:顧名思義,在需要時才調入相應的頁。
支持按需調頁的硬件:
(1)頁表:該表能夠通過有效-無效爲或保護位的特定值,將條目設爲無效。
(2)次級存儲器(交換空間,通常爲快速磁盤)
3、寫時複製
這種技術允許父進程與子進程開始時共享共享同一個頁面,這些頁面被標記爲爲寫時複製頁,即如果任何一個進程需要對頁進行寫操作,那麼就創建一個共享頁的副本。
4、頁面置換(重要)
頁置換採用如下方法:如果沒有空閒幀,那麼就查找當前沒有使用的幀,將其釋放。
(1)查找所需頁在磁盤上的位置
(2)查找一個空閒幀
a,如果有空閒幀,那麼就使用它,
b,如果沒有,使用頁置換算法選擇一個犧牲幀
c,將犧牲幀的內容寫到磁盤上,改變頁表和幀表
(3)將所需頁讀入空閒幀,改變頁表和幀表
(4)重新啓動程序。
常見的頁置換算法
(I)FIFO頁置換
最先進入的頁被置換。
需要注意的是FIFO頁置換會有一種特殊現象——Belady異常:對有的頁置換算法,頁錯誤率可能隨着所分配的幀數的增加而增加。FIFO可能就出現這種現象。
(II)最優頁置換opt
置換最長時間不會使用的頁,即能預知將來的情況。但是將來的情況我們無法預知,因此這種算法難以實現。
(III)LRU頁置換(最近最少使用算法least-recently-used algorithm)
FIFO使用的是頁調入內存的時間,OPT使用的是將來的時間。
LRU置換爲每個頁關聯上上一次使用的時間,當必須置換一頁時,LRU選擇最長時間沒有使用的頁。
最優置換和LRU置換都沒有Belady算法(證明略)
(IIII)近似LRU頁置換
頁表中的每一項都關聯一個引用位,每當引用一個頁時,相應的位就被置位。因此我們雖然不知道引用順序,但是我們知道哪些頁被引用,哪些未被引用。近似LRU算法又有一下三種方法:
(a)附加引用位算法
通過在規定時間間隔裏記錄引用位。
0000000,11111111,上述兩個字節分別表示在8個週期內從未被引用和一直被引用的情況。因此值最小,就是應該置換的頁。
(b)二次機會算法
這種算法只有引用位本身,沒有歷史位,因此只有一位。當要選擇一個頁時,檢查引用位,如爲0,直接置換,如爲1,則給該頁二次機會,同時清0,尋找下一個0位置,所以而二次機會算法的基本算法是FIFO算法。
(c)增強型二次機會算法
通過將引用爲和修改位作爲一對有序位來考慮。
(0,0)——最近未使用且未修改過
(0,1)——最近未使用但修改過
(1,0)——最近使用但爲修改過
(1,1)——使用且修改過
(IIIII)基於計數器的頁置換
爲每一個頁保留一個用於記錄其引用次數的計數器,因而可以形成以下兩種方案:
最不經常使用頁置換算法(LFU)——置換出引用次數最小的頁
最常使用頁置換算法(MFU)——認爲最小次數的頁可能剛剛調入,且還沒有使用。
(IIIIII)頁緩衝算法
系統保留一個空閒幀緩衝池,當出現頁錯誤時,會選擇犧牲幀,但是犧牲幀寫出之前,所需要的頁就從緩衝池中讀到空閒內存。這樣加速了重啓。
5、幀分配
研究問題:如何在各個進程之間分配一定的空閒內存?
由於性能原因,必須有足夠的幀來容納所有單個指令所引用的頁,因此有一個幀的最小數量的限制。幀的最小數量是有計算機體系結構決定的,而最大數量是由物理內存決定的。
(1)分配算法
平均分配,比例分配(比例可以根據進程大小或者優先級等來計算)
(2)全局分配和局部分配
全局分配:允許一個進程從所有幀集合中選擇一個置換幀
局部分配:每個進程只能從自己的分配幀中選擇置換。
6、系統顛簸
頻繁的頁調度操作
原因:當多道程序的程度增加到一定時,會引起顛簸
7.內核內存的分配
內核內存分配的特殊性:
(1)內核需要爲不同大小的數據結構分配內存,因此必須謹慎分配內存。
(2)有的硬件需要直接和物理內存打交道,因此需要內存常駐在連續的物理頁中。
以上兩個特殊性是的內核內存的分配通常是從空閒池中獲取,,而不是從內存鏈表中獲取。
常見的內核內存分配有兩種方法:
(i)Buddy系統分配
內存按2的冪的大小進行分配,如果請求大小大於當前2的冪內存,那麼調整到下一個2的冪。
(II)slab分配
slab是由一個或多個物理上連續的頁組成。高速緩衝cache含有一個或者多個slab,每個內核數據結構都含有一個cache,每個cache含有內核數據結構的對象實例。
優點:
(1)沒有因碎片引起的內存浪費。因爲每個數據結構都有一個cache,每個cache都有若干個slab組成,而每個slab又分爲若干個和對象大小相同的部分。
(2)內存請求可以快速滿足。