【操作系統】第五章:虛擬內存(Part2:虛擬內存管理技術)

虛擬內存管理技術-簡稱虛存技術
在這裏插入圖片描述
解決覆蓋技術和交換技術弊端的技術
在這裏插入圖片描述
區別:過程由OS完成,減輕程序猿負擔。
在這裏插入圖片描述
根據當前執行情況可以動態的導出導入,但是粒度更小,不只是程序間,還可以以頁或者段爲粒度來進行導入導出。
在這裏插入圖片描述
如圖所示,OS和MMU支持下,以P3爲例,P3只在內存中放了2個內存頁,其他的全放入了硬盤中。因爲此時只用到了這一小部分數據,這樣就使得一個本來比較大的程序在有效時間段內僅使用一小部分內存資源。虛存技術,除了需要硬件支持外,還需要程序具有局部性。

程序的局部性原理

在這裏插入圖片描述
局部性原理分爲了時間局部性和空間局部性。
時間局部性:一條指令和下次執行,一個數據的訪問和下一次訪問都集中在一個較短時期內。
空間局部性:當前指令和鄰近幾條指令、當前訪問和鄰近的幾個數據都集中在一個較小區域內。
分支局部性:一條跳轉指令的兩次執行,很可能跳到相同的內存位置
訪問速度快、空間大、使用方便(不需要程序猿過多構思數據結構)
例子:
在這裏插入圖片描述
這個整數數組的空間大小是1024x1024,int型每一個是4byte,也就說這一個數組整體會佔4M的內存空間。但是物理內存只有4K。此時,
程序1:A【0】【0】~ A【1023】【0】==>A【1023】【1023】

程序2:A【0】【0】~ A【0】【1023】==>A【1023】【1023】

區別:實際上A【1】【0】和A【0】【0】從空間上來看,中間差了1024個數據也就說是4K的數據大小,但是A【1】【0】和A【1】【1】之間的距離只有一個數據也就說4byte。
那麼對於程序2而言,在數據A【0】【x】佔據了一個頁。當他第一次訪問時,數組的數據還在硬盤上時,會產生缺頁異常,此時OS會把僅有的4K空間使用上,並把A【0】【x】數組放入內存空間 ,然後就可以對A【0】【x】數組進行正常訪問了。根據循環,第二次訪問A【0】【1】時,因爲已經有了對應的頁,就不會發生頁異常。內循環執行完後,進入下一個內循環,此時訪問A【1】【0】發生一次中斷,然後接下來的1023次訪問不會再發生中斷。具備很好的空間局部性和時間局部性。也就意味着一共發生了1024次缺頁中斷
對於程序1而言,在數據A【0】【x】佔據了一個頁。當他第一次訪問時,數組的數據還在硬盤上時,會產生缺頁異常,此時OS會把僅有的4K空間使用上,並把A【0】【x】數組放入內存空間 ,然後就可以對A【0】【x】數組進行正常訪問了。根據循環,第二次訪問時,會訪問A【1】【0】,此時會再次產生缺頁異常,因爲對應A【1】【x】的頁仍然不在內存,在硬盤中,需要再次把4K的物理內存用到A【1】【x】數組上,此後導入A【1】【x】的頁。同理,在一個內循環中,每一次都會跳4K空間去訪問一個數據,每一次訪問都會發生缺頁異常。也就意味着一共發生了1024x1024次缺頁中斷
可以看出程序的不同寫法對開銷的影響是相當大的。
缺頁/段異常
上面講到的,因爲內存中只有部分數據,所以可能會發生程序進行到一定階段後,接下來的數據訪問不到的情況。因爲另一部分數據不在內存中而在硬盤中,此時會發生一個缺頁或者缺段異常。 此時OS會進行處理,如果內存還有空間,就會把數據或者指令從硬盤導入內存,這樣程序就可以繼續執行。如果內存空間不足,則OS需要考慮當前階段不會立刻用到的數據導出到硬盤,然後把需要的數據換入內存。這個選擇哪個程序導出也很重要。選擇的好,訪問讀寫的次數就會少,整體系統性能也會提高。

虛存技術的基本特徵

1.空間大: 通過內存和外存結合,提供給用戶的虛擬內存空間通常大於實際物理空間。 32位機器理論上可以訪問4GB而且物理內存只有256M,但是硬盤容量很大。通過硬盤的補充,可以實現內存中跑多個程序,而且每個程序會認爲自己佔用了4GB的空間。kernel是常駐內存不能被換出。
2.部分交換:與交換技術相比,虛擬存儲的調入和調出是對部分虛擬空間進行的
3.不連續性:物理內存分配不連續,虛擬空間使用也不連續。(因爲換入換出會導致原本連續的地址空間很可能再換回後不再在換出位置)

虛存技術的實現

虛擬頁式內存管理

在這裏插入圖片描述
如圖所示, 邏輯地址空間和物理地址空間是靠頁表來維持映射關係的。頁表項的索引是頁號,頁表項的內容是頁幀號。頁表項除了頁幀號之外,其實還有幾個單位的bit作爲標誌位,比如存在位。那麼這裏的內存訪問查找頁表發現對應頁表項的存在位是0,則說明這個虛擬地址空間沒有對應的物理空間,產生訪問異常。
大部分虛擬存儲系統都採用虛擬頁式內存管理。爲了實現,除了頁式內存管理的基本功能之外,在增加兩個新的功能(請求調頁和頁面置換)【需要訪問這個頁時,才把這個頁調入到內存中】

請求調頁:當一個用戶進程需要調入內存運行時,不會把所有程序都放入內存中,只是裝入一部分程序。放到個別的頁裏,運行的時候就有可能出現訪問的數據和代碼不在內存中,此時就會由CPU發出缺頁異常的信號,然後OS根據產生異常的地址來找到對應到外存中需要被調入的數據,然後將其放入相應的物理頁去,使該頁可以繼續執行。

