存儲管理-頁式管理


存儲管理-頁式管理

頁式管理解決什么問題

  • 分區式管理,存在着嚴重的碎片問題使得內存的利用率不高
    1.固定分區,因為每一個分區只能分配給某一個進程使用,而該進程可能占不滿這個分區,就會有內部碎片

    2.動態分區,會產生大量的外部碎片,雖然可以使用緊湊技術,但是這樣時間成本過高了

出現這種情況的原因是分區管理必須要求進程占用一塊連續的內存區域,如果讓一個進程分散的裝入到不同的內存分區當中的話,這樣就可以充分的利用內存,並且不需要緊湊這種技術了。比如把一個進程離散的拆分放到零散的內存碎片中去,這樣就可以更為高效的利用內存。也就是產生了非連續的管理方式。

比如就是把一個進程拆分為若干部分,分別放到不同的分區中,比如一個進程23M,可以拆分為10M,10M,3M放到不同的分區中


如果分區分的更小,23M拆分為11個2M的,和一個1M的,每個分區是2M,那么總共會裝滿11個分區,剩下一個分區裝不滿,也僅僅浪費1M的空間,也就是分區越小的話,那么就是內存利用率就會越高。

  • 分區式管理時,進程的大小受分區大小或內存可用空間的限制
  • 分區式管理也不利於程序段和數據的共享

頁式管理的改進

  • 頁式管理只在內存存放反復執行或即將執行的程序段與數據部分
  • 不經常執行的程序段和數據存放於外存待執行時調入。

頁式管理的基本概念

頁框(頁幀):將內存空間分成一個個大小相等的分區,每個分區就是一個頁框。

頁框號:每一個頁框有一個編號,這個編號就是頁框號,從0開始

頁(頁面):將進程分割成和頁框大小相等的一個個區域,也叫頁

頁號:每一二個頁面有一個編號,叫做頁號,從0開始
注意:由於最后一個頁面可能沒有頁框那么大,所以頁框不可以太大,否則會產生過大的內存碎片

操作系統會以頁框為單位為各個進程分配內存空間,進程的每一個頁面分別放入一個頁框中,也就是進程的頁面和內存的頁框具有一一對應的關系

注意:各個頁面不需要連續存放,可以放到不相鄰的各個頁框中

如何實現地址的轉化


1.首先需要知道一個進程內的頁對應物理內存中的起始地址a是多少
2.其次要知道進程頁內地址b是多少
3.邏輯地址對應的實際物理地址就是c=a+b

如何計算?比如邏輯地址80
確定頁號:頁號=邏輯地址/頁面長度 1=80/50
頁內偏移量:頁內偏移量=邏輯地址%頁面長度 30=80%50
每個進程頁面對應物理內存中頁框的首地址:這是通過頁表查詢到的,比如查詢到對應物理內存首地址是4500
那么對應最終物理地址就是4500+30=4530

頁表

頁表的存在是為了讓我們知道進程中的一個頁的頁號對應它存放在物理內存中的頁框號,進而求出頁框號對應的首地址

邏輯地址的結構


假如頁號有k位,那么頁數就是2^k個
假如頁內地址m位,那么頁內地址有2^m個

靜態頁面管理

在作業或進程開始執行之前,把作業或進程的程序段和數據全部裝入內存的各個頁面中,並通過頁表(page mapping table)和硬件地址變換機構實現虛擬地址到內存物理地址的地址映射。

內存頁面分配與回收

靜態分頁管理的第一步是為要求內存的作業或進程分配足夠的頁面。

依賴數據結構:

頁表:

1.頁表在內存中占有一塊固定的存儲區。頁表的大小由進程或作業的長度決定。
2.對於一個每頁長1K,大小為20K的進程來說,如果一個內存單元存放一個頁表項,需要分配給該頁表20個存儲單元。
3.頁式管理時每個進程至少擁有一個頁表。

請求表:
1.用來確定作業或進程虛擬空間的各頁在內存中的實際對應位置。為此,系統必須知道每個作業或進程的頁表起始地址和長度。
2.此外,請求表還包括每個作業或進程要求的頁面數。請求表整個系統一張

存儲頁面表:

記錄內存各頁面是否已被分配出去,以及未分配頁面的總數。

位示圖法:在內存中划分一塊固定區域,每個單元的每個比特代表一個頁面。如果該頁面已被分配,則對應比特位置1,否則置0。

一個划分為1024個頁面的內存,如果內存單元長20比特,則位示圖要占據1024/20=52個內存單元。

空閑頁面鏈法:
1.空閑頁面鏈中,隊首頁面的第一個單元和第二個單元分別放入空閑頁面總數與指向下一個空閑頁面的指針。其他頁面的第一個單元分別存放指向下一個頁面的指針。
2.空閑頁面鏈的方法使用空閑頁面本身的單元存放指針,因此不占據額外的內存空間。

2.分配算法

