Python实现页面置换算法

FIFO LRU OPT


页面置换——FIFO、LRU、OPT

  • Python实现页面置换算法
  • 页面置换算法:
  • 一、FIFO(先进先出置换算法)
    • 1.算法解析
      • 算法原理:当需要淘汰一个页面时,总是选择驻留主存时间最长的页面进行淘汰,即先进入主存的页面先淘汰。其理由是:最早调入主存的页面不再被使用的可能性最大。
    • 2.代码实现
  • 二、LRU(最近最近未使用算法)
    • 1.算法解析
      • 算法原理利用局部性原理,根据一个作业在执行过程中过去的页面访问历史来推测未来的行为。它认为过去一段时间里不曾被访问过的页面,在最近的将来可能也不会再被访问。所以,这种算法的实质是:当需要淘汰一个页面时,总是选择在最近一段时间内最久不用的页面予以淘汰。
    • 2.代码实现
  • 三、OPT(最佳置换算法)
    • 1.算法解析
      • 算法原理从主存中移出永远不再需要的页面;如无这样的页面存在,则选择最长时间不需要访问的页面。于所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。
    • 2.代码实现
  • 算法全部代码下载
  • GUI代码下载

页面置换算法:

在地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断。当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。


一、FIFO(先进先出置换算法)

1.算法解析

算法原理:当需要淘汰一个页面时,总是选择驻留主存时间最长的页面进行淘汰,即先进入主存的页面先淘汰。其理由是:最早调入主存的页面不再被使用的可能性最大。

如图所示(示例):

2.代码实现

def FIFO(page,arr):print("FIFO页面置换过程为:" )result=[]loss_page=0sum=0for item in arr:if len(result)==page:for j in range(sum, len(arr)):if arr[j] in result:print("no exchange")print("第%i页"%j,end="")print(result)else:del result[0]result.append(arr[j])loss_page += 1print("第%i页" % j,end="")print(result)breakelif item in result:print("no exchange")print("第%i页" % sum,end="")print(result)sum+=1else:result.append(item)loss_page+=1print("第%i页" % sum,end="")print(result)sum+=1result_page=float((loss_page)/len(arr))print("FIFO缺页率为:%.2f"%result_page)

二、LRU(最近最近未使用算法)

1.算法解析

算法原理利用局部性原理,根据一个作业在执行过程中过去的页面访问历史来推测未来的行为。它认为过去一段时间里不曾被访问过的页面,在最近的将来可能也不会再被访问。所以,这种算法的实质是:当需要淘汰一个页面时,总是选择在最近一段时间内最久不用的页面予以淘汰。

2.代码实现

代码如下(示例):

def LRU(page,arr):print(arr)print("LRU页面置换过程为:")result = []loss_page = 0sum = 0for item in arr:if len(result)==page:for j in range(sum, len(arr)):if arr[j] in result:print("no exchange")print("第%i页" % j, end="")p=result[result.index(arr[j])]del result[result.index(arr[j])]result.insert(0,p)print(result)else:del result[-1]result.insert(0,arr[j])loss_page += 1print("第%i页" % j, end="")print(result)breakelif item in result:print("no exchange")p = result[result.index(item)]del result[result.index(item)]result.insert(0, p)print("第%i页" % sum, end="")print(result)sum+=1else:result.insert(0,item)loss_page+=1print("第%i页" % sum, end="")print(result)sum+=1result_page=float((loss_page)/len(arr))print("LRU缺页率为:%.2f"%result_page)

三、OPT(最佳置换算法)

1.算法解析

算法原理从主存中移出永远不再需要的页面;如无这样的页面存在,则选择最长时间不需要访问的页面。于所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。

2.代码实现

def OPT(page,arr):print("OPT页面置换过程为:")result = []loss_page = 0sum = 0for item in arr:if len(result)==page:for j in range(sum, len(arr)):if arr[j] in result:print("no exchange")print("第%i页" % j, end="")p = result[result.index(arr[j])]del result[result.index(arr[j])]result.insert(0, p)print(result)else:result_number=bidui(arr[j:len(arr)],result)for o in result:if result_number==o:result.remove(o)result.append(arr[j])loss_page += 1print("第%i页" % j, end="")print(result)breakelif item in result:print("no exchange")print("第%i页" % sum, end="")print(result)sum+=1else:result.append(item)loss_page+=1print("第%i页" % sum, end="")print(result)sum+=1result_page=float((loss_page)/len(arr))print("OPT缺页率为:%.2f"%result_page)

