分页及其管理、页面置换算法
1.分頁
大部分虛擬內存系統中都使用一種稱為分頁的技術。
在任何一臺計算機上,程序引用了一組內存地址,由程序產生的這些地址稱為虛擬地址,他們構成了一個虛擬地址空間。
- 在沒有虛擬內存的計算機上,系統直接將虛擬地址送到內存總線上,讀寫操作使用具有同樣地址的物理內存字;
- 在使用虛擬內存的情況下,虛擬地址不是直接被送到內存總線上,而是被送到內存管理單元(Memeory Management Unit,MMU),MMU把虛擬地址映射為物理內存地址。
虛擬地址空間按照固定大小劃分成稱為頁面的若干單元。在物理內存中對應的單元稱為頁框。頁面和頁框大小是一樣的,這里假設都為4KB。他們之間的映射關系如下圖:
注:在上圖中,我們假設有一臺可以產生16位地址的計算機,地址范圍從0到64K,且這些地址是虛擬地址。
然而,這臺計算機只有32K的物理內存,因此,雖然可以編寫64KB的程序,但它們卻不能被完全調入內存運行。
在磁盤上必須有一個可以大到64KB的程序核心映像的完整副本,以保證程序片段在需要時能被調入內存。 內存和磁盤之間的交換總是以整個頁面為單元進行的。
在圖中,對應于64KB虛擬地址空間和32KB的物理內存,我們得到16個虛擬頁面和8個頁框。
圖中的標記符號如下:標記0-4K的范圍表示該頁的虛擬地址或物理地址是0-4095;4K-8K的范圍表示地址4096-8191,等等,每一頁包含了4096個地址。 當程序試圖訪問地址8203時,例如執行下面這條指令?
MOV REG 8203通過恰當地設置MMU,可以把16個頁面映射到8個頁框中的任何一個。
但是這樣并沒有解決虛擬地址空間比物理內存大的問題。在上圖中只有8個物理頁框,于是只有8個虛擬頁面被映射到了物理內存中(圖中的×表示頁面沒有被映射。)在實際的硬件中,用一個“在/不在”位來記錄頁面是否在內存中。
當程序訪問一個未映射的頁面時,例如執行如下指令
MOV REG 32780將虛擬地址32870送到MMU,MMU看到虛擬地址落在頁面8(32768-36863),但是該頁面并沒有被映射到內存中,于是發生缺頁中斷,操作系統調用適當的頁面置換算法,找到某個頁框將它的內容寫入磁盤(如果它不在磁盤),隨后把頁面8讀到剛才回收的頁框,修改映射關系,然后重新啟動引起陷阱的指令。
2.分頁管理
2.1.頁表
分頁系統中,允許將進程的每一頁離散地存儲在內存的任一物理塊中。
為了能在內存中找到每個頁面對應的物理塊,系統為每個進程建立一張頁表,用于記錄進程邏輯頁面與內存物理頁面之間的對應關系。頁表的作用是實現從頁號到物理塊號的地址映射,地址空間有多少頁,該頁表里就登記多少行,且按邏輯頁的順序排列,形如:
虛擬地址到物理地址的映射可以概括如下:
- 虛擬地址被分成虛擬頁號(高位部分)和偏移量(低位部分)。
- 例如,對于16位地址和4KB的頁面大小,高4位可以指定16個虛擬頁面,而低12位接著確定了頁內偏移量。
- 虛擬頁號可用作頁表的索引,以找到該虛擬頁面所對應的頁表項。由頁表項可以找到頁框號(如果有的話)。
- 然后把頁框號拼接到偏移量的高位端,以替換掉虛擬頁號,形成送往內存的物理地址。
- ?
2.2 頁表項
一個典型的頁表項如下:
頁表項的結構是與機器密切相關的,但不同機器的頁表項存儲的信息都大致相同。
- 頁表項中最重要的域是 頁框號。
- 其次是 “在/不在”位,
- 這一位為1時表示該表項是有效的,可以使用;
- 如果是0,則表示該表項對應的虛擬頁現在不在內存中,訪問該頁面會引起缺頁中斷。
- “保護”位指出一個頁面允許什么類型的訪問。
- 最簡單的形式是這個域只有一位
- 0表示讀/寫
- 1表示只讀。
- 一個更先進的方法是使用三位
- 各位分別對應是否啟用讀、寫、執行該頁面。
- 最簡單的形式是這個域只有一位
- “修改”位和“訪問”位用于記錄頁面的使用情況。
- 這兩位在操作系統重新分配頁框和發生缺頁中斷選擇淘汰的頁時非常有用。
- ““高速緩存禁止”位用于禁止該頁面被高速緩存。
2.3.加速分頁過程
在任何分頁式系統中,都需要考慮兩個主要問題:
2.3.1 轉換檢測緩沖區
TLB這種方案的建立是基于這樣一種現象:大多數程序總是對少量的頁面進行多次的訪問,而不是相反的。
因此,只有很少的頁表會被反復讀取,而其他的頁表項很少被訪問;
通過這個方案為計算機設置了一個小型的硬件設備,將虛擬地址直接映射到物理地址,而不是在訪問頁表。這種設備稱為”轉換檢測緩沖區“。
工作原理:
將一個虛擬地址放入MMU中進行轉換時,硬件首先通過將該虛擬頁號與TLB中所有表項同時(即并行)進行匹配,判斷虛擬頁面是否在其中。
- 如果發現了一個有效的匹配并且要進行的訪問操縱并不違反保護位,則將頁框號直接從TLB中取出而不必再訪問頁表。
- 如果虛擬頁面號確實是在TLB中,但指令試圖在一個只讀頁面上進行寫操作,則會產生一個保護錯誤,就像對頁表項的非法訪問一樣。
- 如果MMU檢測到沒有有效地匹配項時,就會進行正常的頁表查詢。
- 接著從TLB中淘汰一個表項,然后用新找到的頁表項代替它。這樣,如果這一頁面很快再被訪問,第二次訪問TLB時自然將會命中而不是不命中。
- 當一個表項被清除出TLB時,將修改位復制到內存中的頁表項,而除了訪問位,其他的值不變。當頁表項中從頁表裝入到TLB中時,所有的值都會來自內存。
2.3.2多級頁表
32位的虛擬地址被劃分為10位的PT1域,10位PT2域和12位的Offset(偏移量)域。
- 偏移量是12位,所以頁面長度是4KB(2^12=4*2^10=4KB),
- PT域是20位,共有2^20個頁面。
引入原因:避免把全部頁表一直保存在內存中。特別是那些從不需要的頁表就不應該保留。
工作原理:
在左邊是頂級頁表,它具有1024個表項,對應于10位的pT1 域。
當一個虛擬地址被送到MMU時,MMU首先提取PT1域并把該值作為訪問頂級頁表的索引。
- 因為整個4GB((2^2)*(2^10)*(2^10)*(2^10)=2^32,整個虛擬地址)虛擬地址空間已經被分為1024個4MB的塊(按PT1來說,總共是1024個表項,劃分整個虛擬地址空間,就是每個表項是4MB),所以這1024個表項中的每一個都表示4MB的虛擬地址空間。
由頂級頁表得到的表項中含有二級頁表的地址或頁表框號。
- 頂級頁表中
- 表項0指向程序正文的頁表
- 表項1指向數據的頁表
- 表項1023指向的堆棧的頁表
- 其他的表項未用
現在把PT2域作為訪問選定的二級頁表的索引,以便找到該虛擬頁表的對應頁框號。
舉例:
考慮虛擬地址0x00403004(十進制4206596)位于數據部分12292字節處。
0x00403004二進制表示為:0000 0000 0100 0000 0011 0000 0000 0100
它的虛擬地址對應PT1=1, PT2=3, Offset=4。
MMU首先用PT1作為索引訪問頂級頁表得到表項1(符合前文所說的數據部分,1對應數據的頁表),它對應的地址范圍是4-8M;
然后,它用PT2作為索引訪問剛剛找到的二級頁表(頂級頁表項1指的二級頁表項)并得到表項3(由PT2得到的3),它對應的虛擬地址范圍是在它的4M塊內的12288-16383(即絕對地址4106592-4210687)。這個表項是否含有虛擬地址0x00403004所在頁面的頁框號:
- 如果頁面不在內存中,頁表中的”在/不在“位將是0,引發一次缺頁中斷。
- 如果該頁面在內存中,從二級頁表中得到的頁框號將與偏移量結合形成物理地址。
2.3.3倒排也法
對于32位虛擬地址空間,多級頁表可以發揮的很好,但對于64位的計算機情況發生了徹底的變化,因而64位分頁的虛擬地址空間的系統需要一個不同的解決方案。
倒排頁表的方法可以節省大量的空間,但也存在不足,主要在機器的運行效率上。
走出這種兩難的局面的辦法是使用TLB。
- 如果TLB能夠記錄所有頻繁使用的頁面,地址轉換就可能變得像通常的頁表一樣快。
- 但是,當發生TLB失效時,需要用軟件搜索整個倒排頁表。
一個可行的實現該搜索的方法是建立一張散列表,用虛擬地址來散列,當前所有在內存中的具有相同散列值的虛擬頁表被鏈接在一起。
如果散列表中的槽數與機器中物理頁面數一樣多,那么散列表的沖突鏈的平均長度將會是1個表項,這將會大大提高映射的速度。
一旦也框號被找到,新的(虛擬頁號、物理頁框號)對就會被裝載到TLB中。
3.置換策略理論
3.1 最佳置換算法(OPT)
最佳(Optimal, OPT)置換算法所選擇的被淘汰頁面將是以后永不使用的,或者是在最長時間內不再被訪問的頁面。這樣可以保證獲得最低的缺頁率。
但由于人們目前無法預知進程在內存下的若千頁面中哪個是未來最長時間內不再被訪問的,因而該算法無法實現。
3.2 先進先出(FIFO)頁面置換算法
優先淘汰最早進入內存的頁面,即在內存中駐留時間最久的頁面。
該算法實現簡單,只需把調入內存的頁面根據先后次序鏈接成隊列,設置一個指針總指向最早的頁面。
但該算法與進程實際運行時的規律不適應,因為在進程中,有的頁面經常被訪問。
3.3. 最近最久未使用(LRU)置換算法
選擇最近最長時間未訪問過的頁面予以淘汰,它認為過去一段時間內未訪問過的頁面,在最近的將來可能也不會被訪問。
該算法為每個頁面設置一個訪問字段,來記錄頁面自上次被訪問以來所經歷的時間,淘汰頁面時選擇現有頁面中值最大的予以淘汰。
3.4對比
| 可保證獲得最低的缺頁率,并且可以用來評價其他算法 | 理論上的算法,目前該算法是無法實現的 | 以進行模擬實驗分析或理論分析 |
| 實現簡單,要求的硬件支持較少 | 所依據的條件是各個頁面調入內存的時間,而頁面調入內存的先后并不能反映頁面的使用情況 | 在按線性順序訪問地址空間時使用;當硬件水平不足時,FIFO算法也可作為首選 |
| 利用“最近的過去”代替“最近的將來”,以此模擬Optimal算法,是實際應用中缺頁率最低的算法 | 根據各頁以前的使用情況,來代替各頁面將來的使用情況,進而判斷要替換出去的頁面,而頁面過去和將來的走向之間并無必然的聯系; 其實際應用時要求較多的硬件支持,因而多采用近似算法 | 當系統有寄存器或棧的硬件支持時,利用LRU算法可以獲得最低缺頁率 |
3.5舉例
假定系統為某進程分配了三個物理塊,并考慮有以下頁面號引用串:? 7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1
3.5.1 OPT
| ? | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 訪問頁面 | 7 | 0 | 1 | 2 | 0 | 3 | 0 | 4 | 2 | 3 | 0 | 3 | 2 | 1 | 2 | 0 | 1 | 7 | 0 | 1 |
| 塊1 | 7 | 7 | 7(18) | 2 | 2(9) | 2 | 2(9) | 2 | 2 | 2(13) | 2 | 2 | 2(15) | 2 | 2 | 2 | 2(-) | 7 | 7 | 7 |
| 塊1 | ? | 0 | 0(5) | 0 | 0(7) | 0 | 0(11) | 4 | 4 | 4(-) | 0 | 0 | 0(16) | 0 | 0 | 0 | 0(19) | 0 | 0 | 0 |
| 塊1 | ? | ? | 1(14) | 1 | 1(14) | 3 | 3(10) | 3 | 3 | 3(12) | 3 | 3 | 3(-) | 1 | 1 | 1 | 1(20) | 1 | 1 | 1 |
| 缺頁否 | √ | √ | √ | √ | ? | √ | ? | √ | ? | ? | √ | ? | ? | √ | ? | ? | ? | √ | ? | ? |
缺次數:9
換頁次數:6
3.5.2FIFO
| 訪問頁面 | 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 | 4 | 4 | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 7 | 7 | 7 |
| 塊1 | ? | 0 | 0 | 0 | 0 | 3 | 3 | 3 | 2 | 2 | 2 | 2 | 2 | 1 | 1 | 1 | 1 | 1 | 0 | 0 |
| 塊1 | ? | ? | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 3 | 3 | 3 | 3 | 3 | 2 | 2 | 2 | 2 | 2 | 1 |
| 缺頁否 | √ | √ | √ | √ | ? | √ | √ | √ | √ | √ | √ | ? | ? | √ | √ | ? | ? | √ | √ | √ |
缺頁次數:15
換頁次數:12,比最佳置換算法正好多一倍。
FIFO算法基于隊列實現,不是堆棧類算法。
FIFO算法還會產生當所分配的物理塊數增大而頁故障數不減反增的異常現象,這是由 Belady于1969年發現,故稱為Belady異常。只有FIFO算法可能出現Belady 異常,而LRU和OPT算法永遠不會出現Belady異常。
| 1 | 1 | 1 | 4 | 4 | 4 | 5 | 5 | 5 | 5 | 5 | 5 |
| ? | 2 | 2 | 2 | 1 | 1 | 1 | 1 | 1 | 3 | 3 | 3 |
| ? | ? | 3 | 3 | 3 | 2 | 2 | 2 | 2 | 2 | 4 | 4 |
| √ | √ | √ | √ | √ | √ | √ | ? | ? | √ | √ | ? |
| 1 | 1 | 1 | 1 | 1 | 1 | 5 | 5 | 5 | 5 | 4 | 4 |
| ? | 2 | 2 | 2 | 2 | 2 | 2 | 1 | 1 | 1 | 1 | 5 |
| ? | ? | 3 | 3 | 3 | 3 | 3 | 3 | 2 | 2 | 2 | 2 |
| ? | ? | ? | 4 | 4 | 4 | 4 | 4 | 4 | 3 | 3 | 3 |
| √ | √ | √ | √ | ? | ? | √ | √ | √ | √ | √ | √ |
3.5.3 LRU
| ? | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 訪問頁面 | 7 | 0 | 1 | 2 | 0 | 3 | 0 | 4 | 2 | 3 | 0 | 3 | 2 | 1 | 2 | 0 | 1 | 7 | 0 | 1 |
| 塊1 | 7 | 7 | 7(1) | 2 | 2(4) | 2 | 2(4) | 4(8) | 4(8) | 4(8) | 0 | 0 | 0(11) | 1 | 1(14) | 1 | 1(17) | 1 | 1 | 1 |
| 塊1 | ? | 0 | 0(2) | 0 | 0(5) | 0 | 0(7) | 0(7) | 0(7) | 3(10) | 3 | 3 | 3(12) | 3 | 3(12) | 0 | 0(16) | 0 | 0 | 0 |
| 塊1 | ? | ? | 1(3) | 1 | 1(3) | 3 | 3(6) | 3(6) | 2(9) | 2(9) | 2 | 2 | 2(13) | 2 | 2(15) | 2 | 2(15) | 7 | 7 | 7 |
| 缺頁否 | √ | √ | √ | √ | ? | √ | ? | √ | √ | √ | √ | ? | ? | √ | ? | √ | ? | √ | ? | ? |
缺頁次數:12
換頁次數:9
前5次置換的情況與最佳置換算法相同,但兩種算法并無必然聯系。
- LRU算法根據各頁以前的情況,是“向前看”的,
- 最佳置換算法則根據各頁以后的使用情況,是“向后看”的。
LRU性能較好,但需要寄存器和棧的硬件支持。
LRU是堆棧類的算法。理論上可以證明,堆棧類算法不可能出現Belady異常。
3.5.1堆棧類算法
基本思想:隨著分配給程序的主存頁面數增加,主存的命中率會提高,至少不下降。
LFU和LRU算法中,由于在主存中保留的是最近使用過的頁面。
如果先給某一個程序分配n個主存頁面,那么在t時刻,這n個主存頁面都是最近使用過的頁面。
如果再給程序多分配一個主存頁面,那么在t時刻,這n+1個主存頁面也都是最近使用過的頁面。
因此,在這n+1個主存頁面中必然包含了前面的n個主存頁面。
所以LFU和LRU算法都是堆棧型算法。
3.6 最近未使用頁面置換算法(NRU)
找到最久沒有使用的頁面置換出去,頁面被訪問時設置R位,修改時設置M位,R位定期清0;
把頁面分四類:
- 0類:未被訪問,未被修改的 ? ?? R=M=0
- 1類:未被訪問,被修改 ? ? ? ? ? ? R=0,M=1
- 2類:被訪問,未被修改 ? ? ? ? ? ? R=1,M=0
- 3類:被訪問,被修改 ? ? ? ? ? ? ? ? R=1,M=1
系統從類類編號最小的非空類隨機挑選一個置換。
3.7 第二次機會頁面置換算法
改進版FIFO。
淘汰舊頁面時先從檢查頭部頁面的R位,
- 若為1,則說明此頁面最近被使用過,置R=0,把它加到尾部去,重新設置其裝入時間為當前時刻,繼續搜尋
- 若M為0,如果此頁面被寫過,把它寫回磁盤再淘汰,若未被寫,直接淘汰
3.8 時鐘頁面置換算法
維持一個保存所有頁面的環形鏈表,一個指針指向最老頁面。
發生缺頁中斷時,檢查指針指向頁面,若R=0,則更新它,若R=1,清除R位,指針前移,繼續搜索。
3.9 最不常用算法NFU
為每個頁面維持一個初值0的計數器,每次時鐘中斷,由操作系統掃描所有頁面,把計數器加上當前的R位更新,這樣每個計數器的值大概反映了被訪問的頻繁程度。缺頁中斷時,置換計數器數值最小的頁面。
3.10 老化算法-改進的LRU
在R位加進之前,先把計數器值右移一位,把R位加到計數器最左邊, 特點:每次時鐘滴答只能記下一位,因此如果兩個頁面在同一個時鐘滴答期間被訪問是不能分出的,而且由于計數器是有限位數,假設是8位,如果很多頁面在8個時鐘滴答都未被訪問的話,就都是全零位無法區分,但實際情況是,若已經這么久沒有被訪問了,該頁面一般也不是很重要了 。
3.11 工作集頁面置換算法
定義一個工作集:在過去t秒內被訪問的頁面的集合。
掃描所有頁面,若R=1,說明在這個時鐘滴答被訪問了,它應該是工作集的一部分,把當前時間寫入頁表項的“上次使用時間“ 。
若R=0,且生存時間(當前時間-上次使用時間)>t,置換它,如果<t,記住最小時間。
3.12 工作集時鐘頁面置換算法
維持一個以頁框為元素的循環表,形成一個環。
每個表項包括上次使用時間,R位、M位。
缺頁中斷時,首先檢查指針指向的頁面,
- 若R=1,則說明它最近被訪問了,把R位置為0,指針指向下一個位置;
- 若R=0,若它的生存時間>t且此頁面干凈,置換之。
- 如果不干凈,繼續往前走。(因為可能前方存在舊的又干凈的頁面)
參考:
https://blog.csdn.net/EveryFriDay_ShuJk/article/details/79817235
https://www.cnblogs.com/wujing-hubei/p/5967826.html
https://blog.csdn.net/qq_34777600/article/details/79508613
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的分页及其管理、页面置换算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统(概述、组成)、用户态、内核态
- 下一篇: 线程调度、公平锁和非公平锁、乐观锁和悲观