存儲管理——虛擬內存

存儲管理中虛擬內存是當內存容量不足時需要考慮的一個問題。那麼:

  • 1)虛擬內存是否可實現?
  • 2)虛擬內存如何擴展內存容量?

接下來看看,怎麼內存是通過外存來擴展的。

1) 虛擬內存是否可以實現?

爲什麼提出這個問題,實際上問的是這個問題:程序真的可以劃分成很多塊,取部分程序塊裝入較小的內存中,然後還能正確運行麼?
面對後者提問,可以將程序的邏輯地址正確轉化物理地址,實現程序的分塊;同時爲了高效的完成邏輯地址映射到物理地址的操作,使用頁式管理,段式管理或兩者結合的方式。
但是由於是從外存中裝入到內存中,由於訪問外存的速度相對於更慢,是否能高效的完成這個動作?經過大量的試驗發現程序的運行符合局部性原理,集中訪問程序中的某幾塊,如果將經常使用的程序塊減少移動次數,便可解決這問題。
暫且只考慮到此,其中較爲重要的缺頁中斷處理,以後再說。

2) 虛擬內存如何擴展內存容量?

擴展方式有以下幾種:
1. 頁式管理
2. 二級頁式管理
3. 倒排頁表
4. 段式管理
5. 段頁式管理
以下將結合圖示(參考操作系統精髓與設計原理中文第6版)具體地描述各種擴展方式。

2.1 頁式管理

頁式管理
其中由於程序劃分的虛擬內存塊大小與實際內存一致,這就保證了程序中的偏移地址,與內存中的偏移地址一致;
由於在程序裝入內存時建立了頁表,這就保證了程序可以將虛擬地址映射到頁表,訪問實際地址。
看看如何將程序的虛擬地址轉化爲實際地址,實現程序的有效運行。
a. 虛擬地址=頁號:偏移量,將其中的頁號,與頁表指針相加,映射到頁表中的相關位置;
b. 通過查找該頁號對應的頁表中的各項信息,經過處理(可能從輔存中調入相應的頁到內存中)得到頁框號(塊號)
c. 將所得到的頁框號(塊號)與虛擬地址中的偏移量組合形成,實際的內存地址。

2.2 二級頁式管理

二級頁式管理
由於內存的限制,頁表的增長受限,然而內存增長較快。爲了採用頁式管理,不得不將較大的頁表分成兩個頁表:根頁表和子頁表,根頁表存入內存,子頁表存入輔存。這樣既減輕了內存的鴨梨,又能使用較爲成熟的管理。具體轉化地址過程:
a. 虛地址=根頁號:子頁內偏移(上圖標識不清):偏移量,將其中的根頁號與根頁表指針相加,得到子頁號;
b. 將得到的子頁號與虛地址中的子頁內偏移相加,經過一系列處理得到實際的塊號;
c. 將得到的塊號與虛地址中的偏移量組合形成實際地址

2.3 倒排頁表

倒排頁表
外存的不斷髮展,是原有的頁表無法適應新的要求。
在倒排頁表中,將虛地址中的頁號通過散列函數,映射到內存中的某一表中,該表將具有相同散列值的頁號形成鏈,如圖所示,第i塊之後與第j塊相連。
具體的轉化過程:
a. 虛地址=頁號:偏移量,將其中的頁號通過散列函數,映射至某一內存塊上。
b. 遍歷具有相同散列值的頁號鏈,尋找當前頁號所對應的塊。
c. 將得到的頁號對應的內存中的位置,與虛地址中的偏移量組合形成實際的地址。

2.4 段式管理

段式管理
段式管理是程序員自己將程序中具有特定功能的代碼歸爲一個模塊,程序運行時,動態的將當前的模塊裝入內存中,並將各個模塊段記錄在段表中。
具體流程:
a. 虛地址=段號:偏移量,將虛地址中的段號通過段表指針,定位到段表中的具體位置;
b. 經過一系列處理讀出將段表中的某行,得到基址等信息;
c. 將得到的基址與虛地址中的偏移量組合形成實際的內存地址。
由於存在段長等信息可判斷當前虛地址是否違法訪問;由於每個模塊爲一個段,其他程序則可以共享其中的某些模塊,這是頁式管理所不能實現的。

2.5段頁式管理

段頁式管理
段頁式管理是結合頁式管理和段式管理兩者的優點。內存利用率較高,模塊化程度高,能提供較好的保護和共享機制等等。
它是將在段式管理的基礎上,將每一段再採用頁式管理的一套使用內存方法。
具體轉化過程:
a. 虛擬內存=段號:頁號:偏移量,將其中的段號取出,通過段表指針,與段表中的相關信息建立聯繫,得到段中的頁表;
b. 將虛地址中的頁號映射到所得頁表中,得到相應的塊號;
c. 所得到的塊號與虛地址中的偏移量組合形成實際的地址。

以上只是簡單的描述了各種管理方式。
對於具體實現依舊有很多細節沒有介紹,比如說:如果虛地址並不能在頁表或段表中找到,怎麼辦?如何使用高速緩衝裝置,進行頁表項的查找等等問題。
最後一篇只是簡單的涉及如何對缺頁中斷的處理,至於深入瞭解或學習其他內容請查看相關書籍(比如:《操作系統精髓與設計原理》)或相關網絡資源。

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