请求调页存储管理方式的模拟-python实现
来源:互联网 发布:淘宝商城男装赖克 编辑:程序博客网 时间:2024/06/04 17:44
1实验目的
通过对页面、页表、地址转换和页面置换过程的模拟,加深对请求调页系统的原理和实现过程的理解。
2实验内容
(1)假设每个页面中可存放10条指令,分配给一个作业的内存块数为4。
(2)模拟一个作业的执行过程。该作业共有320条指令,即它的地址空间为32页,目前它的所有页都还未调入内存。在模拟过程中,如果所访问的指令已经在内存中,则显示其物理地址,并转下一条指令。如果所访问的指令还未装入内存,则发生缺页,此时需记录缺页的次数,并将相应页调入内存。如果4个内存块中均已装入该作业,则需进行页面置换。最后显示其物理地址,并转下一条指令。在所有320条指令执行完毕后,请计算并显示作业运行过程中发生的缺页率。
(3)置换算法:请分别考虑OPT、FIFO和LRU算法。
(4)作业中指令的访问次序按下述原则生成:
•50%的指令是顺序执行的。
•25%的指令是均匀分布在前地址部分。
•25%的指令时均匀分布在后地址部分。
3实验结果(给出编写的程序源代码和运行结果的截图)
import random#共有4个内存块,一个内存块存放一个页面,一个页面存放10条指令,共32个页面,指令在页面中顺序存放class Block(object): def __init__(self,numpage=-1,accessed=0): self.numpage=numpage #页号 self.accessed=accessed #访问情况,数值表示多久未被访问size=4 #内存块数目count=0 #记录指令的序号n=0 #缺页数目block=[] #内存块zhilin=[]def initdata(block): for i in range(size): a=Block(numpage=-1,accessed=0) block.append(a)def findpage(block,curpage): #查找物理块中是否有该页面 for i in range(size): if block[i].numpage==curpage: return i return -1def findExchange(block): #查找置换的页号 pos=0 for i in range(size): if block[i].accessed>block[pos].accessed: pos=i return posdef display(block): for i in range(size): if block[i].numpage!=-1: print block[i].numpage, printdef randomcin(zhilin): #生成随机指令序列 flag=0 count=raw_input() count=int(count) print ("生成随机指令序列:") for i in range(320): zhilin.append(count) if flag%2==0: count=count+1 count=count%320 if flag==1: count=random.randint(0,count-2) if flag==3: count=random.randint(count+1,319) #count=count+1+random.randint(0,320-count-1) flag=flag+1 flag=flag%4 print zhilin[i], if (i+1)%10==0: printdef findspace(block): for i in range(size): if block[i].numpage==-1: return i return -1def pringpage(zhilin): for i in range(320): print zhilin[i]%10, if i%10==0: printdef FIFO(block,n): curpage=-1 exchange=-1 for i in range(320): count=zhilin[i] curpage=count/10 exsist=findpage(block,curpage) if exsist==-1: space=findspace(block) if space==-1: exchange=findExchange(block) block[exchange].numpage=curpage display(block) n=n+1 block[exchange].accessed=-1 else: block[space].numpage=curpage display(block) n=n+1 else: for i in range(size): if block[i].numpage != -1: print block[i].numpage, print "指令已在内存,页号为",exsist for j in range(size): block[j].accessed+=1 print "缺页次数为:",n v=n/320.0*100 print "缺页率为:",v,"%"def LRU(blcok,n): curpage=-1 exchange=-1 for i in range(320): count=zhilin[i] curpage=count/10 exsist=findpage(block,curpage) if exsist==-1: space=findspace(block) if space==-1: exchange=findExchange(block) block[exchange].numpage=curpage display(block) n=n+1 block[exchange].accessed=-1 else: block[space].numpage=curpage display(block) n=n+1 else: block[exsist].accessed=-1 for i in range(size): if block[i].numpage != -1: print block[i].numpage, print "指令已在内存,页号为", exsist for j in range(size): block[j].accessed += 1 print "缺页次数为:", n v = n / 320.0 * 100 print "缺页率为:", v, "%"def OPT(block,n): curpage=-1 exchange=-1 for i in range(320): count=zhilin[i] curpage=count/10 exsist=findpage(block,curpage) if exsist==-1: space=findspace(block) if space==-1: for h in range(size): for k in range(i,320): if block[h].numpage!=zhilin[k]/10: block[h].accessed=1000 else: block[h].accessed=k break exchange=findExchange(block) block[exchange].numpage=curpage display(block) n=n+1 else: block[space].numpage=curpage display(block) n=n+1 else: for i in range(size): if block[i].numpage != -1: print block[i].numpage, print "指令已在内存,页号为", exsist print "缺页次数为:", n v = n / 320.0 * 100 print "缺页率为:", v, "%"print "输入第一条指令号:"randomcin(zhilin)initdata(block)while 1: print "输入1运行FIFO,输入2运行LRU,输入3运行OPT:" a=raw_input() a=int(a) if a==1: FIFO(block, n) elif a==2: LRU(block, n) elif a==3: OPT(block,n)
阅读全文
0 0
- 请求调页存储管理方式的模拟-python实现
- 【实验】请求调页存储管理方式的模拟
- 操作系统——请求调页存储管理方式的各种模拟
- OS 请求调页存储管理方式的FIFO、LRU、OPT、LFU置换算法模拟
- 模拟请求页式存储管理--LRU
- 请求分页存储管理方式
- 请求分页存储管理方式
- 【操作系统】请求分页存储管理方式
- 模拟实现顺序表-动态的存储方式
- python http请求的几种方式的实现
- python模拟http请求实现网站登录
- 模拟实现线性表-顺序存储方式
- 动态分区分配方式的模拟-python实现
- 【操作系统】可变分区存储管理,模拟实现
- linux的存储管理方式
- 内存管理模拟实验之实现一个简单的固定(可变)分区存储管理系统
- 12.基本分页、请求分页存储管理方式
- 【操作系统】虚拟存储器--请求分段存储管理方式
- 模板的分离编译
- 【C++的探索路7】运算符重载的基本概念与赋值运算符重载
- String类的使用
- 一次CMMI虚假改进、评估的案例
- java 运行脚本
- 请求调页存储管理方式的模拟-python实现
- 分答项目_知识点:伴随播放语音时的波浪图效果
- Cleaning Shifts (贪心)
- 【Scikit-Learn 中文文档】分解成分中的信号(矩阵分解问题)
- 常见错误tomcat部署项目报错There are no resources that can be added or removed from the server
- [优质论文]伪造共同访问对推荐系统进行攻击
- 带你逐步深入了解SSH框架——hibernate概念和api使用
- 理解深度卷积网络
- 【二分+最大流Dinic】BZOJ1305(CQOI2009)[dance跳舞]题解