微信公眾號關注我,更多計算機知識告訴你!
一.理論
FIFO:先進先出調度算法
LRU:最近最久未使用調度算法
兩者都是緩存調度算法,經常用作內存的頁面置換算法。
打一個比方,幫助你理解。你有很多的書,比如說10000本。由於你的書實在太多了,你只能放在地下室里面。你看書的時候不會在地下室看書,而是在書房看書。每次,你想看書都必須跑到地下室去找出來你想看的書,然后抱回來放到書桌上,之后才開始看。還有就是,有一些書你會反復的看,今天看了也許過幾天又要看。總之,你自己是不知道你哪天會需要看哪本書的。你的老師每天下課的時候會給你布置一個書單,讓你晚上回去去看哪本書。(假設你老師讓你看的書在你的地下室里面都有)跑地下室當然是非常麻煩的,所以你希望你的經常看的那些書最好放在書桌上。但是你的書房的書桌同時只能擺放10本書(這個是假設的啊)。那么,問題來了。到底把哪些說留在書桌上最好呢?這里說的最好,就是說你盡量少的跑地下室去找書。為了解決這個問題,人們發明了很多的算法。
其中,比較常見的就是上面這兩種:FIFO算法和LRU算法。
FIFO算法:
很簡單,我把書桌上的10本書按照放置時間先后堆放成一堆。這里的放置時間,就是說這本書在我的書桌上放了幾天了。每次要看書的時候,我先在書桌上找,找到就直接可以讀了。讀完之后放回原來的位置就可以,不打亂順序。如果書桌上面沒有我要讀的書,就去地下室找。找來之后,我就把書桌上放的時間最長的那本(也就是書堆里面最下面的那本書)放回地下室。然后把我今天需要看的這本書放在書堆的最上面。
LRU算法:
也不難,我把書桌上的10本書按照閱讀時間先后堆放成一堆。這里的閱讀時間,就是說我最近一次讀這本書是幾天之前。每次要看書的時候,我先在書桌上找,找到就直接可以讀了。讀完之后放在書堆的最上面。如果書桌上面沒有我要讀的書,就去地下室找。找來之后,我就把書桌上最久沒有閱讀的那本(也就是書堆里面最下面的那本書)放回地下室。然后把我今天需要看的這本書放在書堆的最上面。上面這個比方,相信你可以看明白吧。這里的地下室對應內存,書桌對應緩存,書對應頁面。
二.缺頁次數
在一個采用頁式虛擬存儲管理的系統中,有一用戶作業,它依次要訪問的頁面序列是1,2,3,4,1,2,5,1,2,3,4,5.假定分配給該作業的頁數為3且作業初始時未裝載頁面,那么采用FIFO調度算法產生的缺頁中斷數為多少,采用LRU調度算法產生的缺頁中斷數為多少?
FIFO算法:(First In First Out),先進先出,一般看到這類思想,首先想到的數據結構應當是隊列,但是我們這里最好是用vector,因為調頁過程中需要遍歷隊列檢查該頁是否已存在,當算法的存儲結構是隊列或棧,但實現過程中需要經常遍歷全隊列或全棧的內容時,最好用vector,這是《劍指Offer》面試題25給我的啟發。給出一個訪問序列的模擬算法到此應該非常簡單了,為了節省時間,下面僅給出題目計算步驟,代碼今后再補。
訪問序列:1,2,3,4,1,2,5,1,2,3,4,5
1,2,3先調入內存,內存結構:3 2 1 缺頁次數:3
4調入內存,1調出, 內存結構:4 3 2 缺頁次數:4
1調入內存,2調出, 內存結構:1 4 3 缺頁次數:5
2調入內存,3調出, 內存結構:2 1 4 缺頁次數:6
5調入內存,4調出, 內存結構:5 2 1 缺頁次數:7
1存在,內存結構不改變
2存在,內存結構不改變
3調入內存,1調出, 內存結構:3 5 2 缺頁次數:8
4調入內存,2調出, 內存結構:4 3 5 缺頁次數:9
5存在,內存結構不改變
共缺頁9次,缺頁中斷率 = 缺頁中斷次數 / 總訪問頁數 = 9 / 12
LRU算法:最近最少使用(Least Recently Used),先看一下調頁過程
訪問序列:1,2,3,4,1,2,5,1,2,3,4,5
1,2,3先調入內存,內存結構:3 2 1 缺頁次數:3
4調入內存,1調出, 內存結構:4 3 2 缺頁次數:4
1調入內存,2調出, 內存結構:1 4 3 缺頁次數:5
2調入內存,3調出, 內存結構:2 1 4 缺頁次數:6
5調入內存,4調出, 內存結構:5 2 1 缺頁次數:7
到這一步其實和FIFO並沒有區別
1調入內存,由於內存中存在1,故沒有缺頁中斷,但由於1最近被訪問過,所以要將其位置調換,
使它最后一個被淘汰,內存結構:1 5 2
2調入內存,沒有缺頁中斷,但內存位置要變化,內存結構:2 1 5
3調入內存,5調出, 內存結構:3 2 1 缺頁次數:8
4調入內存,1調出, 內存結構:4 3 2 缺頁次數:9
5調入內存,2調出, 內存結構:5 4 3 缺頁次數:10
共缺頁10次,缺頁中斷率:10/12