《計算機操作系統》總結七(虛擬內存)

 

轉載自:

http://blog.csdn.net/bigpudding24/article/details/48655271

https://blog.csdn.net/yongchaocsdn/article/details/78533097

3.5 虛擬內存的概念、特徵以及虛擬內存的實現

背景:

1 機器物理內存侷限性,一味地擴充真實內存成本高昂

2 內存需要虛擬擴充,使用起來比實際內存大,爲了處理消耗內存很大的程序 或 防止多個進程並行執行時 內存被某些進程佔滿,使用虛擬內存技術進行內存擴充

3 傳統存儲特徵:一次性,駐留性

傳統存儲管理方式的特徵

上一節所討論的各種內存管理策略都是爲了同時將多個進程保存在內存中以便允許多道程序設計。它們都具有以下兩個共同的特徵:

1) 一次性

作業必須一次性全部裝入內存後,方能開始運行。這會導致兩種情況發生:

  • 當作業很大,不能全部被裝入內存時,將使該作業無法運行;
  • 當大量作業要求運行時,由於內存不足以容納所有作業,只能使少數作業先運行,導致多道程序度的下降。

2) 駐留性

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

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

目標:

內存實際使用起來起到真實物理內存擴大的效果

行爲:

1  程序裝入時,可以將程序的一部分裝入內存,而將其餘部分留在外存,就可以啓動程序執行。

2 在程序執行過程中,當所訪問的信息不在內存時,由操作系統將所需要的部分調入內存,然後繼續執行程序。

3 操作系統將內存中暫時不使用的內容換出到外存上,從而騰出空間存放將要調入內存的信息。

行爲依據:局部性原理

局部性原理

高速緩存技術  依賴的就是局部性原理 (包括 redis  mysql  MQ等分佈式存儲中間件 都涉及內存外存轉換 或內存過期淘汰策略)
局部性原理表現在以下兩個方面:

  • 時間局部性:如果程序中的某條指令一旦執行,不久以後該指令可能再次執行;如果某數據被訪問過,不久以後該數據可能再次被訪問。產生時間局部性的典型原因,是由於在程序中存在着大量的循環操作
  • 空間局部性:一旦程序訪問了某個存儲單元,在不久之後,其附近的存儲單元也將被訪問,即程序在一段時間內所訪問的地址,可能集中在一定的範圍之內,這是因爲指令通常是順序存放、順序執行的,數據也一般是以向量、數組、表等形式簇聚存儲的。


時間局部性是通過將近來使用的指令和數據保存到高速緩存存儲器中,並使用高速緩存的層次結構實現。

空間局部性通常是使用較大的高速緩存,並將預取機制集成到高速緩存控制邏輯中實現。

虛擬內存技術實際上就是建立了 “內存一外存”的兩級存儲器的結構,利用局部性原理實現髙速緩存。   

虛擬存儲器的大小由計算機的地址結構決定,並非是內存和外存的簡單相加。32位計算機最多2^32B 也就是4GB內存。

三個主要特徵:

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

虛擬內存技術的實現

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

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


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

  • 一定容量的內存和外存。

  • 頁表機制(或段表機制),作爲主要的數據結構。

  • 中斷機構,當用戶程序要訪問的部分尚未調入內存,則產生中斷。

  • 地址變換機構,邏輯地址到物理地址的變換。

 

3.6 請求分頁管理方式實現虛擬內存

請求分頁系統建立在基本分頁系統基礎之上,爲了支持虛擬存儲器功能而增加了請求調頁功能和頁面置換功能。請求分頁是目前最常用的一種實現虛擬存儲器的方法。

在請求分頁系統中,只要求將當前需要的一部分頁面裝入內存,便可以啓動作業運行。在作業執行過程中,當所要訪問的頁面不在內存時,再通過調頁功能將其調入,同時還可以通過置換功能將暫時不用的頁面換出到外存上,以便騰出內存空間。

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

頁表機制

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


圖3-24  請求分頁系統中的頁表項


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

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

缺頁中斷機構

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

缺頁中斷作爲中斷同樣要經歷,諸如保護CPU環境、分析中斷原因、轉入缺頁中斷處理程序、恢復CPU環境等幾個步驟。但與一般的中斷相比,它有以下兩個明顯的區別:

  • 在指令執行期間產生和處理中斷信號,而非一條指令執行完後,屬於內部中斷。
  • 一條指令在執行期間,可能產生多次缺頁中斷。

