第6次实验n#(精选.)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
请注意:
1)本次实验报告在下周六晚上12点前提交,晚交超过72小时者将酌情扣分
2)小组长请随时掌握本组成员实验完成情况,并认真为其打分
3)各位小组长请在实验完成时示意老师过去检查(下课前15分钟)
实验二常用页面置换算法模拟实验
1.实验目的
通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率;操作系统的发展使得系统完成了大部分的内存管理工作,对于程序员而言,这些内存管理的过程是完全透明的。因此程序员从不关心系统如何为自己分配内存,而且永远认为系统可以分配给程序所需要的内存。在开发程序时,程序员真正需要做的就是:申请内存、使用内存、释放内存。该实验就是帮助读者更好地理解从程序员的角度应如何使用内存。
2.实验要求:
1)要求用你熟悉的程序设计语言编写和调试一个页面置换模拟程序;要求在主函数中测试。
2)实验报告中必须包括:设计思想、数据定义(包括详细说明)、处理流程(详细算法描述和算法流程图)、源代码、运行结果、体会等部分。
3)必须模拟本实验内容中提到的算法中的至少2种页面置换算法。
4)比较不同页面置换算法的效率
3.实验内容
编写一个程序,使用以下页面置换算法中的某2种分别模拟一个分页系统。
1、第二次机会算法(Second Chance)
2、最近最少使用算法(Least Recently Used,LRU )
3、最不常用算法(Not Frequently Used,NFU)
4、最近未使用算法(Not Recently Used ,NRU)
5、时钟页面置换算法
6、老化算法(aging)
页框的数量是参数,页面访问序列是随机产生的指令序列(也可以从文件中读入)。对于一个已定的指令序列,列出1000次内存访问中发生缺页中断的数目,它是可用页框数的函数【需要显示各种算法在不同用户内存页框数[4至32]情况下的缺页中断数目】
4.实验预读
若指令为随机序列,则首先用srand( )和rand( )函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法统计出相应的缺页中断数目(1)通过随机数产生一个指令序列,共320条指令。指令的地址按下述原则生成:
A:50%的指令是顺序执行的
B:25%的指令是均匀分布在前地址部分
C:25%的指令是均匀分布在后地址部分
具体的实施方法是:
A:在[0,319]的指令地址之间随机选取一起点m
B:顺序执行一条指令,即执行地址为m+1的指令
C:在前地址[0,m-1]中随机选取一条指令并执行,该指令的地址为m’
D:顺序执行一条指令,其地址为m’+1
E:在后地址[m+2,319]中随机选取一条指令并执行
F:重复步骤A-E,直到320条指令执行结束
(2)将指令序列变换为页地址流(同样适应于指令从文件中读入)
假设:页面大小为1K;
用户内存容量4页到32页;
用户虚存容量为32K。
在用户虚存中,按每K存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:
第0 条-第9 条指令为第0页(对应虚存地址为[0,9])
第10条-第19条指令为第1页(对应虚存地址为[10,19])
………………………………
第310条-第319条指令为第31页(对应虚存地址为[310,319])
按以上方式,用户指令可组成32页。
5. 实验理论参考
1)虚拟存储系统
UNIX中,为了提高内存利用率,提供了内外存进程交换(Swapping)机制;内存空间的分配和回收均以页为单位进行;一个进程只需将其一部分(段或页)调入内存便可运行;还支持请求调页的存储管理方式。
当进程在运行中需要访问某部分程序和数据时,发现其所在页面不在内存,就立即提出请求(向CPU发出缺中断),由系统将其所需页面调入内存。这种页面调入方式叫请求调页。
为实现请求调页,核心配置了数据结构:页表[页框号、访问位、修改位、有效位、保护位等]。
2)页面置换算法
当CPU接收到缺页中断信号,中断处理程序先保存现场,分析中断原因,转入缺页中断处理程序。该程序通过查找页表,得到该页所在外存的物理块号[number of page frame 页框号]。如果此时内存未满,能容纳新页,则启动磁盘I/O将所缺之页调入内存,然后修改页表。如果内存已满,则须按某种置换算法从内存中选出一页准备换出,是否重新写盘由页表的修改位决定,然后将缺页调入,修改页表。利用修改后的页表,去形成所要访问数据的物理地址,再去访问内存数据。整个页面的调入过程对用户是透明的。
1.FIFO算法
原理简述
(1)在分配内存页面数(AP)小天进程页面数(PP)时,当然是最先运行的AP个页面放入内存;
(2)这时又需要处理新的页面,则将原来放的内存中的AP个页中最先进入的调出(FIFO),再将新页面放入;
(3)以后如果再有新页面需要调入,则都按上述规则进行。
(4)算法特点:所使用的内存页面构成一个队列。
●图表描述
假设某个进程在硬盘上被划分成5个页面(PP=5),以1、2、3、4、5分别表示,CPU 调用它们的顺序(这应该取决于进程本身)为:1、4、2、5、3、3、2、4、2、5,如果内存可以控制的页面数为3(AP=3),那么在使用FIFO算法时,这3个页面的内存使用情况应该如图5所示。
图5
不难看出,本例共换入页面8次,若用变量diseffect表示页面换入次数,则diseffect=8。
●算法实现提示
要得到命中率,必然应该有一个常量total_instruction来记录页面总共使用的次数,此外还需要一个变量记录总共换入页面的次数diseffect(需要换出页面总是因为缺页中断而产生)。利用公式1-diseffect / total_instruction*100% 可以得到命中率。
(1)初始化。设置两个数组page[ap]和pagecontrol[pp]分别表示进程页面数和内存分配的页面数,并产生一个随机数序列main[total_instruction](这个序列由page[ap]
的下标随机构成)表示待处理的进程页面顺序,diseffect置0。
(2)看main[]中是否有下一个元素,若有,就由main[]中获取该页面下标,并转(3),如果没有则转(7)。
(3)如果该页已在内存中,就转(2),否则转(4),同时未命中的diseffect加1。
(4)观察pagecontrol是否占满,如果占满则须将使用队列(在第(6)步中建立的)中最先进入的(就是队列的第一个单元)pagecontrol单元“清干净”,同时将