1. 程式人生 > >作業系統頁面排程演算法

作業系統頁面排程演算法

演算法由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