虛擬內存管理

虛擬內存管理這是一種利用虛擬存儲器來邏輯擴充物理內存的管理方式。其基本思想是用軟硬件技術把內存與外存這兩級存儲器當成一級存儲器來用,從而給用戶提供了一個比內存也比任何應用程序大得多的虛擬存儲器,使得用戶編程時再也不用考慮內存大小的限制了,給用戶編程帶來極大的方便。

傳統存儲管理方式的特徵

段頁式的內存管理策略都是爲了同時將多個進程保存在內存中以便允許多道程序設計。它們都具有以下兩個共同的特徵:

1)一次性:作業必須一次性全部裝入內存後,方能開始運行。這會導致兩種情況發生:①當作業很大,不能全部被裝入內存時,將使該作業無法運行:②當大量作業要求運行時,由於內存不足以容納所有作業,只能使少數作業先運行,導致多道程序度的下降。

2)駐留性:作業被裝入內存後,就一直駐留在內存中,其任何部分都不會被換出,直至作業運行結束。運行中的進程,會因等待I/O而被阻塞,可能處於長期等待狀態。

由以上分析可知,許多在程序運行中不用或暫時不用的程序(數據)佔據了大量的內存空間,而一些需要運行的作業又無法裝入運行,顯然浪費了寶貴的內存資源。

局部性原理

局部性原理:指程序在執行過程中的一個較短時期內,所執行的指令地址和指令的操作數地址,分別侷限於一定區域。

局部性主要表現:

時間局部性:是指一段指令在某一時間段內會被反覆執行。即程序某一部分的數據或指令被重複性地訪問,它們對應於程序結構中的循環、子程序、常用到的變量及數據等 ;

空間局部性:是指一旦某一個存儲單元被訪問,那麼它附近的單元也將很快被訪問。這對應於程序結構中的順序執行的指令、線性數據結構以及在相鄰位置存放的數據或變量等。而程序中的分支和調用子程序只是將程序的訪問空間從一處移到另外一處,仍具有局部性。

排他性:程序運行不但體現在時間、空間的局部性,還體現在某些程序段執行的排他性。

即程序設計者編程時要考慮程序執行時所能遇到的各種情況,但具體到一次程序的執行,並不會發生所有的狀況。因而某些程序段在進程整個運行期間,可能根本不使用,如出錯處理、分支語句等。因而,沒有用到的程序段就不必調入內存。另外,有些程序段僅執行一次,以後就再也不會用到,這樣的程序段也沒有必要一直佔用內存空間。

綜上所述:程序只要裝入內存一部分就可以運行,當用到不在內存的部分時,再將其裝入內存。換句話就是說程序全部裝入內存並不是程序運行的必要條件。

虛擬內存的定義和特徵

虛擬存儲器

基於局部性原理,在程序裝入時,可以將程序的一部分裝入內存,而將其餘部分留在外存,就可以啓動程序執行。在程序執行過程中,當所訪問的信息不在內存時,由操作系統將所需要的部分調入內存,然後繼續執行程序。另一方面,操作系統將內存中暫時不使用的內容換出到外存上,從而騰出空間存放將要調入內存的信息。這樣,系統好像爲用戶提供了一個比實際內存大得多的存儲器,稱爲虛擬存儲器。

之所以將其稱爲虛擬存儲器,是因爲這種存儲器實際上並不存在,只是由於系統提供了部分裝入、請求調入和置換功能後(對用戶完全透明),給用戶的感覺是好像存在-一個比實際物理內存大得多的存儲器.虛擬存儲器的大小由計算機的地址結構決定,並非是內存和外存的簡單相加。
虛擬存儲器有以下三個主要特徵:

  • 多次性,是指無需在作業運行時- 次性地全部裝入內存,而是允許被分成多次調入內存運行。
  • 對換性,是指無需在作業運行時一直常駐內存,而是允許在作業的運行過程中,進行換進和換出。
  • 虛擬性,是指從邏輯上擴充內存的容量,使用戶所看到的內存容量,遠大於實際的內存容量。

