最近做实验,要求用文件存取数据,上网搜,主要都是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 系统层次结构 1.2初始化 1.2 子功能设计 2 源程序 2.1 系统实现主要的软件技术 2.2 数据结构 2.3 后端 2 ...

  2. 东北大学软件学院操作系统v实验报告

    课程编号:B080000070     <操作系统>实验报告             姓名   学号   班级   指导教师   实验名称 <操作系统>实验 开设学期 2016 ...

  3. 哈工大操作系统课程实验记录

    哈工大操作系统课程实验记录 0-课程准备 课程视频地址: https://www.bilibili.com/video/BV1d4411v7u7 实验楼地址: https://www.shiyanlo ...

  4. 操作系统ucore实验——lab1

    ** ## 操作系统ucore实验--lab1 ** 紧急更新实验用的源代码在lab0中的有误改为: 链接:https://pan.baidu.com/s/1RLCG57xDSydH8oQD-JwgP ...

  5. 大学操作系统上机实验

      上机实验指导书 课程名称 操作系统 主撰人  刘天波 审核人  栾方军 沈阳建筑大学信息学院 2014 年3月 课程名称:操作系统 上机学时:16 适用专业:计算机科学与技术 先修课程:C语言 一 ...

  6. 操作系统课程实验代码汇总

    操作系统课程实验代码汇总 本次内容供需要有相关实验需要的提供参考,代码下载方式在文末 文章目录 操作系统课程实验代码汇总 前言 一.进程管理 实验目的 代码 说明 二.进程调度 实验目的 说明 三.银 ...

  7. 《操作系统》实验报告——熟悉Linux基础命令及进程管理

    理论知识 Linux--进程管理 Linux--Linux C语言编程基础知识 手把手教你安装Linux虚拟机 一.实验目的 (1)加深对进程概念的理解,明确进程和程序的区别. (2)进一步认识并发执 ...

  8. 进程同步算法实现实验报告Linux,操作系统进程同步实验报告.doc

    操作系统进程同步实验报告 实验三:进程同步实验 一.实验任务: (1)掌握操作系统的进程同步原理: (2)熟悉linux的进程同步原语: (3)设计程序,实现经典进程同步问题. 二.实验原理: (1) ...

  9. 计算机操作系统指导书,《计算机操作系统》实验指导书-2015

    q.num++; System.out.println(\已生产第:\个产品!\ try { Thread.currentThread().sleep(100); } catch (Interrupt ...

最新文章

  1. seaborn使用violinplot函数可视化分组小提琴图(Grouped Violinplot with Seaborn violinplot)并保存可视化结果
  2. AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML)
  3. Dynamics 365-关于Solution的那些事(一)
  4. Powerdesigner数据库建模工具教程
  5. 计算机英语教学能力大赛,英语教学网络中心举办 “志勤杯”英语口语技能大赛 和“志勤杯”英语写作技能大赛...
  6. SM3密码杂凑算法源码解析
  7. c加加中print是什么意思_砖家财经:基金名字后面的A、B和C,分别代表什么意思?...
  8. Java 完美判断中文字符的方法
  9. 他是浙大 19 岁大一新生,三个月斩获 WWDC 19 奖学金!
  10. 关于通用框架的一些想法
  11. 分享一个 电子书下载网站 支持 ebook pdf azw3 epub mobi
  12. vue canvas —— 将两张图片合成一张
  13. CDH存在隐患 : 该角色的进程使用的交换内存为xx兆字节。警告阈值:200字节
  14. Python 网络爬虫及数据可视化
  15. 使用unbound在RHEL7上搭建DNS服务
  16. 直播弹幕系统(三)- 直播在线人数统计
  17. 磁盘阵列RAID技术超详细解读
  18. 什么是排序算法的稳定性
  19. 湖南省株洲市谷歌高清卫星地图下载
  20. 群论:Burnside引理与Polya定理

热门文章

  1. shell编程经典案例,建议收藏
  2. 日志系统新贵 Loki,确实比笨重的ELK轻
  3. java画乌龟_用java代码画乌龟,还要能让它爬。
  4. Fast Extrinsic Calibration of a Laser Rangefinder to a Camera阅读理解
  5. 自然辩证法复习题 1
  6. 美国iPS细胞治疗癌症最新进展
  7. 扫盲贴:手游圈行业术语汇总
  8. python:实现对图像进行色调处理算法(附完整源码)
  9. NYOJ283对称排序
  10. python repair修复功能_通用高效的数据修复方法:Row level repair