操作系統—詳解虛擬內存

本文是對操作系統概念(第七版)——虛擬內存的學習總結,不足之處,歡迎批評指正。

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)內存請求可以快速滿足。
 

操作系統中的內存管理技術是十分複雜的。現在的操作系統基本都使用邏輯地址和物理地址這兩個概念。簡單來說,邏輯地址就可以理解爲虛擬地址,這個地址是讓用戶,也就是我們使用者看的,這個地址是虛擬的,並不真實存在,但是經過硬件和軟件的配合,將邏輯地址映射到硬件中實實在在的物理地址上,實現了邏輯地址和物理地址的分離。

    當系統執行一個程序或者說開啓一個進程並執行它的時候,一般都需要將進程的所有信息都加載到內存中,然後才能讓CPU執行,因爲內存是直接與CPU交互的,在通常的計算機中,內存就像我們所說的1G、2G、4G、8G等,目前大家使用的多數都是4G左右的內存,這樣的內存看起來並不是很小,但是與我們的計算機上的硬盤相比較就十分渺小了,現在我們使用的硬盤一般都在512G以上,很多都使用1T的硬盤,所以這樣看來,我們的計算機的內存是十分重要的,也需要謹慎使用。通常大家在使用電腦的時候,都會開啓很多程序, 比如說:掛着QQ、聽着歌、看着網頁等等,這些程序的執行都可以看做一個個進程,這些進程的執行在原始情況下都需要將所有的進程數據和代碼等信息都放到內存中才能執行,而這麼多程序同時放到內存中,有時候會使得內存滿載,導致內存不夠用,更甚至於,大家平常玩的大型遊戲,例如使命召喚等,可能一個程序所需要的內存容量就大於計算機本身的內存容量,那麼這個程序就肯定不能執行了。

    鑑於上述的很多原因,現在的計算機系統基本上都使用了虛擬內存技術,但是需要注意的是,虛擬內存技術確實帶來了很多好處,但是這一技術實現起來需要硬件和軟件的協調,所以難度比較大。那麼什麼是虛擬內存呢?剛剛提到過,很多內存管理策略都需要同時將多個進程放在內存中,以便執行這些進程,這些策略都需要在進程執行之前將整個進程放在內存中。而虛擬內存技術允許執行進程不必完全放在內存中,這樣我們就可以運行比物理內存大的程序,使得程序員不受內存存儲的限制。

    寫過完善的程序的程序員都會有一個感觸,就是一個項目的程序雖然非常多,但是其實有一部分程序並不經常執行,或者基本上沒有執行過,比如說異常處理、錯誤處理等,那麼這些程序使得我們可以只需要加載需要執行的部分,從而減少了內存使用。

    從而,我們可以構造一個大的虛擬內存空間,然後將其映射到較小的物理內存。這個大的虛擬內存空間存儲我們進程的所有信息,而當執行進程時,我們只加載需要執行的部分,需要什麼再加載什麼。這裏就需要採用一定的技術,比如按需調頁、頁面置換、幀分配等,使得進程的執行可以在虛擬內存和物理內存之間進行協調,完成整個程序的執行。

    總的來說,虛擬內存技術主要有以下優點:虛擬內存可以大於物理內存,一般爲物理內存的1.5倍到3倍,從而可以運行比物理內存大的程序,進而使得更多的程序可以同時執行,提高了多道程序的程度,增加了CPU的使用率,並且使得進程之間的獨立性得到了更好的體現。

    下面簡單說下內存的基本管理,通常將邏輯內存進行分頁,類似於切蛋糕,將一塊大的蛋糕切成很多小塊,分頁是同樣的道理,將邏輯內存分成很多小的頁面,然後通過頁表,映射到物理內存,而物理內存則劃分爲很多成爲幀的塊,從而和頁對應起來,頁面和幀的對應關係主要是通過頁表來保存的,頁表中有很多條目,較爲詳細地保存了這些信息。一般進程都有自己的內存空間,這裏可以說有自己的虛擬內存空間,上面所說的虛擬內存技術就是指進程的虛擬內存空間存儲了所有的進程信息,然後虛擬內存空間分成很多頁,這些頁並不是在進程執行時全部換入到物理內存,而是按照需要進行換入,需要哪一頁就換入哪一頁,這需要一定的算法管理,這裏就不再詳述。至於十分具體的虛擬內存管理方式和算法大家可以閱讀《操作系統概念》一書,上面講解的十分清楚。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章