頁面置換演算法

2021-09-24 22:41:37 字數 3018 閱讀 4604

參考文章:

位址對映過程中,若在頁面中發現所要訪問的頁面不在記憶體中,則產生缺頁中斷。當發生缺頁中斷時,如果作業系統記憶體中沒有空閒頁面,則作業系統必須在記憶體選擇乙個頁面將其移出記憶體,以便為即將調入的頁面讓出空間。而用來選擇淘汰哪一頁的規則叫做頁面置換演算法。

1.最佳置換演算法(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淘汰……依此類推。

2.先進先出置換演算法(fifo):是最簡單的頁面置換演算法。這種演算法的基本思想是:當需要淘汰乙個頁面時,總是選擇駐留主存時間最長的頁面進行淘汰,即先進入主存的頁面先淘汰。其理由是:最早調入主存的頁面不再被使用的可能性最大。 

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

fifo演算法還會產生當所分配的物理塊數增大而頁故障數不減反增的異常現象,這是由 belady於2023年發現,故稱為belady異常。只有fifo演算法可能出現belady 異常,而lru和opt演算法永遠不會出現belady異常。

3.最近最久未使用(lru)演算法:這種演算法的基本思想是:利用區域性性原理,根據乙個作業在執行過程中過去的頁面訪問歷史來推測未來的行為。它認為過去一段時間裡不曾被訪問過的頁面,在最近的將來可能也不會再被訪問。所以,這種演算法的實質是:當需要淘汰乙個頁面時,總是選擇在最近一段時間內最久不用的頁面予以淘汰。注意:記憶體的頁面中「最老「的頁面,會被新的網頁直接覆蓋,而不是「最老「的頁面先出隊,然後新的網頁從隊尾入隊。

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

實際上,lru演算法根據各頁以前的情況,是「向前看」的,而最佳置換演算法則根據各頁以後的使用情況,是「向後看」的。

***lru效能較好,但需要暫存器和棧的硬體支援。lru是堆疊類的演算法。理論上可以證明,堆疊類演算法不可能出現belady異常。fifo演算法基於佇列實現,不是堆疊類演算法。

lru演算法的效能接近於opt,但是實現起來比較困難,且開銷大;fifo演算法實現簡單,但效能差。所以作業系統的設計者嘗試了很多演算法,試圖用比較小的開銷接近lru的效能,這類演算法都是clock演算法的變體。

簡單的clock演算法是給每一幀關聯乙個附加位,稱為使用位。當某一頁眉次裝入主存時,該幀的使用位設定為1;當該頁隨後再被訪問到時,它的使用位也被置為1。對於頁替換演算法,用於替換的候選幀集合看做乙個迴圈緩衝區,並且有乙個指標與之相關聯。當某一頁被替換時,該指標被設定成指向緩衝區中的下一幀。當需要替換一頁時,作業系統掃瞄緩衝區,以查詢使用位被置為0的一幀。每當遇到乙個使用位為1的幀時,作業系統就將該位重新置為0;如果在這個過程開始時,緩衝區中所有幀的使用位均為0,則選擇遇到的第乙個幀替換;如果所有幀的使用位均為1,則指標在緩衝區中完整地迴圈一周,把所有使用位都置為0,並且停留在最初的位置上,替換該幀中的頁。由於該演算法迴圈地檢查各頁面的情況,故稱為clock演算法,又稱為最近未用(not recently used, nru)演算法。

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

最近未被訪問,也未被修改(u=0, m=0)。

最近被訪問,但未被修改(u=1, m=0)。

最近未被訪問,但被修改(u=0, m=1)。

最近被訪問,被修改(u=1, m=1)。

演算法執行如下操作步驟:

從指標的當前位置開始,掃瞄幀緩衝區。在這次掃瞄過程中,對使用位不做任何修改。選擇遇到的第乙個幀(u=0, m=0)用於替換。

如果第1)步失敗,則重新掃瞄,查詢(u=0, m=1)的幀。選擇遇到的第乙個這樣的幀用於替換。在這個掃瞄過程中,對每個跳過的幀,把它的使用位設定成0。

如果第2)步失敗,指標將回到它的最初位置,並且集合中所有幀的使用位均為0。重複第1步,並且如果有必要,重複第2步。這樣將可以找到供替換的幀。

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

例題:*在5個頁框上使用lru頁面替換演算法,當頁框初始為空時,引用序列為0、1、7、8、6、2、3、7、2、9、8、1、0、2,系統將發生(c)次缺頁

a、13            b、12           c、11          d、8

程式設計思路: lru是堆疊類的演算法,最後訪問的頁面放在棧頂,可以得到答案為c。

1,用結構體成員記錄訪問的順序,換頁時選取times最大的那個替換掉。

struct lru ;記錄訪問次序

struct queueqe;

(1)佇列未滿時,依次新增新訪問的頁面,並qe.p[i++].times++

(2)佇列滿了 a, 新訪問的頁面在佇列中,times設為0,之前在它前面的lru.times++

b, 新訪問的頁面不在佇列中,需替換掉times最大的頁面,並設新頁面times=0,對列中其它頁面times++

2,用佇列中存放的位置表示最後訪問時間(用線性表涉及大量元素移動,用鍊錶好些)

佇列未滿時,依次壓入;佇列滿,則檢視對列中是否存在,若存在,將其移動到隊尾,若不存在,刪除隊首頁面,並在隊尾加入新頁面。

頁面置換演算法

常用的頁面置換演算法有三種 先進先出演算法fifo first in first out 該演算法的基本思想是首先淘汰那些駐留在主存時間最長的頁面。最近最久未用演算法 lru 該演算法的基本思想是 如果某一頁被訪問了,那麼它很可能馬上又被訪問 反之,如果某一頁很久沒被訪問,那麼最近也不會再訪問。lr...

頁面置換演算法

include using namespace std int process 100 頁面佇列 int memory 3 塊數 int optqueue 100 opt演算法的佇列 int fifoqueue 100 fifo演算法佇列 int lruqueue 100 lru演算法佇列 int ...

頁面置換演算法

位址對映過程中,若在頁面中發現所要訪問的頁面不再記憶體中,則產生缺頁中斷。當發生缺頁中斷時作業系統必須在記憶體選擇乙個頁面將其移出記憶體,以便為即將調入的頁面讓出空間。而用來選擇淘汰哪一頁的規則叫做頁面置換演算法。常見的置換演算法有 1 最佳置換演算法 opt 理想置換演算法 這是一種理想情況下的頁...