操作系统虚拟存储器实验---Python实现
最近做实验,要求用文件存取数据,上网搜,主要都是C语言或者Java写的,Python的粗略看是没搜到。
所以想到用Python来写,操作文件更方便一些。
废话不多说,直接上代码
class load_from_file:file_name = None #文件名file = None #文件对象is_pre = None #是否有预先页block = None #物理块数量pre_list = None #预先页内容visit_list = None #访问列表def __init__(self) -> None:self.load("D:\Desktop\something\操作系统\page_src.txt")def load(self,name):self.file_name = nameself.file = open(self.file_name,"r+")fr = self.file.read()str1 = fr.split("\n")list1 = str1[0].split(" ")#文件中保存两行数据list2 = str1[1].split(" ")for i in range(len(list1)):list1[i] = eval(list1[i])for i in range(len(list2)):list2[i] = eval(list2[i])self.block = list1[0]#第一行第一个数字表示有几个物理块if list1[1] != 0:#第一行第二个数据表示是否有预先页,后面的数据则是预先页中的内容,后面的数据项长度应该小于第一个数字self.is_pre = Trueself.pre_list = list1[2:]if len(self.pre_list) > self.block:print("错误,请检查传入文件内容是否正确")returnself.visit_list = list2#第二行表示访问页的列表self.file.close()class dispatch:is_pre = Noneblock = Nonepre_list = Nonenow_list = None #当前访问页列表visit_list = Noneis_lack = None #是否缺页res_list = None #保存结果便于写入文件def __init__(self) -> None:#初始化数据self.block = load_from_file().blockself.is_pre = load_from_file().is_preself.pre_list = load_from_file().pre_listself.visit_list = load_from_file().visit_listself.now_list = [-1]*self.blockself.is_lack = [True]*len(self.visit_list)self.res_list = []def OPT(self) -> list:if self.is_pre:for i in range(len(self.pre_list)):self.now_list[i] = self.pre_list[i]future_count = [-1]*self.blockfor i in range(len(self.visit_list)):if self.visit_list[i] in self.now_list:#如果访问的页在当前表中,则不缺页self.is_lack[i] = False#print(self.now_list)res_temp = [x for x in self.now_list]res_temp.append(self.is_lack[i])self.res_list.append(res_temp)continueif -1 in self.now_list:self.now_list[self.now_list.index(-1)] = self.visit_list[i]res_temp = [x for x in self.now_list]res_temp.append(self.is_lack[i])self.res_list.append(res_temp)continuefor j in range(self.block):#缺页,计算最久访问页if self.now_list[j] in self.visit_list[i:]:future_count[j] = self.visit_list[i:].index(self.now_list[j])else:future_count[j] = len(self.visit_list)self.now_list[future_count.index(max(future_count))] = self.visit_list[i]#替换#print(self.now_list)res_temp = [x for x in self.now_list]res_temp.append(self.is_lack[i])self.res_list.append(res_temp)return self.res_listdef FIFO(self):if self.is_pre:for i in range(len(self.pre_list)):self.now_list[i] = self.pre_list[i]exist_count = [0]*self.blockself.pre_list = [x for x in self.now_list]for i in range(len(self.visit_list)):for j in range(self.block):if self.now_list[j] == self.pre_list[j]:exist_count[j] += 1else:exist_count[j] = 0if self.visit_list[i] in self.now_list:#如果访问的页在当前表中,则不缺页self.is_lack[i] = Falseres_temp = [x for x in self.now_list]res_temp.append(self.is_lack[i])self.res_list.append(res_temp)#print(self.now_list)continueif -1 in self.now_list:self.now_list[self.now_list.index(-1)] = self.visit_list[i]res_temp = [x for x in self.now_list]res_temp.append(self.is_lack[i])self.res_list.append(res_temp)continueself.pre_list = [i for i in self.now_list]#储存未置换前的页self.now_list[exist_count.index(max(exist_count))] = self.visit_list[i]#print(self.now_list)res_temp = [x for x in self.now_list]res_temp.append(self.is_lack[i])self.res_list.append(res_temp)return self.res_listdef LRU(self):if self.is_pre:for i in range(len(self.pre_list)):self.now_list[i] = self.pre_list[i]unused_time = [0]*self.blockfor i in range(len(self.visit_list)):if self.visit_list[i] in self.now_list:#如果访问的页在当前表中,则不缺页self.is_lack[i] = Falseres_temp = [x for x in self.now_list]res_temp.append(self.is_lack[i])self.res_list.append(res_temp)#print(self.now_list)continueif -1 in self.now_list:self.now_list[self.now_list.index(-1)] = self.visit_list[i]res_temp = [x for x in self.now_list]res_temp.append(self.is_lack[i])self.res_list.append(res_temp)continuefor j in range(self.block):if self.now_list[j] not in self.visit_list[:i]:unused_time[j] = len(self.visit_list)else:temp_list = [x for x in self.visit_list[:i]]temp_list.reverse()unused_time[j] = temp_list.index(self.now_list[j])self.now_list[unused_time.index(max(unused_time))] = self.visit_list[i]#print(self.now_list)res_temp = [x for x in self.now_list]res_temp.append(self.is_lack[i])self.res_list.append(res_temp)return self.res_listdef main(self):while True:print("1-OPT\t2-FIFO\t3-LRU")choose = input("请选择调度方式:")res = []method = ""if choose == "1":res = dispatch().OPT()method = "OPT"elif choose == "2":res = dispatch().FIFO()method = "FIFO"elif choose == "3":res = dispatch().LRU()method = "LRU"else:print("程序退出")returnprint(method,end="")for i in self.visit_list:print("\t"+str(i),end="")print()count_lack = 0for i in range(len(res[0])):if i == len(res[0]) - 1:print("缺页",end="")for j in range(len(self.visit_list)):if res[j][i] == True:count_lack += 1else:print("块"+str(i),end="")for j in range(len(self.visit_list)):print("\t"+str(res[j][i]),end="")print()print("缺页率",str(count_lack/len(self.is_lack)*100)+"%")with open("page_res.txt","w",encoding="utf-8") as ff:ff.write(method+" ")for i in self.visit_list:ff.write("\t"+str(i))ff.write("\n")for i in range(len(res[0])):if i == len(res[0]) - 1:ff.write("缺页")else:ff.write("块"+str(i)+" ")for j in range(len(self.visit_list)):if i == len(res[0]) - 1:if res[j][i] == True:ff.write("\t1")else:ff.write("\t0")else:ff.write("\t"+str(res[j][i]))ff.write("\n")ff.write("1代表缺页,0代表不缺页\n缺页率 "+str(count_lack/len(self.is_lack)*100)+"%")ff.close()if __name__ == "__main__":dispatch().main()
实验要求实现OPT、FIFO和LRU算法,非常简单
下面是测试用的源文件page_src.txt的内容
3 1 1 2 3
1 2 4 2 6 2 1 5 6 1
测试结果
OPT
OPT 1 2 4 2 6 2 1 5 6 1
块0 1 1 1 1 1 1 1 1 1 1
块1 2 2 2 2 2 2 2 5 5 5
块2 3 3 4 4 6 6 6 6 6 6
缺页 0 0 1 0 1 0 0 1 0 0
1代表缺页,0代表不缺页
缺页率 30.0%
FIFO
FIFO 1 2 4 2 6 2 1 5 6 1
块0 1 1 4 4 4 4 1 1 1 1
块1 2 2 2 2 6 6 6 5 5 5
块2 3 3 3 3 3 2 2 2 6 6
缺页 0 0 1 0 1 1 1 1 1 0
1代表缺页,0代表不缺页
缺页率 60.0%
LRU
LRU 1 2 4 2 6 2 1 5 6 1
块0 1 1 1 1 6 6 6 5 5 5
块1 2 2 2 2 2 2 2 2 6 6
块2 3 3 4 4 4 4 1 1 1 1
缺页 0 0 1 0 1 0 1 1 1 0
1代表缺页,0代表不缺页
缺页率 50.0%
操作系统虚拟存储器实验---Python实现相关推荐
- 操作系统期末实验:多用户二级文件系统
多用户二级文件系统 写在最前面 问题描述 要 求: 1 功能设计 1.1 系统层次结构 1.2初始化 1.2 子功能设计 2 源程序 2.1 系统实现主要的软件技术 2.2 数据结构 2.3 后端 2 ...
- 东北大学软件学院操作系统v实验报告
课程编号:B080000070 <操作系统>实验报告 姓名 学号 班级 指导教师 实验名称 <操作系统>实验 开设学期 2016 ...
- 哈工大操作系统课程实验记录
哈工大操作系统课程实验记录 0-课程准备 课程视频地址: https://www.bilibili.com/video/BV1d4411v7u7 实验楼地址: https://www.shiyanlo ...
- 操作系统ucore实验——lab1
** ## 操作系统ucore实验--lab1 ** 紧急更新实验用的源代码在lab0中的有误改为: 链接:https://pan.baidu.com/s/1RLCG57xDSydH8oQD-JwgP ...
- 大学操作系统上机实验
上机实验指导书 课程名称 操作系统 主撰人 刘天波 审核人 栾方军 沈阳建筑大学信息学院 2014 年3月 课程名称:操作系统 上机学时:16 适用专业:计算机科学与技术 先修课程:C语言 一 ...
- 操作系统课程实验代码汇总
操作系统课程实验代码汇总 本次内容供需要有相关实验需要的提供参考,代码下载方式在文末 文章目录 操作系统课程实验代码汇总 前言 一.进程管理 实验目的 代码 说明 二.进程调度 实验目的 说明 三.银 ...
- 《操作系统》实验报告——熟悉Linux基础命令及进程管理
理论知识 Linux--进程管理 Linux--Linux C语言编程基础知识 手把手教你安装Linux虚拟机 一.实验目的 (1)加深对进程概念的理解,明确进程和程序的区别. (2)进一步认识并发执 ...
- 进程同步算法实现实验报告Linux,操作系统进程同步实验报告.doc
操作系统进程同步实验报告 实验三:进程同步实验 一.实验任务: (1)掌握操作系统的进程同步原理: (2)熟悉linux的进程同步原语: (3)设计程序,实现经典进程同步问题. 二.实验原理: (1) ...
- 计算机操作系统指导书,《计算机操作系统》实验指导书-2015
q.num++; System.out.println(\已生产第:\个产品!\ try { Thread.currentThread().sleep(100); } catch (Interrupt ...
最新文章
- seaborn使用violinplot函数可视化分组小提琴图(Grouped Violinplot with Seaborn violinplot)并保存可视化结果
- AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML)
- Dynamics 365-关于Solution的那些事(一)
- Powerdesigner数据库建模工具教程
- 计算机英语教学能力大赛,英语教学网络中心举办 “志勤杯”英语口语技能大赛 和“志勤杯”英语写作技能大赛...
- SM3密码杂凑算法源码解析
- c加加中print是什么意思_砖家财经:基金名字后面的A、B和C,分别代表什么意思?...
- Java 完美判断中文字符的方法
- 他是浙大 19 岁大一新生,三个月斩获 WWDC 19 奖学金!
- 关于通用框架的一些想法
- 分享一个 电子书下载网站 支持 ebook pdf azw3 epub mobi
- vue canvas —— 将两张图片合成一张
- CDH存在隐患 : 该角色的进程使用的交换内存为xx兆字节。警告阈值:200字节
- Python 网络爬虫及数据可视化
- 使用unbound在RHEL7上搭建DNS服务
- 直播弹幕系统(三)- 直播在线人数统计
- 磁盘阵列RAID技术超详细解读
- 什么是排序算法的稳定性
- 湖南省株洲市谷歌高清卫星地图下载
- 群论:Burnside引理与Polya定理