全部代码如下


算法全部代码下载

import random
def FIFO(page,arr):print("FIFO页面置换过程为:" )result=[]loss_page=0sum=0for item in arr:if len(result)==page:for j in range(sum, len(arr)):if arr[j] in result:print("no exchange")print("第%i页"%j,end="")print(result)else:del result[0]result.append(arr[j])loss_page += 1print("第%i页" % j,end="")print(result)breakelif item in result:print("no exchange")print("第%i页" % sum,end="")print(result)sum+=1else:result.append(item)loss_page+=1print("第%i页" % sum,end="")print(result)sum+=1result_page=float((loss_page)/len(arr))print("FIFO缺页率为:%.2f"%result_page)def LRU(page,arr):print(arr)print("LRU页面置换过程为:")result = []loss_page = 0sum = 0for item in arr:if len(result)==page:for j in range(sum, len(arr)):if arr[j] in result:print("no exchange")print("第%i页" % j, end="")p=result[result.index(arr[j])]del result[result.index(arr[j])]result.insert(0,p)print(result)else:del result[-1]result.insert(0,arr[j])loss_page += 1print("第%i页" % j, end="")print(result)breakelif item in result:print("no exchange")p = result[result.index(item)]del result[result.index(item)]result.insert(0, p)print("第%i页" % sum, end="")print(result)sum+=1else:result.insert(0,item)loss_page+=1print("第%i页" % sum, end="")print(result)sum+=1result_page=float((loss_page)/len(arr))print("LRU缺页率为:%.2f"%result_page)def bidui(param, result):list_1 = {}for item in param:list_1[item]=param.index(item)for i in result:if i not in list_1.keys():return ielse:passreturn list(list_1.keys())[list(list_1.values()).index(max(list_1.values()))]
def OPT(page,arr):print("OPT页面置换过程为:")result = []loss_page = 0sum = 0for item in arr:if len(result)==page:for j in range(sum, len(arr)):if arr[j] in result:print("no exchange")print("第%i页" % j, end="")p = result[result.index(arr[j])]del result[result.index(arr[j])]result.insert(0, p)print(result)else:result_number=bidui(arr[j:len(arr)],result)for o in result:if result_number==o:result.remove(o)result.append(arr[j])loss_page += 1print("第%i页" % j, end="")print(result)breakelif item in result:print("no exchange")print("第%i页" % sum, end="")print(result)sum+=1else:result.append(item)loss_page+=1print("第%i页" % sum, end="")print(result)sum+=1result_page=float((loss_page)/len(arr))print("OPT缺页率为:%.2f"%result_page)if __name__ == '__main__':arr=[]number1=int(input("请输入页面流长度"))for i in range(number1):arr.append(random.randint(1,number1))print(arr)number=int(input("请输入物理块儿数"))FIFO(number,arr)LRU(number, arr)OPT(number,arr)

另附GUI算法实现界面如图所示:

GUI代码下载

