本来已经写好一份 Java 版的了,然后又帮女朋友写了一份 Python 版,啊哈哈
再次更新~帮女票舍友们顺便写了份 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