1.首先,基於請求表獲取進程或作業要求的頁面數。
2.然后,基於存儲頁面表檢查是否有足夠的空閑頁面。
3.如果沒有,則本次無法分配。
4.如果有則分配設置頁表,填寫請求表中的相應表項;按一定查找算法搜索出所要求的空閑頁面,並將對應的頁面號填入頁表中。

3.地址變換

地址變換過程全部由硬件地址變換機構自動完成。

設一個3頁長的進程頁號為0、1、2,其對應的頁面號分別為2、3、8。設每個頁面長度為1K,指令LOAD 1,2500的虛地址為100。

1.首先,需要一個保存頁表始址和頁表長度用的控制寄存器。系統把所調度執行的進程的頁表始址和長度從請求表中取出置入控制寄存器中。
2.然后,由控制寄存器的頁表始址,找到頁表所在位置。並由虛地址100可知,指令LOAD 1,2500在第0頁的第100單元。由於第0頁與第2個頁面相對應,因此,該指令在內存中的地址為2048+100=2148。
3.當CPU執行到第2148單元的指令時,CPU要從有效地址2500中取數據放入1號寄存器中。為了找出2500對應的實際物理地址,地址變換機構首先將2500轉換為頁號與頁內相對地址組成的地址形式。即p=2,w=452。
4.由頁表,可知第2頁對應的頁面號等於8。最后,將頁面號8與頁內相對地址w=452相連,得到待訪問的物理內存地址8644。

快表:

取一個數據或指令至少要訪問內存兩次以上。
1.一次訪問頁表以確定所取數據或指令的物理地址
2.另一次是根據地址取數據或指令

提高速度:
1.把頁表放在寄存器中,但寄存器價格太貴。
2.在地址變換機構中加入一個高速聯想存儲器,構成一張快表。在快表中,存入那些當前執行進程中最常用的頁號與對應的頁面號,從而提高查找速度。

靜態頁式管理的問題

動態頁式管理分為請求頁式管理和預調入頁式管理。
1.由於靜態頁式管理要求進程或作業在執行前全部裝入內存,如果可用頁面數小於用戶要求時,該作業或進程只好能等待。
2.而且,作業或進程的大小仍受內存可用頁面數的限制。

動態頁式管理

請求頁式管理和預調入頁式管理在作業或進程開始執行之前,不把作業或進程的程序段和數據段一次性地全部裝入內存,而只裝入經常反復執行和調用的工作區部分。其他部分在執行過程中動態裝入。

請求調入

需要執行的某條指令不在內存,或執行某條指令需要訪問的其他數據或指令不在內中,則發生缺頁中斷,系統將外存中相應的頁面調入內存。

請求頁式管理只允許進程或作業的部分程序和數據駐留在內存中,因此,執行過程不可避免地會出現某些虛頁不在內存中的問題。

怎樣發現不在內存中的虛頁以及怎樣處理這種情況,是請求頁式管理必須解決的兩個基本問題。

怎樣發現不在內存中的虛頁

擴充頁表:即除了頁面號之外,每個虛頁號再增設該頁是否在內存的中斷位以及該頁在外存中的副本起始地址。

虛頁不在內存時的處理

1)采用何種方式把所缺的頁調入內存。

根據內存中的程序是否被修改過,決定是否寫回到外存。如何確定是否修改過,是通過頁表新加的改變位

如果內存中被淘汰的某一頁,曾因程序的執行而被修改,則該頁應該重新寫到外存上加以保存。而那些未被訪問修改的頁,因為外存已保留有相同的副本,沒有必要寫回外存。因此,在頁表中還應增加一項以記錄該頁是否曾被改變。

2)如果內存中沒有空閑頁面,調進來的頁放在什么地方。即采用什么策略淘汰已占據內存的頁。

  • 內存頁面置換算法直接影響內存利用率和系統效率。
  • 如果置換算法選擇不當,有可能剛被調出內存的頁又馬上被調回內存,調回內存不久又馬上被調出內存。
  • 這使得整個系統的頁面調度非常頻繁,以致大部分時間花費在主存和輔存之間的來回調入調出上。這種現象被稱為抖動(thrashing)現象。

整個流程:

  • 其中有關地址變換部分由硬件自動完成。
  • 當硬件變換機構發現所要求的頁不在內存時,產生缺頁中斷信號,由中斷處理程序做出相應的處理。
  • 中斷處理程序由軟件實現。

請求調入的缺點:
請求頁式管理是一個十分復雜的處理過程,犧牲系統開銷提高內存利用率。
原因:除了在沒有空閑頁面時要按照置換算法選擇被淘汰頁面之外,還要從外存讀入所需要的虛頁。這個過程要啟動相應的外存和涉及到文件系統。

請求頁式管理中的置換算法

1.隨機淘汰算法(random glongram):在無法確定哪些頁被訪問的概率較低時,隨機選擇某個用戶的頁面將其換出。

2.輪轉法(round robin): 循環換出內存可用區內一個可以被換出的頁,無論該頁是剛被換進或已換進內存很長時間。

  • 內存利用率不高