虛擬內存的實現

虛擬內存中,允許將-一個作業分多次調入內存。採用連續分配方式時,會使相當一部分內存空間都處於暫時或“永久”的空閒狀態,造成內存資源的嚴重浪費,而且也無法從邏輯上擴大內存容量。因此,虛擬內存的實現需要建立在離散分配的內存管理方式的基礎上。

虛擬內存的實現有以下三種方式:

  • 請求分頁存儲管理。
  • 請求分段存儲管理。
  • 請求段頁式存儲管理。

不管哪種方式,都需要有一-定的硬件支持。一般需要的支持有以下幾個方面:

  • 一定容量的內存和外存。
  • 頁表機制(或段表機制),作爲主要的數據結構。
  • 中斷機構,當用戶程序要訪問的部分尚未調入內存,則產生中斷。
  • 地址變換機構,邏輯地址到物理地址的變換。

請求分頁存儲管理方式

爲了實現請求分頁,系統必須提供- -定的硬件支持。除了需要- -定容量的內存及外存的計算
機系統,還需要有頁表機制、缺頁中斷機構和地址變換機構。

1.頁表機制

請求分頁系統的頁表機制不同於基本分頁系統,請求分頁系統在.一個作業運行之前不要求全部一次性調入內存,因此在作業的運行過程中,必然會出現要訪問的頁面不在內存的情況,如何發現和處理這種情況是請求分頁系統必須解決的兩個基本問題。爲此,在請求頁表項中增加了四個字段。

增加的四個字段說明如下:

  • 狀態位P:用於指示該頁是否已調入內存,供程序訪問時參考。
  • 訪問字段A:用於記錄本頁在- 段時間內被訪問的次數,或記錄本頁最近已有多長時間未被訪問,供置換算法換出頁面時參考。
  • 修改位M:標識該頁在調入內存後是否被修改過。
  • 外存地址:用於指出該頁在外存上的地址,通常是物理塊號,供調入該頁時參考。

2.缺頁中斷機構

在請求分頁系統中,每當所要訪問的頁面不在內存時,便產生-一個缺頁中斷,請求操作系統將所缺的頁調入內存。此時應將缺頁的進程阻塞(調頁完成喚醒),如果內存中有空閒塊,則分配-一個塊,將要調入的頁裝入該塊,並修改頁表中相應頁表項,若此時內存中沒有空閒塊,則要淘汰某頁(若被淘汰頁在內存期間被修改過,則要將其寫回外存)。

3.地址變換機構

請求分頁系統中的地址變換機構,是在分頁系統地址變換機構的基礎上,爲實現虛擬內存,又增加了某些功能而形成的。

                                                

頁面置換算法

最佳置換算法(OPT)

方法:根據未來使用情況將未來的近期裏不用的頁替換出去。
實現:

  • 確定要替換的時刻T。
  • 找出主存中每個頁將來要用到的時刻Ti。
  • Ti 減 T最大的頁將被替換。

特點:命中率高,但難於實現(必須運行一遍,才能知道未來的時刻ti),是理想算法,用於評價其它替換算法。

                       

發生了6次頁面置換,9次缺頁中斷,總訪問次數20次,缺頁率9/20=45% 。

先進先出(FIFO)頁面置換算法

優先淘汰最早進入內存的頁面,亦即在內存中駐留時間最久的頁面。該算法實現簡單,只需把調入內存的頁面根據先後次序鏈接成隊列,設置- 一個指針總指向最早的頁面。但該算法與進程實際運行時的規律不適應,因爲在進程中,有的頁面經常被訪問。

                        

發生了12次頁面置換,15次缺頁中斷,總訪問次數20次,缺頁率15/20=75% 。

最近最久未使用(LRU)換算法

方法:近期最久未訪問過的頁作爲被替換的頁
實現:賦予每個頁面一個訪問字段,用來記錄一個頁面自上次被訪問以來所經歷的時間t,當須淘汰一個頁面時,選擇現有頁面中其t值最大的頁面予以淘汰。
特點:計數器硬件較少,主存頁面表可由軟硬件實現修改,根據“歷史”預測“未來”。

                           