地址變換機構

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


圖3-25請求分頁中的地址變換過程


如圖3-25所示,在進行地址變換時,先檢索快表:

  • 若找到要訪問的頁,便修改頁表項中的訪問位(寫指令則還須重置修改位),然後利用頁表項中給出的物理塊號和頁內地址形成物理地址。
  • 若未找到該頁的頁表項,應到內存中去查找頁表,再對比頁表項中的狀態位P,看該頁是否已調入內存,未調入則產生缺頁中斷,請求從外存把該頁調入內存。

 

3.7 頁面置換算法

進程運行時,若其訪問的頁面不在內存而需將其調入,但內存已無空閒空間時,就需要從內存中調出一頁程序或數據,送入磁盤的對換區。

選擇調出頁面的算法就稱爲頁面置換算法。好的頁面置換算法應有較低的頁面更換頻率,也就是說,應將以後不會再訪問或者以後較長時間內不會再訪問的頁面先調出。

常見的置換算法有以下四種。

1. 最佳置換算法(OPT)

最佳(Optimal, OPT)置換算法所選擇的被淘汰頁面將是以後永不使用的,或者是在最長時間內不再被訪問的頁面,這樣可以保證獲得最低的缺頁率。但由於人們目前無法預知進程在內存下的若千頁面中哪個是未來最長時間內不再被訪問的,因而該算法無法實現。

最佳置換算法可以用來評價其他算法。假定系統爲某進程分配了三個物理塊,並考慮有以下頁面號引用串:
    7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1

進程運行時,先將7, 0, 1三個頁面依次裝入內存。進程要訪問頁面2時,產生缺頁中斷,根據最佳置換算法,選擇第18次訪問才需調入的頁面7予以淘汰。然後,訪問頁面0時,因爲已在內存中所以不必產生缺頁中斷。訪問頁面3時又會根據最佳置換算法將頁面1淘汰……依此類推,如圖3-26所示。從圖中可以看出釆用最佳置換算法時的情況。

可以看到,發生缺頁中斷的次數爲9,頁面置換的次數爲6。

訪問頁面 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
物理塊1 7 7 7 2   2   2     2     2       7    
物理塊2   0 0 0   0   4     0     0       0    
物理塊3     1 1   3   3     3     1       1    
缺頁否                        

圖3-26  利用最佳置換算法時的置換圖

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

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

訪問頁面 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
物理塊1 7 7 7 2   2 2 4 4 4 0     0 0     7 7 7
物理塊2   0 0 0   3 3 3 2 2 2     1 1     1 0 0
物理塊3     1 1   1 0 0 0 3 3     3 2     2 2 1
缺頁否          

圖3-27  利用FIFO置換算法時的置換圖


這裏仍用上面的實例,釆用FIFO算法進行頁面置換。進程訪問頁面2時,把最早進入內存的頁面7換出。然後訪問頁面3時,再把2, 0, 1中最先進入內存的頁換出。由圖 3-27可以看出,利用FIFO算法時進行了 12次頁面置換,比最佳置換算法正好多一倍。

FIFO算法還會產生當所分配的物理塊數增大而頁故障數不減反增的異常現象,這是由 Belady於1969年發現,故稱爲Belady異常,如圖3-28所示。只有FIFO算法可能出現Belady 異常,而LRU和OPT算法永遠不會出現Belady異常。

訪問頁面 1 2 3 4 1 2 5 1 2 3 4 5
物理塊1 1 1 1 4 4 4 5     ,5’ 5  
物理塊2   2 2 2 1 1 1     3 3  
物理塊3     3 3 3 2 2     2 4  
缺頁否      
    1 1 1     5 5 5 5 4 4
物理塊2*   2 2 2     2 1 1 1 1 5
物理塊3*     3 3     3 3 2 2 2 2
物理塊4*       4     4 4 4 3 3 3
缺頁否      

圖 3-28   Belady 異常

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

