【python學習筆記】3:LRU(最近最少使用頁面置換)演算法
阿新 • • 發佈:2019-01-31
題目描述:一程序剛獲得3個主存塊的使用權,若該程序訪問頁面的次序是1,2,3,4,1,2,5,1,2,3,4,5。當採用LRU演算法時發生的缺頁次數是多少?
LRU是最近最少使用頁面置換演算法,該演算法用一個開放的棧來儲存當前正在使用的各個頁面號。當有一個新的頁面要被訪問時,就將該頁面號加入棧頂(如果分配的記憶體不夠,就將棧底頁面號刪除,其它頁面號前移以給新頁面騰出位置)。當要訪問的頁面已經在棧中時,就只要將這個頁面移到棧頂,其它頁面維持順序即可。
缺頁中斷就是要訪問的頁不在主存,也就是本題中的開放的棧中沒有儲存要訪問的頁面號的情況。
*列表切片模擬LRU演算法
List_flora=[1,2,3,4,1,2,5,1,2,3,4,5] #存放頁面訪問次序的列表 lzh=[] #列表lzh最多(在填滿後不多不少)3個元素,用來實現LRU演算法 count=0 #count用於計算缺頁次數 flag=True #True表示缺頁 print("三個主存塊的資料變化情況:") for i in List_flora: #i從List_flora的第一個元素開始 if i not in lzh: #如果i不在lzh中,即缺頁 flag=True #表示缺頁 if len(lzh)<3: #如果lzh的長度還沒到達3 lzh[len(lzh)::]=[i] #就在其尾部新增i else: #如果lzh的長度已經到達3了 lzh[0:2:]=lzh[1:3:] #將lzh[1]和lzh[2]複製到lzh[0]和lzh[1] lzh[2::]=[i] #將i放入lzh[2]的位置 count+=1 #缺頁的,記錄之 else: #如果i在lzh中,即不缺頁 flag=False #表示不缺頁 lzh[lzh.index(i):len(lzh)-1:]=lzh[lzh.index(i)+1::] #將i之後的元素都複製到i開始向後的位置,並在最後留一個空位保證不改變lzh長度 lzh[len(lzh)-1::]=[i] #將最後一個元素用i覆蓋 print(lzh,"缺頁了" if flag is True else "不缺頁") print("LRU演算法結束,總的缺頁次數為",count)
執行結果:
一開始還以為python中沒有bool型變數,原來是這裡的true和false要寫成True和False才行。
在切片中,如果對切片所得的東西賦值,就能改變原列表中該位置的資料。在這樣的賦值中應儘量保證左右兩側的list長度一致,如果將
lzh[lzh.index(i):len(lzh)-1:]=lzh[lzh.index(i)+1::]
改為
lzh[lzh.index(i)::]=lzh[lzh.index(i)+1::]
就會發現得不到想要的結果了。