【南邮操作系统实验】页面置换算法(FIFO、LRU、OPT) Python 版

本来已经写好一份 Java 版的了,然后又帮女朋友写了一份 Python 版,啊哈哈

Java版戳这里

再次更新~帮女票舍友们顺便写了份 C++ 版的,啊哈哈
C++版戳这里

先进先出置换算法(FIFO)

# FIFO.py

framePageNum = input("请输入分配给该作业的物理页框块数:") # 物理页框块数
pageFrame = [None]*int(framePageNum)  # 物理页框
inputPages = input("请输入该作业的页面走向:")
pages = inputPages.split(" ")    # 页面走向
pageFrontNum = len(pages)        # 页面走向总次数

pageDesert = []     # 淘汰页面

pageMissNum = 0     # 缺页次数

count = 0;
helpNum = 0;
while(count < pageFrontNum):
    print("第" + str(count+1) + "次:" + pages[count])

    isMiss = True   # 是否缺页
    isEmpty = True  # 是否有空位
    isExist = False # 物理页框中是否存在本次页面走向

    # 判断物理页框中是否存在本次页面走向
    for page in pageFrame:
        if(pages[count] == page):
            isExist = True
    if(isExist == True):
        print("本次页面走向,页框中已经存在!")
        print("目前物理页框中页面走向为:", end="")
        for i in pageFrame:
            print(i,end=" ")
        print()
        print()
        count = count + 1
        continue

    # 判断物理页框中有无空位
    for page in pageFrame:
        if(page == None):
            isEmpty = True
            break
        else:
            isEmpty = False
    # 本次页面走向,物理页框中不存在,且有空位
    if(isExist == False and isEmpty == True):
        for n in range(len(pageFrame)):
            if(pageFrame[n] == None):
                pageFrame[n] = pages[count]
                break

    # 实现 FIFO 算法
    # 本次页面走向,物理页框中不存在,且没有空位
    if (isExist == False and isEmpty == False):
        pageDesert.append(pageFrame[helpNum%int(framePageNum)])
        print("本次淘汰页面:" + pages[count])
        pageFrame[helpNum%int(framePageNum)] = pages[count]
        helpNum = helpNum + 1

    # 计算缺页次数
    if(isMiss == True):
        pageMissNum = pageMissNum + 1

    print("目前物理页框中页面走向为:", end="")
    for i in pageFrame:
        print(i, end=" ")
    print()
    print()
    count = count + 1

print("缺页次数:" + str(pageMissNum) + "次")
print("一共调用:" + str(pageFrontNum) + "次")
print("缺页中断率:" + str(pageMissNum/pageFrontNum*100) + "%")
print("淘汰页面:", end="")
for i in pageDesert:
    print(i, end=" ")

运行效果:

请输入分配给该作业的物理页框块数:3
请输入该作业的页面走向:2 3 2 1 5 2 4 5 3 2 5 2
第1次:2
目前物理页框中页面走向为:2 None None 

第2次:3
目前物理页框中页面走向为:2 3 None 

第3次:2
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:2 3 None 

第4次:1
目前物理页框中页面走向为:2 3 1 

第5次:5
本次淘汰页面:5
目前物理页框中页面走向为:5 3 1 

第6次:2
本次淘汰页面:2
目前物理页框中页面走向为:5 2 1 

第7次:4
本次淘汰页面:4
目前物理页框中页面走向为:5 2 4 

第8次:5
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:5 2 4 

第9次:3
本次淘汰页面:3
目前物理页框中页面走向为:3 2 4 

第10次:2
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:3 2 4 

第11次:5
本次淘汰页面:5
目前物理页框中页面走向为:3 5 4 

第12次:2
本次淘汰页面:2
目前物理页框中页面走向为:3 5 2 

缺页次数:9次
一共调用:12次
缺页中断率:75.0%
淘汰页面:2 3 1 5 2 4 

最近最久未使用置换算法(LRU)

# LRU.py

framePageNum = input("请输入分配给该作业的物理页框块数:") # 物理页框块数
pageFrame = [None]*int(framePageNum)  # 物理页框
inputPages = input("请输入该作业的页面走向:")
pages = inputPages.split(" ")    # 页面走向
pageFrontNum = len(pages)        # 页面走向总次数

pageDesert = []     # 淘汰页面

pageMissNum = 0     # 缺页次数

count = 0;
helpNum = 0;
while(count < pageFrontNum):
    print("第" + str(count+1) + "次:" + pages[count])

    isMiss = True   # 是否缺页
    isEmpty = True  # 是否有空位
    isExist = False # 物理页框中是否存在本次页面走向

    # 判断物理页框中是否存在本次页面走向
    for page in pageFrame:
        if(pages[count] == page):
            isExist = True
    if(isExist == True):
        print("本次页面走向,页框中已经存在!")
        print("目前物理页框中页面走向为:", end="")
        for i in pageFrame:
            print(i,end=" ")
        print()
        print()
        count = count + 1
        continue

    # 判断物理页框中有无空位
    for page in pageFrame:
        if(page == None):
            isEmpty = True
            break
        else:
            isEmpty = False
    # 本次页面走向,物理页框中不存在,且有空位
    if(isExist == False and isEmpty == True):
        for n in range(len(pageFrame)):
            if(pageFrame[n] == None):
                pageFrame[n] = pages[count]
                break

    # 本次页面走向,物理页框中不存在,且没有空位
    # 实现 LRU 算法
    if(isExist == False and isEmpty == False):
        for n in range(len(pageFrame)):
            if(pages[count-int(framePageNum)] == pageFrame[n]):
                pageDesert.append(pageFrame[n])
                pageFrame[n] = pages[count]

    # 计算缺页次数
    if(isMiss == True):
        pageMissNum = pageMissNum + 1

    print("目前物理页框中页面走向为:", end="")
    for i in pageFrame:
        print(i, end=" ")
    print()
    print()
    count = count + 1