選擇最近最長時間未訪問過的頁面予以淘汰,它認爲過去一段時間內未訪問過的頁面,在最近的將來可能也不會被訪問。該算法爲每個頁面設置一個訪問字段,來記錄頁面自上次被訪問以來所經歷的時間,淘汰頁面時選擇現有頁面中值最大的予以淘汰。

再對上面的實例釆用LRU算法進行頁面置換,如圖3-29所示。進程第一次對頁面2訪問時,將最近最久未被訪問的頁面7置換出去。然後訪問頁面3時,將最近最久未使用的頁面1換出。
 

訪問頁面 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
物理塊1 7 7 7 2   2   4 4 4 0     1   1   1    
物理塊2   0 0 0   0   0 0 3 3     3   0   0    
物理塊3     1 1   3   3 2 2 2     2   2   7    
缺頁否                

圖3-29  LRU頁面置換算法時的置換圖


在圖3-29中,前5次置換的情況與最佳置換算法相同,但兩種算法並無必然聯繫。實際上,LRU算法根據各頁以前的情況,是“向前看”的,而最佳置換算法則根據各頁以後的使用情況,是“向後看”的。

LRU性能較好,但需要寄存器和棧的硬件支持。LRU是堆棧類的算法。理論上可以證明,堆棧類算法不可能出現Belady異常。FIFO算法基於隊列實現,不是堆棧類算法。

4. 時鐘(CLOCK)置換算法

LRU算法的性能接近於OPT,但是實現起來比較困難,且開銷大;FIFO算法實現簡單,但性能差。所以操作系統的設計者嘗試了很多算法,試圖用比較小的開銷接近LRU的性能,這類算法都是CLOCK算法的變體。

簡單的CLOCK算法是給每一幀關聯一個附加位,稱爲使用位。當某一頁首次裝入主存時,該幀的使用位設置爲1;當該頁隨後再被訪問到時,它的使用位也被置爲1。對於頁替換算法,用於替換的候選幀集合看做一個循環緩衝區,並且有一個指針與之相關聯。當某一頁被替換時,該指針被設置成指向緩衝區中的下一幀。當需要替換一頁時,操作系統掃描緩衝區,以查找使用位被置爲0的一幀。每當遇到一個使用位爲1的幀時,操作系統就將該位重新置爲0;如果在這個過程開始時,緩衝區中所有幀的使用位均爲0,則選擇遇到的第一個幀替換;如果所有幀的使用位均爲1,則指針在緩衝區中完整地循環一週,把所有使用位都置爲0,並且停留在最初的位置上,替換該幀中的頁。由於該算法循環地檢查各頁面的情況,故稱爲CLOCK算法,又稱爲最近未用(Not Recently Used, NRU)算法。

CLOCK算法的性能比較接近LRU,而通過增加使用的位數目,可以使得CLOCK算法更加高效。在使用位的基礎上再增加一個修改位,則得到改進型的CLOCK置換算法。這樣,每一幀都處於以下四種情況之一:

  1. 最近未被訪問,也未被修改(u=0, m=0)。
  2. 最近被訪問,但未被修改(u=1, m=0)。
  3. 最近未被訪問,但被修改(u=0, m=1)。
  4. 最近被訪問,被修改(u=1, m=1)。


算法執行如下操作步驟:

  1. 從指針的當前位置開始,掃描幀緩衝區。在這次掃描過程中,對使用位不做任何修改。選擇遇到的第一個幀(u=0, m=0)用於替換。
  2. 如果第1)步失敗,則重新掃描,查找(u=0, m=1)的幀。選擇遇到的第一個這樣的幀用於替換。在這個掃描過程中,對每個跳過的幀,把它的使用位設置成0。
  3. 如果第2)步失敗,指針將回到它的最初位置,並且集合中所有幀的使用位均爲0。重複第1步,並且如果有必要,重複第2步。這樣將可以找到供替換的幀。


改進型的CLOCK算法優於簡單CLOCK算法之處在於替換時首選沒有變化的頁。由於修改過的頁在被替換之前必須寫回,因而這樣做會節省時間。

 

3.8 頁面分配策略:駐留集大小、調入頁面的時機以及從何處調入頁面

駐留集大小

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

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