# * -*- coding:utf-8 -*-
# * @Author: Go-getter Ram
import random
from tkinter import *
import timearr = []
for i in range(20):arr.append(random.randint(1, 5))
def gettime():timestr = time.strftime("%H:%M:%S") # 获取当前的时间并转化为字符串lb.configure(text=timestr)   # 重新设置标签文本root.after(1000,gettime) # 每隔1s调用函数 gettime 自身获取时间root = Tk()
root.title('FIFO,OPT,LRU页面置换算法')
lb = Label(root,text='',fg='blue',font=("黑体",24))
lb.pack()
root.geometry('800x600') # 这里的乘号不是 * ,而是小写英文字母 x
gettime()def run1():page=int(inp.get())txt.insert(END, "FIFO页面置换过程为:\n")result = []loss_page = 0sum = 0for item in arr:if len(result) == page:for j in range(sum, len(arr)):if arr[j] in result:txt.insert(END, "no exchange\n")else:del result[0]result.append(arr[j])loss_page += 1txt.insert(END, "\n")txt.insert(END, result)breakelif item in result:txt.insert(END, "no exchange\n")txt.insert(END, result)sum += 1else:result.append(item)loss_page += 1sum += 1txt.insert(END, "\n")txt.insert(END, result)result_page = float((loss_page + page) / len(arr))txt.insert(END, "FIFO缺页率为:%.2f\n" % result_page)txt.insert(END, "\n")inp.delete(0, END)  # 清空输入
def run2():page = int(inp.get())txt.insert(END, "LRU页面置换过程为:\n")result = []loss_page = 0sum = 0for item in arr:if len(result) == page:for j in range(sum, len(arr)):if arr[j] in result:txt.insert(END, "no exchange\n")p = result[result.index(arr[j])]del result[result.index(arr[j])]result.insert(0, p)txt.insert(END, "\n")txt.insert(END, result)else:del result[-1]result.insert(0, arr[j])loss_page += 1txt.insert(END, "\n")txt.insert(END, result)breakelif item in result:txt.insert(END, "no exchange\n")p = result[result.index(item)]del result[result.index(item)]result.insert(0, p)txt.insert(END, "\n")txt.insert(END, result)sum += 1else:result.insert(0, item)loss_page += 1sum += 1txt.insert(END, "\n")txt.insert(END, result)result_page = float((loss_page) / len(arr))txt.insert(END, "LRU缺页率为:%.2f" % result_page)txt.insert(END,"\n")inp.delete(0, END)  # 清空输入
def bidui(param, result):list_1 = {}for item in param:list_1[item]=param.index(item)for i in result:if i not in list_1.keys():return ielse:passreturn list(list_1.keys())[list(list_1.values()).index(max(list_1.values()))]
def run3():page = int(inp.get())txt.insert(END, "OPT页面置换过程为:\n")result = []loss_page = 0sum = 0for item in arr:if len(result) == page:for j in range(sum, len(arr)):if arr[j] in result:txt.insert(END, "no exchange\n")p = result[result.index(arr[j])]del result[result.index(arr[j])]result.insert(0, p)txt.insert(END, result)txt.insert(END, "\n")else:result_number = bidui(arr[j:len(arr)], result)for o in result:if result_number == o:result.remove(o)result.append(arr[j])loss_page += 1txt.insert(END, result)txt.insert(END, "\n")breakelif item in result:txt.insert(END, "no exchange\n")txt.insert(END, result)txt.insert(END, "\n")sum += 1else:result.append(item)loss_page += 1sum += 1txt.insert(END, result)txt.insert(END, "\n")result_page = float((loss_page) / len(arr))txt.insert(END, "OPT缺页率为:%.2f" % result_page)txt.insert(END,"\n")inp.delete(0, END)  # 清空输入lb1 = Label(root, text='请输入物理块儿数:按下面三个按钮之一进行算法验证')
lb1.place(relx=0.1, rely=0.1, relwidth=0.8, relheight=0.1)
str_arr=str(arr)
lb2 = Label(root, text=str_arr)
lb2.place(relx=0.1, rely=0.1, relwidth=0.8, relheight=0.025)
inp = Entry(root)
inp.place(relx=0.1, rely=0.2, relwidth=0.3, relheight=0.1)# 方法-直接调用FIFO run1()
btn1 = Button(root, text='FIFO', command=run1)
btn1.place(relx=0.1, rely=0.4, relwidth=0.3, relheight=0.1)# 方法二利用 LRU 传参数调用run2()
btn2 = Button(root, text='LRU', command=lambda: run2())
btn2.place(relx=0.3, rely=0.4, relwidth=0.3, relheight=0.1)# 方法三利用 OPT 传参数调用run3()
btn3 = Button(root, text='OPT', command=lambda: run3())
btn3.place(relx=0.6, rely=0.4, relwidth=0.3, relheight=0.1)# 在窗体垂直自上而下位置60%处起,布局相对窗体高度40%高的文本框
lb_txt = Label(root, text='检验结果:')
lb_txt.place(relx=0.1, rely=0.5, relwidth=0.3, relheight=0.1)
txt = Text(root)
txt.place(rely=0.6, relheight=0.4)
root.mainloop()<font color=#999AAA >编写不易——求赞~