print("缺页次数:" + str(pageMissNum) + "次")
print("一共调用:" + str(pageFrontNum) + "次")
print("缺页中断率:" + str(pageMissNum/pageFrontNum*100) + "%")
print("淘汰页面:", end="")
for i in pageDesert:
    print(i, end=" ")

运行结果

请输入分配给该作业的物理页框块数:3
请输入该作业的页面走向:2 3 2 1 5 2 4 5 3 2 5 2
第1次:2
目前物理页框中页面走向为:2 None None 

第2次:3
目前物理页框中页面走向为:2 3 None 

第3次:2
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:2 3 None 

第4次:1
目前物理页框中页面走向为:2 3 1 

第5次:5
目前物理页框中页面走向为:2 5 1 

第6次:2
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:2 5 1 

第7次:4
目前物理页框中页面走向为:2 5 4 

第8次:5
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:2 5 4 

第9次:3
目前物理页框中页面走向为:3 5 4 

第10次:2
目前物理页框中页面走向为:3 5 2 

第11次:5
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:3 5 2 

第12次:2
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:3 5 2 

缺页次数:7次
一共调用:12次
缺页中断率:58.333333333333336%
淘汰页面:3 1 2 4 

最佳置换算法(OPT)

# OPT.py

framePageNum = input("请输入分配给该作业的物理页框块数:") # 物理页框块数
pageFrame = [None]*int(framePageNum)  # 物理页框
inputPages = input("请输入该作业的页面走向:")
pages = inputPages.split(" ")    # 页面走向
pageFrontNum = len(pages)        # 页面走向总次数
pageDesert = []     # 淘汰页面
pageMissNum = 0     # 缺页次数

count = 0;
helpNum = 0;
while(count < pageFrontNum):
    print("第" + str(count+1) + "次:" + pages[count])

    isMiss = True   # 是否缺页
    isEmpty = True  # 是否有空位
    isExist = False # 物理页框中是否存在本次页面走向

    # 判断物理页框中是否存在本次页面走向
    for page in pageFrame:
        if(pages[count] == page):
            isExist = True
    if(isExist == True):
        print("本次页面走向,页框中已经存在!")
        print("目前物理页框中页面走向为:", end="")
        for i in pageFrame:
            print(i,end=" ")
        print()
        print()
        count = count + 1
        continue
    # 判断物理页框中有无空位
    for page in pageFrame:
        if(page == None):
            isEmpty = True
            break
        else:
            isEmpty = False
    # 本次页面走向,物理页框中不存在,且有空位
    if(isExist == False and isEmpty == True):
        for n in range(len(pageFrame)):
            if(pageFrame[n] == None):
                pageFrame[n] = pages[count]
                break
    # 本次页面走向,物理页框中不存在,且没有空位
    # 实现 OPT 算法
    if(isExist == False and isEmpty == False):
        isExistEle = False  # 是否存在未来不再出现的元素
        isFound = False     # 是否找到未来下标的元素
        frameIndex = 0      # 记录的物理页框下标
        helpStack = []      # 辅助栈
        # 寻找将来不再出现的,存在于当前物理页框中的元素
        for i in range(len(pageFrame)):
            for j in range(count, pageFrontNum):
                if(pageFrame[i] == pages[j]): # 若当前物理页框中,不存在未来不再出现的元素
                    helpStack.append(j)       # 记录当前未来将遇见的下标
                    isFound = True            # 找到未来下标的元素
            # 当前物理页框中,存在未来不再出现的元素
            if(not isFound):
                frameIndex = i      # 记录当前物理页框
                isExistEle = True   # 存在未来不再出现的元素
                break
            isFound = False

        if(isExistEle): # 存在未来不再出现的元素
            pageDesert.append(pageFrame[frameIndex]) # 淘汰页面入栈
            pageFrame[frameIndex] = pages[count]
        else: # 存在未来不再出现的元素
            t = 0
            for i in helpStack:
                if(t < i):
                    t = i
            for i in range(len(pageFrame)):
                if(pageFrame[i] == pages[t]):
                    pageDesert.append(pageFrame[i])
                    pageFrame[i] = pages[count]

    # 计算缺页次数
    if(isMiss == True):
        pageMissNum = pageMissNum + 1

    print("目前物理页框中页面走向为:", end="")
    for i in pageFrame:
        print(i, end=" ")
    print()
    print()
    count = count + 1

print("缺页次数:" + str(pageMissNum) + "次")
print("一共调用:" + str(pageFrontNum) + "次")
print("缺页中断率:" + str(pageMissNum/pageFrontNum*100) + "%")
print("淘汰页面:", end="")
for i in pageDesert:
    print(i, end=" ")

运行效果:

请输入分配给该作业的物理页框块数:3
请输入该作业的页面走向:2 3 2 1 5 2 4 5 3 2 5 2
第1次:2
目前物理页框中页面走向为:2 None None 

第2次:3
目前物理页框中页面走向为:2 3 None 

第3次:2
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:2 3 None 

第4次:1
目前物理页框中页面走向为:2 3 1 

第5次:5
目前物理页框中页面走向为:2 3 5 

第6次:2
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:2 3 5 

第7次:4
目前物理页框中页面走向为:4 3 5 

第8次:5
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:4 3 5 

第9次:3
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:4 3 5 

第10次:2
目前物理页框中页面走向为:2 3 5 

第11次:5
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:2 3 5 

第12次:2
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:2 3 5 

缺页次数:6次
一共调用:12次
缺页中断率:50.0%
淘汰页面:1 2 4 
  • 4
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萌宅鹿同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值