發生了9次頁面置換,12次缺頁中斷,總訪問次數20次,缺頁率12/20=60% 。

LRU置換算法的硬件支持:

  • 每個頁面設立移位寄存器:被訪問時左邊最高位置1,定期右移並且最高位補0,於是寄存器數值最小的是最久未使用頁面。
  • 一個特殊的棧:把被訪問的頁面移到棧頂,於是棧底的是最久未使用頁面。

Clock置換算法

每頁設置一位訪問位,若該頁被訪問則其訪問位被置1;
內存中所有頁面都通過鏈接指針鏈接成一個循環隊列,置換時採用一個指針,從當前指針位置開始按地址先後檢查各頁,尋找訪問位爲0的頁面作爲被置換頁;
指針經過的訪問位爲1的頁都將其訪問位置0,最後指針停留在被置換頁的下一個頁。

簡單的Clock置換算法

                                                       

頁面分配策略

駐留集大小

對於分頁式的虛擬內存,在準備執行時,不需要也不可能把-.個進程的所有頁都讀取到主存,因此,操作系統必須決定讀取多少頁。也就是說,給特定的進程分配多大的主存空間,這需要考慮以下幾點:

  1. 分配給一個進程的存儲量越小,在任可時候駐留在主存中的進程數就越多,從而可以提高處理機的時間利用效率。
  2. 如果一個進程在主存中的頁數過少,儘管有局部性原理,頁錯誤率仍然會相對較高。
  3. 如果頁數過多,由於局部性原理,給特定的進程分配更多的主存空間對該進程的錯誤率沒有明顯的影響。

固定分配、局部置換

  •  爲每個進程分配固定頁數的內存空間、且運行過程中不變。
  •  當進程缺頁時,只能從該進程在內存的幾個頁面中選出一頁換出,然後再調入一頁,保證進程的頁數不變。

可變分配、全局置換

  • 系統開始先爲每個進程分配一定數目的物理塊。整個系統有一空閒物理塊鏈,當某進程缺頁時,系統從空閒鏈中選出一塊分配給進程。
  • 空閒鏈爲空時,OS從所有進程的頁面中權衡選擇一頁換出。

可變分配、局部置換

  • 分配同上,但進程缺頁時,只能從該進程在內存的頁面中選出一頁換出。

調入頁面的時機

爲確定系統將進程運行時所缺的頁面調入內存的時機,可採取以下兩種調頁策略:

(1)預調頁策略。根據局部性原理,- -次調入若千個相鄰的頁可能會比一次調入- -頁更高效。但如果調入的一批頁面中大多數都未被訪問,則又是低效的。所以就需要採用以預測爲基礎的預調頁策略,將預計在不久之後便會被訪問的頁面預先調入內存。但目前預調頁的成功率僅約50%。故這種策略主要用於進程的首次調入時,由程序員指出應該先調入哪些頁。

(2)請求調頁策略。進程在運行中需要訪問的頁面不在內存而提出請求,由系統將所需頁面調入內存。由這種策略調入的頁- -定會被訪問, 且這種策略比較易於實現,故在目前的虛擬存儲器中大多采用此策略。它的缺點在於每次只調入一頁,調入調出頁面數多時會花費過多的I/O開銷。

預調入實際上就是運行前的調入,請求調頁實際上就是運行期間調入。一般情況下,兩種調頁策略會同時使用。

從何處調入頁面

請求分頁系統中的外存分爲兩部分:用於存放文件的文件區和用於存放對換頁面的對換區。對換區通常是採用連續分配方式,而文件區採用離散分配方式,故對換區的磁盤IO速度比文件區的更快。這樣從何處調入頁面有三種情況:

(1)系統擁有足夠的對換區空間:可以全部從對換區調入所需頁面,以提高調頁速度。爲此,在進程運行前,需將與該進程有關的文件從文件區複製到對換區。