Python实现页面置换算法相关推荐

  1. 【南邮操作系统实验】页面置换算法(FIFO、LRU、OPT)图形化界面(JavaFx)

    页面置换算法图形化界面 前言 运行效果 源码 FIFO LRU OPT FXML界面 控制器 启动类 前言 其实以前操作系统实验的时候我写过了三份了:(命令行) 页面置换算法 (FIFO.LRU.OP ...

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

    页面置换算法 先进先出置换算法(FIFO) 最近最久未使用置换算法(LRU) 最佳置换算法(OPT) 本来已经写好一份 Java 版的了,然后又帮女朋友写了一份 Python 版,啊哈哈 Java版戳 ...

  3. 操作系统之虚拟存储管理 java python 实现 最优(Optimal)置换算法 先进先出(FIFO)页面置换算法 LRU(Least Recently Used)置换算法

    操作系统之虚拟存储管理 实验内容:模拟请求分页虚拟存器管理技术中的硬件地址变换.缺页中断以及页式淘汰算法,处理缺页中断. 实验目的:清楚认识请求分页管理. 最佳(Optimal)置换算法 其所选择的被 ...

  4. 操作系统课设之虚拟内存页面置换算法的模拟与实现

    前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...

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

    页面置换算法 先进先出置换算法(FIFO) 最近最久未使用置换算法(LRU) 最佳置换算法(OPT) 写好了 Java 版和 Python 版的- Java版这里 Python版戳这里 帮女朋友舍友写 ...

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

    页面置换算法Java版 先进先出置换算法(FIFO) 最近最久未使用置换算法(LRU) 最佳置换算法(OPT) 帮女朋友写了份 Python版的,Python版戳这里 帮女朋友舍友写了份 C++ 版的 ...

  7. 三十七、页面置换算法

    一.知识总览 请求分页存储管理与基本分页存储管理的主要区别: 在程序执行的过程中,当所访问的信息不再内存中时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序. 若内存空间不够,由操作系统负责 ...

  8. 页面置换算法简单对比----《operating system concepts》《操作系统原理》

    置换策略 当请求调页程序要调进一个页面,但是该作业分配所得的主内存块已经全部用完,则必须淘汰改作业在贮存中的一个页面.置换算法就是决定选择哪一个页面进行淘汰的规则. 如置换算法不够好,就会导致刚淘汰的 ...

  9. 【操作系统】考研の页面置换算法例子(看不懂你来打我~!)

    文章目录 1 缺页率 2 页面置换算法 1 缺页率 缺页率=缺页次数/缺页次数+访问成功次数 2 页面置换算法 根据页面走向,使用先进先出页面淘汰算法时,页面置换情况见下表. 物理块数为3时: 走向 ...

  10. linux页面置换的存储,3.4.4 第二次机会页面置换算法

    3.4.4   第二次机会页面置换算法 FIFO算法可能会把经常使用的页面置换出去,为了避免这一问题,对该算法做一个简单的修改:检查最老页面的R位.如果R位是0,那么这个页面既老又没有被使用,可以立刻 ...

最新文章

  1. C++多线程:异步操作std::async和std::promise
  2. 在SQL2000怎樣用動態實現SQL2005的nvarchar(max)功能
  3. 在Docker应用场景下 如何使用新技术快速实现DevOps
  4. 三台主机分别部署LAMP
  5. 032-element模块
  6. xpath解析库的语法及使用
  7. 2017年10月07日普及组 数列
  8. 手机拍照成像误区解读
  9. web学习1--web项目的WEB-INF目录
  10. 语言课设医院诊疗系统_江苏孤独症孩子有哪些典型特征?上海六一儿童医院
  11. DotNetNuke 4/5 安装提示 msajax错误,下载AJAX 1.0即可解决
  12. 谷歌浏览器实现直接打印效果
  13. FFMPEG结构体分析:AVCodecContext
  14. 大型运输行业实战_day07_2_数据字典实现
  15. FISCO BCOS 区块链应用开发步骤
  16. 在ROS中使用行为树
  17. 微信小程序-微信支付
  18. STL emplace_back
  19. VB中数组的大小排序解析
  20. mongodb数据库学习日记(一)

热门文章

  1. 彩影ARP防火墙 v6.0.2(x64)的问题 错误代码1/0 解决方案
  2. FLV转MPG和转成其它格式的转码方法
  3. Apple Pay的使用
  4. 精彩收集的303个透明flash代码
  5. 分享:世界机场代码(ICAO)[带经纬度]
  6. csgo自建局域网服务器,csgo怎么创建局域网游戏
  7. opencv-python 摄像机标定
  8. RQNOJ-19 篝火晚会
  9. 不会写原创文章,在线洗稿软件能处理吗
  10. 王佩丰 Excel 24节课 学习笔记