頁面置換:訪問過程中,隨着程序的執行他佔用內存越來越多,此時需要把不常用頁換出,把當前需要的頁換入,這就是頁面置換。該功能實現的好壞就決定了整體效率,所以後面會專門設計一個有效的頁面置換算法,後續會詳細講解。
在這裏插入圖片描述
爲了實現這兩個功能,我們需要在頁表項裏增加一些特殊的,來輔助完成這些功能。有4個位比較重要。
1.存在位/駐留位:這個位表示該頁是否存在內存中。0表示不在內存中,1表示在內存中。爲1也就說邏輯頁號一定對應一個物理頁幀號。如果爲0則說明內存中沒有對應物理頁支持,很有可能對應數據在外存中,此時訪問會出現訪問異常
2.保護位:表示允許該頁做何種類型的訪問,比如只讀、只寫,可讀寫、只執行等。 如果只讀標識下執行寫操作就會出現異常。
3.修改位:表明這個頁是否被修改(寫操作)過。如果這個頁被寫過,爲1,;沒被寫過,就爲0。如果內存中數據被寫過,也就說當前數據與硬盤中數據不一致了,這時候最新的數據放入內存時,進行換出操作,需要把這個數據保存到硬盤中,使得硬盤中數據與內存中數據一致。如果修改位爲0,則內外數據一致,此時如果進行換入換出操作,只需要釋放就可以。所以修改位的使用可以有效提高修改位的效率。
4.訪問位:這個也是否被訪問過,訪問過爲1,沒有訪問爲0。置換算法中,我們會把頁換出去,那麼換哪些?應該換當前沒有訪問的頁,這位可以表明這個頁是否經常使用,近期是否會使用等信息,我們可以根據這個特點決定換出對象。
在這裏插入圖片描述
駐留位爲0,沒有對應的虛擬地址映射到物理地址上。
這裏執行了兩個指令。
1.MOV REG,08192MOV\space REG ,0 8192
訪問,把虛擬0地址的內容賦給一個寄存器。0地址對應頁表裏的映射關係,是物理地址中的頁幀號2位置,所以他的實際物理地址應該是2*4K=8K(8192Byte)
2.MOV REG,32780MOV\space REG ,32780 ==>MOV REG,MOV\space REG,缺頁中斷
把虛擬地址32780讀到寄存器中,32780其實對應到邏輯地址中的頁號爲8的項中,因爲駐留位爲0,沒有對應到物理地址的映射,則會觸發缺頁異常。

缺頁中斷處理

在這裏插入圖片描述
①:CPU執行指令,如果一個內存地址沒有對應的映射關係,發生缺頁異常。
④:需要訪問的地址對應的硬盤中的數據以頁的單位從硬盤讀入內存中,然後修改頁表,駐留位改爲存在並把頁幀號改成該頁幀號。
如果沒有空閒空間時,需要使用頁面替換算法。

後備存儲(二級存儲)

在這裏插入圖片描述
硬盤存儲數據的特徵:
1.數據:數據文件放在硬盤上,當需要時,如果內存中沒有,則從數據文件中讀出。這是一種後備存儲。
2.代碼:操作系統會在令程序執行很多指令,指令其實也是一種數據,放在執行程序裏/硬盤裏。同理,讀入內存並讓CPU執行,當指令不存在,會進一步從程序中讀入這條指令。
3.動態鏈接庫:庫的代碼數據也是放在硬盤的。同理也是需要時讀入
4.交換文件(swap file):程序運行過程中有可能產生許多數據,但是這些數據沒有對應到具體的文件,就是動態產生的數據,這些數據也有可能佔用了不小的空間且需要換出到硬盤中,則此時OS會在硬盤中開闢一個專門的區域——swap file。這個文件內的數據沒有與文件直接對應的內存內容
這四類形成了後備存儲(二級存儲),有了二級存儲的支持,保證了空間的有效性。

虛擬內存性能

在這裏插入圖片描述
分析執行開銷:
EAT=+EAT=內存訪問時間*頁表命中率+缺頁處理時間*缺頁概率
分析這個例子中的參數,10代表一次內存的訪問時間,頁表命中率也就說沒有缺頁的概率,就是1-p;如果產生缺頁,自然就需要訪問磁盤,那麼處理時間就是5ms(5106ns5*10^6ns)。產生缺頁後至少要做一個讀操作,爲5msp5ms*p
q是頁修改概率。代表對某一個內存頁的寫操作後,且該數據需要換出時,前面講過這個換出操作導致當前數據與硬盤中數據不一致,需要個更新硬盤數據,也就說要對硬盤進行一個寫操作。寫硬盤操作的開銷也是5ms,缺頁且需要頁修改的情況下的開銷爲5mspq5ms*p*q
髒頁簡單來說就是根據一個高速緩存表來不斷更新數據的常用標識,因爲硬盤的讀寫速度遠趕不上內存的速度,系統就把讀寫比較頻繁的數據事先放到內存中,以提高讀寫速度,這就叫高速緩存。頁作爲高速緩存的單位,當某一個頁被訪問後,對其標識並且對上一個訪問的頁標識,舊的級別分爲不同級別,當舊的級別達到一定程度時,修改高速緩存裏,該頁就被內核標記爲髒頁,內核將會在合適的時間把髒頁的數據寫到硬盤中去,以保持高速緩存中的數據和磁盤中的數據是一致的。

p足夠小,那麼平均訪問時間就會接近10ns,p如果比較大,則會導致整個循環的效率比較差。但是因爲程序的局部性特點,意味着缺頁次數不會過多,此時效率可以得到保障。

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