基於這些因素,現代操作系統通常釆用三種策略:

  1. 固定分配局部置換。它爲每個進程分配一定數目的物理塊,在整個運行期間都不改變。若進程在運行中發生缺頁,則只能從該進程在內存中的頁面中選出一頁換出,然後再調入需要的頁面。實現這種策略難以確定爲每個進程應分配的物理塊數目:太少會頻繁出現缺頁中斷,太多又會使CPU和其他資源利用率下降。
  2. 可變分配全局置換。這是最易於實現的物理塊分配和置換策略,爲系統中的每個進程分配一定數目的物理塊,操作系統自身也保持一個空閒物理塊隊列。當某進程發生缺頁時,系統從空閒物理塊隊列中取出一個物理塊分配給該進程,並將欲調入的頁裝入其中。
  3. 可變分配局部置換。它爲每個進程分配一定數目的物理塊,當某進程發生缺頁時,只允許從該進程在內存的頁面中選出一頁換出,這樣就不會影響其他進程的運行。如果進程在運行中頻繁地缺頁,系統再爲該進程分配若干物理塊,直至該進程缺頁率趨於適當程度; 反之,若進程在運行中缺頁率特別低,則可適當減少分配給該進程的物理塊。

調入頁面的時機

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

  1. 預調頁策略。根據局部性原理,一次調入若干個相鄰的頁可能會比一次調入一頁更高效。但如果調入的一批頁面中大多數都未被訪問,則又是低效的。所以就需要釆用以預測爲基礎的預調頁策略,將預計在不久之後便會被訪問的頁面預先調入內存。但目前預調頁的成功率僅約50%。故這種策略主要用於進程的首次調入時,由程序員指出應該先調入哪些頁。
  2. 請求調頁策略。進程在運行中需要訪問的頁面不在內存而提出請求,由系統將所需頁面調入內存。由這種策略調入的頁一定會被訪問,且這種策略比較易於實現,故在目前的虛擬存儲器中大多釆用此策略。它的缺點在於每次只調入一頁,調入調出頁面數多時會花費過多的I/O開銷。

從何處調入頁面

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

  1. 系統擁有足夠的對換區空間:可以全部從對換區調入所需頁面,以提髙調頁速度。爲此,在進程運行前,需將與該進程有關的文件從文件區複製到對換區。
  2. 系統缺少足夠的對換區空間:凡不會被修改的文件都直接從文件區調入;而當換出這些頁面時,由於它們未被修改而不必再將它們換出。但對於那些可能被修改的部分,在將它們換出時須調到對換區,以後需要時再從對換區調入。
  3. UNIX方式:與進程有關的文件都放在文件區,故未運行過的頁面,都應從文件區調入。曾經運行過但又被換出的頁面,由於是被放在對換區,因此下次調入時應從對換區調入。進程請求的共享頁面若被其他進程調入內存,則無需再從對換區調入。

 

3.9 頁面抖動(顛簸)和工作集(駐留集)

頁面抖動(顛簸)

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

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

工作集(駐留集)

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

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

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

 

3.10 內存管理知識點總結

分頁管理方式和分段管理方式在很多地方相似,比如內存中都是不連續的、都有地址變 換機構來進行地址映射等。但兩者也存在着許多區別,表3-20列出了分頁管理方式和分段管理方式在各個方面的對比。
 

表3-20 分頁管理方式和分段管理方式的比較
  分  頁 分  段
目 的 頁是信息的物理單位,分頁是爲實現離散分配方式,以消減內存的外零頭,提髙內存的利 用率。或者說,分頁僅權是由於系統管理的需要而不是用戶的需要 是信息的邏輯單位,它含有一組其意義相對完整的信息。分段的目的是爲了能更好地滿足用戶的需要
長 度 頁的大小固定且由系統決定,由系統把邏輯地址劃分爲頁號和頁內地址兩部分,是由機器硬件實現的,因而在系統中只能有一種大小的頁面 段的長度不固定,決定於用戶所編寫的程序, 通常由編譯程序在對流程序進行編譯時,根據信息的性質來劃分
地址空間 作業地址空間是一維的,即單一的線性地址空間,程序員只需利用一個記憶符,即可表示 一個地址 作業地址空間是二維的,程序員在標識一個地址時,既需給出段名,又需給出段內地址
碎 片 有內部碎片  無外部碎片 有外部碎片  無內部碎片
”共享“和“動態鏈接” 不容易實現 容易實現

 

 

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