1. 程式人生 > >【python學習筆記】3:LRU(最近最少使用頁面置換)演算法

【python學習筆記】3:LRU(最近最少使用頁面置換)演算法

題目描述:一程序剛獲得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::]

就會發現得不到想要的結果了。