(2)系統缺少足夠的對換區空間:凡不會被修改的文件都直接從文件區調入;而當換出這些頁面時,由於它們未被修改而不必再將它們換出。但對於那些可能被修改的部分,在將它們換出時須調到對換區,以後需要時再從對換區調入(這是因爲讀的速度比寫的速度快)。

(3)UNIX方式:與進程有關的文件都放在文件區,故未運行過的頁面,都應從文件區調入。曾經運行過但又被換出的頁面,由於是被放在對換區,因此F次調入時應從對換區調入。進程請求的共享頁面若被其他進程調入內存,則無需再從對換區調入。

抖動

在頁面置換過程中的一種最糟糕的情形是,剛剛換出的頁面馬上又要換入主存,剛剛換入的頁面馬上就要換出主存,這種頻繁的頁面調度行爲稱爲抖動,或顛簸。如果一個進程在換頁 上用的時間多於執行時間,那麼這個進程就在顛簸。

頻繁的發生缺頁中斷(抖動), 其主要原因是某個進程頻繁訪問的頁面數目高於可用的物理頁幀數目。虛擬內存技術可以在內存中保留更多的進程以提高系統效率。在穩定狀態,幾乎主存的所有空間都被進程塊佔據,處理機和操作系統可以直接訪問到儘可能多的進程。但如果管理不當,處理機的大部分時間都將用於交換塊,即請求調入頁面的操作,而不是執行進程的指令,這就會大大降低系統效率。

                                                

工作集

工作集(或駐留集)是指在某段時間間隔內,進程要訪問的頁面集合。經常被使用的頁面需要在工作集中,而長期不被使用的頁面要從工作集中被丟棄。爲了防止系統出現抖動現象,需要選擇合適的工作集大小。

工作集模型的原理是:讓操作系統跟蹤每個進程的工作集,併爲進程分配大於其工作集的物理塊。如果還有空閒物理塊,則可以再調一個進程到內存以增加多道程序數。如果所有工作集之和增加以至於超過了可用物理塊的總數,那麼操作系統會暫停一個進程, 將其頁面調出並且將其物理塊分配給其他進程,防止出現抖動現象。

正確選擇工作集的大小,對存儲器的利用率和系統吞吐量的提高,都將產生重要影響。

 

虛擬內存管理的優點:

  1. 主存利用率比較高:平均每個用戶作業只浪費一半的頁空間,內存規範易於管理。
  2. 對磁盤管理比較容易:因爲頁的大小一般取磁盤物理塊大小的整數倍。
  3. 地址映射和變換的速度比較快:在把用戶程序裝入到主存儲器的過程中,只要建立用戶程序的虛頁號與主存儲器的實頁號之間的對應關係即可(拼接得到物理地址),不必使用整個主存的地址長度,也不必考慮每頁的長度等
  4. 大程序:可在較小的可用內存中執行較大的用戶程序;
  5. 大的用戶空間:提供給用戶可用的虛擬內存空間通常大於物理內存(real memory)
  6. 併發:可在內存中容納更多程序併發執行;
  7. 易於開發:與覆蓋技術比較,不必影響編程時的程序結構

虛擬內存管理的缺點:

(1)程序的模塊化性能不好。
由於用戶程序是強制按照固定大小的頁來劃分的,而程序段的實際長度一般是不固定的。因此,虛擬頁式存儲器中一頁通常不能表示一個完整的程序功能。一頁可能只是一個程序段中的一部分,也可能在一頁中包含了兩個或兩個以上程序段。
(2)頁表很長,需要佔用很大的存儲空間。
通常,虛擬存儲器中的每一頁在頁表中都要佔一個頁表項。假設有一個虛擬頁式存儲器,它的虛擬存儲空間大小爲4GB,每一頁的大小爲1KB,則頁表的容量爲4M(個頁表項)。如果每個頁表項佔用4個字節,則頁表的存儲容量爲16MB。

總結:總容量不超過物理內存和外存交換區容量之和。其運行速度接近於內存,每位的成本又接近於外存,是一種性能非常優越的存儲管理技術。

 

 

 

 

 

 

 

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