操作系統學習筆記(10)——虛擬存儲管理




1、程序訪問局部性原理

  • 指CPU對指令和數據的存取在時間、空間和順序上往往集中在一定的范圍內。
  • 3種分類
    • 時間局部性:由於程序存在循環結構、臨時變量和子程序調用,如果某條指令被執行或某個數據結構被訪問,則不久的一段時間內該指令可能再次執行,該數據結構可能再次被訪問。
    • 空間局部性:若某個存儲單元被訪問,則在不久之后,其附近的存儲單元也可能再次被訪問。
    • 順序局部性:通常情況下,CPU跟蹤程序的執行是按照在內存中的連續地址進行的。只有在遇到轉移指令時,才會跳轉到一個不連續的地址空間,但跳轉到新的地址空間后,指令又是順序進行 。


 2、虛擬存儲器

  • 指用戶對待作為可編址內存的存儲空間,是由操作系統提供的一個假象的存儲器,它不是實際的內存,而是操作系統對物理內存的邏輯擴充
  • 虛擬存儲技術就是基於程序運行的局部性規則,將大程序種當前正在使用的部分放在內存種,而其余部分放在磁盤中。當一個進程訪問的程序和數據在內存中,執行就可以順利進行。弱國處理器訪問了不在內存的程序或數據,為了繼續執行下去,需要由系統自動將這部分信息裝入內存,這叫部分裝入。若內存中沒有足夠空閑空間,便需要把內存中暫時不用的信息從內存移到輔存上去,這叫部分對換
  • 4個基本特性:離散型、多次性、對換性、虛擬性。最基本特性是離散型,所表現出來的最重要特性是虛擬性。
  • 3種實現方式:請求頁式存儲管理、請求段式儲存管理、請求段頁式儲存管理


3、請求頁式存儲管理

  • 3個基本問題:
    1. 系統如何獲知進程當前所需頁面不在內存中。
    2. 當發現缺頁時,如何讓把所缺頁面調入內存。
    3. 當內存中沒有空閑頁面時,為了接收一個新頁,需要把老的淘汰出去,這又根據什么策略選擇淘汰頁面。
  • 解決問題的方法:擴充頁表

    • 頁號和頁框號。其作用與頁式存儲管理相同
    • 中斷位。指示頁是否在內存中。若不在,則產生缺頁中斷
    • 訪問位。記錄該頁在一段時間內被訪問的次數,或記錄最近已有多長時間未被訪問,提供給置換算法在選擇換出頁面時參考
    • 修改位。表示該頁在調入內存后是否被修改過。當CPU以寫的方式 訪問頁面時,設置該頁的修改位,在置換該頁時必須將該頁重寫到  外存上;若沒修改,則在置換時不需將該頁寫回外存。
    • 外存地址。指出該頁在外存上的地址,供調入該頁時使用。
  • 地址轉換過程
    • 存儲管理單元自動按頁面大小把邏輯地址從某位起分解成兩部分:頁號和頁內地址;
    • 以頁號為索引搜索快表;
    • 如果在快表中命中,立即送出頁框號,並與頁內地址拼接成物理地址,然后,進行權限檢查,如獲通過進程就可以訪問物理地址了;
    • 如果在快表中不命中,以頁號為索引搜索進程頁表,頁表的始址由硬件頁表控制寄存器指出;
    • 如果在頁表中找到此頁面,說明訪問頁面己在內存,那么, 可送出頁框號,並與頁內地址拼接成物理地址,然后,進行權限檢查,如獲通過進程就可以訪問物理地址了;
    • 同時要把這個頁面的信息裝入快表,以備再次訪問;
    • 如果發現頁表中對應頁面頁失效,存儲管理單元就發出一個缺頁中斷,請求系統進行處理;
    • 這時由存儲管理軟件按置換策略進行調頁;
    • 接着把該頁面裝入內存,修改頁表,返回用戶進程重新執行被中斷的指令。
  • 地址轉換過程流程

 

  • 地址轉換過程

 

  •  缺頁中斷與一般中斷的區別
    • 在指令執行期間產生和處理中斷信號。通常,CPU都是在一條指令執行完后去檢查是否有中斷請求到達。然而,缺頁中斷是在指令執行期間,發現所要訪問的  指令或數據不在內存時產生和處理的。
    • 一條指令執行期間,可能產生多次缺頁中斷。硬件機構應能保存多次中斷時的狀態,並保證最后能返回到中斷前產生缺頁中斷的指令處,繼續執行。
  • 頁面調用策略和清除策略
    • 兩種調用策略:請頁式調入和預調式調入
    • 兩種清除策略:請頁式清除和預調式清除
  • 頁面分配策略
    • 兩種策略:固定分配和可變分配
      • 固定分配策略:缺少靈活性
      • 可變分配:性能會更好些,采用可變分配策略的困難在於操作系統要經常監視活動進程的行為和進程缺頁中斷率的情況,這會增加操作系統的開銷。
    • 在進行頁面置換時,也可采用兩種策略:局部置換和全局置換
    • 固定分配往往和局部置換策略配合使用
    • 可變分配往往和全局置換策略配合使用