3.先進先出算法(FIFO):選擇在內存駐留時間最長的一頁將其淘汰。

  • 內存利用率不高
  • 陷阱現象:一般來說,給任一作業或進程分配的內存頁面數越接近於它所要求的頁面數,則發生缺頁的次數會越少。極限情況下,這個推論是成立的。
    使用FIFO算法時,在未給進程或作業分配足它所要求頁面數的情況下,有時會出現分配的頁面數增多,缺頁次數反而增加的奇怪現象。這種現象稱為Belady現象

Belady現象的例子:

設進程P有8頁,且已在內存中分配3個頁面,程序訪問內存的順序(訪問串)為7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1。下表給出內存中進程P所建的程序和數據的各頁面變化情況。

內存中給這個進程分配了三個頁面,程序訪問的頁號依次是7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1
一開始的時候三個頁面都是空的,它要求7號頁,7號頁不在內存中,所以要從外存調入一次缺頁中斷,0同理不在內存中調入,兩次缺頁了,1也不在,3次缺頁,2頁不在,但是現在內存滿了,7由於最先到的,先淘汰它,2號進來,4次缺頁,0號在內存中不發生缺頁,之后依次是3,0,4,2,3,0,3,2,1,2,0,1號頁。同理可得圖片中黃色代表缺頁了,缺頁12次,訪問17次,缺頁率12/17=70.5%。

如果給進程P分配4個頁面,則在其執行過程中內存頁面的變化情況如下表所示。

進程P在擁有4個內存頁面時,共發生9次缺頁,其缺頁率為9/17=52.9%。

設進程P可分為5頁,訪問串為1,2,3,4,1,2,5,1,2,3,4,5。當進程P分得3個頁面時,執行過程中內存頁面變化如下表所示。

進程P在執行過程中共缺頁9次,其缺頁率為9/12=75%。

如果為進程P分配4個內存頁面,是否缺頁率會變小呢?進程P分得4個頁面時,執行過程中內存頁面的變化情況如下表。


進程P分得4個頁面時,執行過程中的缺頁次數為10次。即缺頁率=10/12=83.3%。
先進先出算法產生Belady現象的原因在於它沒有考慮程序執行的動態特征。

4.最近最久未使用頁面置換算法(least recently used)

基本思想:當需要淘汰某一頁時,選擇離當前時間最近的一段時間內最久沒有使用過的頁先淘汰。
該算法的主要出發點是,如果某頁被訪問了,則它可能馬上還要被訪問。或者反過來說,如果某頁很長時間未被訪問,則它在最近一段時間也不會被訪問。
缺點:要完全實現LRU算法是一件十分困難的事情。因為要找出最近最久未被使用的頁面,必須對每一個頁面設置訪問記錄項,而且每一次訪問都必須更新這些記錄,這需要花費巨大的系統開銷。因此,在實際系統中往往使用LRU的近似算法。

5.最不經常使用頁面淘汰算法LFU(least frequently used)。
該算法在需要淘汰某一頁時,首先淘汰到當前時間為止,被訪問次數最少的那一頁。
在頁表中給每一頁增設一個訪問計數器即可實現。
某頁被訪問時,該頁訪問計數器加1,發生缺頁中斷時,淘汰計數值最小的那一頁,並將所有的計數器清零。

6.最近沒有使用頁面淘汰算法NUR。
該算法在需要淘汰某一頁時,從那些最近一個時期內未被訪問的頁中任選一頁淘汰。在頁表中增設一個訪問位即可實現。
當某頁被訪問時,訪問位置1。否則,訪問位置0。
系統周期性地對所有訪問位清零。
需淘汰一頁時,從那些訪問位為零的頁中選一頁淘汰。

7.理想型淘汰算法OPT(optimal replacement algorithm)
該算法淘汰在訪問串中將來再也不出現的或是在離當前最遠的位置上出現的頁。
淘汰掉該頁不會造成因需要訪問該頁又立即把它調入的現象。
這種算法無法實現,因為它要求必須預先知道每一個進程的訪問串。

預調入

系統對外存中的頁進行調入順序計算,估計這些頁中指令和數據的執行和被訪問順序,並按此順序將它們順次調入和調出內存。

頁式管理存儲保護

  • 地址越界保護:地址變換機構中的控制寄存器的頁表長度 VS. 要訪問的虛地址。
  • 存儲控制保護:在頁表中增加保護位用於控制內存信息的存取操作方式:。

頁式管理的優缺點

優點:

  • 不要求作業或進程的程序段和數據在內存中連續存放,有效地解決了碎片問題。
  • 動態頁式管理提供內存和外存統一管理的虛存實現方式,大大增加用戶可以利用的存儲空間。既提高了主存的利用率,又有利於組織多道程序執行。

缺點:

  • 要求相應硬件支持。例如地址變換機構,缺頁中斷的產生等都要求有相應的硬件支持。增加了機器成本。
  • 增加了系統開銷,例如缺頁中斷處理等。
  • 請求調頁的算法如選擇不當,有可能產生抖動現象。
  • 雖然消除了碎片,但每個作業或進程的最后一頁內總有一部分空間得不到利用。如果頁面較大,這一部分的損失較大。


免責聲明!

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



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