作業系統頁面排程演算法
阿新 • • 發佈:2019-01-26
演算法由python實現
1.先進先出置換演算法
該演算法是置換最早出現在stack裡的頁面,是最簡單的頁面置換演算法,沒有考慮程式的區域性性原理
在這裡設定stack的大小為3,為了模擬刪除和插入一個頁面,用了pop和insert方法,可以直接用p[locate] = value
def FIFC(pageList): p = [] locate = 0 num = 0 for i in pageList: if i not in p: if len(p) < 3: p.append(i) else: print ('current pageStack content :', p) p.pop(locate) p.insert(locate,i) locate = (locate + 1) % 3 num += 1 print ('current pageStack content :', p) print ('中斷次數: {},頁面置換{}次, 缺頁率{}'.format(num,num-3,num/len(pageList) * 100))
2.最近最久為使用演算法
這個演算法考慮了程式的區域性性原理,用最近的過去,模擬未來.
函式f是一個輔助函式,在開始更改每一個頁面的未被訪問的時間時候,用for,需要兩次,使用這函式,直接呼叫map,用times來記錄當前stack裡的頁面多久未被訪問,數字越大,就是越久未被訪問
def f(enumVlaue): if enumVlaue[0] == INDEX: enumVlaue[1] = 0 else: enumVlaue[1] += 1 return enumVlaue[1] def LRU(pageList): p = [] times = [0 for i in range(3)] num = 0 for i in pageList: if i not in p: if len(p) < 3: p.append(i) for j in range(len(p)-1): times[j] += 1 else: global INDEX INDEX = times.index(max(times)) print ('current pageStack content :{} current times : {}'.format(p,times)) p.pop(INDEX) p.insert(INDEX,i) times = list(map(f,[list(i) for i in enumerate(times)])) num += 1 else: INDEX = p.index(i) times = list(map(f,[list(i) for i in enumerate(times)])) print ('current pageStack content :',p) print ('中斷次數: {},頁面置換{}次, 缺頁率{}'.format(num,num-3,num/len(pageList) * 100))
3.最佳置換演算法
這個演算法只是理論上的,無法實踐,不知道後面頁面的序列,演算法從未來考慮當前
頁面呼叫是數字表示def OPT(pageList): p = [] num = 0 times = [0 for i in range(3)] for i in pageStack: if i not in p: if len(p) < 3: p.append(i) else: s = 0 loc = pageList.index(i) for j in pageList[loc:]: if j in p: times[p.index(j)] = 1 s += 1 if s == 2: break locate = times.index(0) p.pop(locate) p.insert(locate,i) times = [0 for i in range(3)] print ('current pageStack: content :',p) num += 1 print ('中斷次數: {},頁面置換{}次, 缺頁率{}'.format(num,num-3,num/len(pageList) * 100))
附一張執行最近最久未使用置換演算法 截圖
輸入的資料是: 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1