4、頁面置換算法

  • 頁面置換算法是指在需要調入頁面且內存已滿時,確定將要換出頁面的算法。
  • 一個理論算法:假定進程P共計N頁,而系統分配給它的內存塊只有M塊(MN均為正整數,且1≤MN)。如果進程P在運行中成功的訪問次數為S(即所訪問的頁在內存中),不成功的訪問次數為F(即缺頁中斷次數),則缺頁中斷率為:R=F/(S+F)
  • 最佳置換算法:選擇用不使用的或者在最長時間內不在被訪問的頁面進行置換

  • 先進先出置換算法(FIFO):選擇最先進入內存的頁面進行置換,即選擇在內存中駐留時間最久的頁面進行淘汰。

 

 

    • 優點:直觀,實現簡單,可通過鏈表按時間先后順序鏈接。
    • 缺點:它與進程實際運行的規律不相適應,性能較差,將出現Belady現象,即當分配頁面數增加,缺頁率和缺頁次數反而提高的異常現象,故實際應用極少。
  • 最近最久未使用置換算法(LRU):選擇最近一度按時間內最長時間沒有被訪問的頁面進行置換。
    • 缺點:系統開銷和硬件開銷增大

 

  •  時間置換算法(Clock):又稱最近未使用算法(NRU),是LRU和FIFO的折衷算法。將內存中的所有頁面都通過指針鏈接成循環隊列,每頁設置一位訪問位,若某頁被訪問時,其訪問位被置1。置換時首先檢查訪問位,如果是0,就選擇該頁換出;若為l,則重新將它復0,暫不換出而給該頁第二次駐留內存的機會,再按照FIFO算法檢查下一個頁面。當檢查到隊列中的最后一個頁面時,若其訪問位仍為1,則再返回到隊首再去檢查第一個頁面。
  • 最少使用置換算法(LFU):其基本思想是把到當前為止被訪問次數最少的頁面淘汰。 類似於LRU算法,該算法為內存的每個頁面設置訪問計數器,用來記錄該頁面被訪問的頻率。當頁面被訪問,該頁面計數器加1,發生缺頁中斷時,淘汰計數值最小的頁面,並將所有計數清零。


5、性能分析

  • 性能分析的兩個方面:1)缺頁率和有效訪問時間;2)工作集
  • 缺頁率和有效訪問時間
    • 缺頁率是指出現缺頁的概率,或是缺頁時間間隔的概率。
    • 有效訪問時間可表示為:有效訪問時間=(1−p)*存儲器訪問時間+p*缺頁中斷時間。
    • 要使缺頁率不至於對有效訪問時間造成過大的影響,必須保證虛存請求分頁管理方式非常低的缺頁率;否則,程序的執行速度將受到嚴重影響。
    • 此外,提高磁盤I/O的速度,對改善虛存頁式管理系統的性能至關重要,應盡量選用高速磁盤和高速磁盤接口。
  • 工作集
    • 工作集是指在某段時間間隔∆里,進程實際要訪問的頁面的集合
    • 把某進程在時間 t 的工作集記為w(t,∆),把變量 ∆ 稱為工作集 “窗口尺寸”。

 



6、請求段式存儲 

  • 基本原理
    • 請求段式存儲管理是在段式存儲管理的基礎上建立的
    • 其基本思想和段式存儲管理類似,只是在請求段式管理中,程序運行前只需先裝入若干段,便可啟動運行,在執行過程中,進程可請求系統將所缺的段調入內存。
    • 同樣,請求分段存儲管理方式需要有硬件支持。
    • 請求段式管理中所設置的主要數據結構仍是段表,但因為進程的只有一部分段裝入內存,其余仍在外存上,故需在段表中增加若干項,以供程序在缺段中斷時使用。如圖所示給出了段表中的段表項。

 

  •  地址轉換

 

 



 

7、請求段頁式存儲管理

  • 基本原理
    • 請求段頁式存儲管理是在段頁式存儲管理的基礎上建立的。
    • 其基本思想和段頁式存儲管理類似,只是在請求段頁式管理中,程序運行前只需先裝入段中的若干頁,便可啟動運行,在執行過程中,進程可請求系統將所缺的段或頁調入內存。
    • 同樣,請求段頁式存儲管理方式需要有硬件支持。
  • 動態地址

 



 

8、Linux系統存儲管理

  •  Linux中的頁表
    • Linux采用三級分頁存儲結構。這是Linux提供的與硬件無關的分頁管理方式。
  • 頁面的分配與回收
    • 頁面分配
      • 在Linux系統中,所有的物理頁都用數據結構men_map來描述,而men_map又是由men_map_t結構組成的鏈表,系統啟動時對men_map_t初始化。每個men_map_t結構描述系統中的一個物理頁,其主要內容如下。
      1. count:記錄使用此頁面的用戶數。當多個進程共享此物理內存頁時,值大於1。
      2. age:描述該頁面的年齡,以決定該頁是否被淘汰或換出。
      3. map_nr:描述men_map_t對應頁面的物理頁框號。
      • 頁面分配采用鏈表和位圖結合的方法。 
    • 頁面回收
      • Linux中內存塊的釋放由調用free_pages()函數完成。當回收空閑塊時,change_bit()函數根據map指針指向的位表,判斷回收塊的前后頁塊也即它的伙伴是否也為空,若空則合並,並修改位表中對應位,從free_area的空閑鏈中取下該相鄰塊。這個遞歸過程一直進行到找不到相鄰空閑塊為止。最后,合並的最大塊插入free_area的相應list鏈表中。
    • 頁面的換入換出
      • Linux 將頁面換出操作從缺頁中斷和頁面換入中分離出來,獨立設計了頁面換出后台進程kswapd
      • kswapd是一種特殊的進程,稱作內核態線程。它是一種沒有虛擬存儲空間的進程,運行在內核態中,直接使用物理地址空間。內核態交換過程kswapd使頁面換出至交換空間,保證了系統中有足夠的空閑頁面,以使存儲管理系統可以高效地運行。


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM