程序執行時,若其訪問的頁面不在記憶體而需將其調入,但記憶體已無空閒空間時,就需要從記憶體中調出一頁程式或資料,送入磁碟的對換區。
選擇調出頁面的演算法就稱為頁面置換演算法。好的頁面置換演算法應有較低的頁面更換頻率,也就是說,應將以後不會再訪問或者以後較長時間內不會再訪問的頁面先調出。
常見的置換演算法有以下四種。
最佳(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。
訪問頁面70
1203
0423
0321
2017
01物理塊177
7222
227物理塊200
0040
00物理塊311
3331
1缺頁否√√
√√√√
√√圖3-26 利用最佳置換演算法時的置換圖
優先淘汰最早進入記憶體的頁面,亦即在記憶體中駐留時間最久的頁面。該演算法實現簡單,只需把調入記憶體的頁面根據先後次序鏈結成佇列,設定乙個指標總指向最早的頁面。但該演算法與程序實際執行時的規律不適應,因為在程序中,有的頁面經常被訪問。
訪問頁面70
1203
0423
0321
2017
01物理塊177
7222
4440
0077
7物理塊200
0333
2221
1100
物理塊311
1000
3332
221缺頁否√√
√√√√
√√√√
√√√√
√圖3-27 利用fifo置換演算法時的置換圖
這裡仍用上面的例項,釆用fifo演算法進行頁面置換。程序訪問頁面2時,把最早進入記憶體的頁面7換出。然後訪問頁面3時,再把2, 0, 1中最先進入記憶體的頁換出。由圖 3-27可以看出,利用fifo演算法時進行了 12次頁面置換,比最佳置換演算法正好多一倍。
fifo演算法還會產生當所分配的物理塊數增大而頁故障數不減反增的異常現象,這是由 belady於2023年發現,故稱為belady異常,如圖3-28所示。只有fifo演算法可能出現belady 異常,而lru和opt演算法永遠不會出現belady異常。
訪問頁面12
3412
5123
45物理塊111
1444
5,5'
5物理塊222
2111
33物理塊333
3222
4缺頁否√√
√√√√
√√√1
1155
5544
物理塊2*22
2211
115物理塊3*33
3322
22物理塊4*44
4433
3缺頁否√√
√√√√
√√√圖 3-28 belady 異常
選擇最近最長時間未訪問過的頁面予以淘汰,它認為過去一段時間內未訪問過的頁面,在最近的將來可能也不會被訪問。該演算法為每個頁面設定乙個訪問字段,來記錄頁面自上次被訪問以來所經歷的時間,淘汰頁面時選擇現有頁面中值最大的予以淘汰。
再對上面的例項釆用lru演算法進行頁面置換,如圖3-29所示。程序第一次對頁面2訪問時,將最近最久未被訪問的頁面7置換出去。然後訪問頁面3時,將最近最久未使用的頁面1換出。
訪問頁面70
1203
0423
0321
2017
01物理塊177
7224
4401
11物理塊200
0000
3330
0物理塊311
3322
2227
缺頁否√√√
√√√√
√√√√
√圖3-29 lru頁面置換演算法時的置換圖
在圖3-29中,前5次置換的情況與最佳置換演算法相同,但兩種演算法並無必然聯絡。實際上,lru演算法根據各頁以前的情況,是「向前看」的,而最佳置換演算法則根據各頁以後的使用情況,是「向後看」的。
lru效能較好,但需要暫存器和棧的硬體支援。lru是堆疊類的演算法。理論上可以證明,堆疊類演算法不可能出現belady異常。fifo演算法基於佇列實現,不是堆疊類演算法。
lru是最近最少使用頁面置換演算法(least recently used),也就是首先淘汰最長時間未被使用的頁面!
lfu是最近最不常用頁面置換演算法(least frequently used),也就是淘汰一定時期內被訪問次數最少的頁!
比如,第二種方法的時期t為10分鐘,如果每分鐘進行一次調頁,主存塊為3,若所需頁面走向為2 1 2 1 2 3 4
注意,當調頁面4時會發生缺頁中斷
若按lru演算法,應換頁面1(1頁面最久未被使用) 但按lfu演算法應換頁面3(十分鐘內,頁面3只使用了一次)
可見lru關鍵是看頁面最後一次被使用到發生排程的時間長短,
而lfu關鍵是看一定時間段內頁面被使用的頻率!
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演算法之處在於替換時首選沒有變化的頁。由於修改過的頁在被替換之前必須寫回,因而這樣做
會節省時間。
tcp套接字函式中( b )不會產生阻塞。
首先,伺服器端啟動程序,呼叫socket建立乙個基於tcp協議的流套接字描述符。
其次,服務程序呼叫bind命名套接字,將套接字描述符繫結到本地位址和本地埠上。
再次,伺服器端呼叫listen,開始偵聽客戶端的socket連線請求。
接下來阻塞,直到收到了客戶端的connect請求,呼叫accept進行相應。
因此,不阻塞bind和listen
頁面置換演算法
常用的頁面置換演算法有三種 先進先出演算法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 理想置換演算法 這是一種理想情況下的頁...