}
voidmain()
{
chushihua();
for(inti=3;i<33;i++)
{
FIFO(i);
LRU(i);
}
}
3
报告,
××××大学
计算机科学与工程学院实验报告实验题目:
请求页式存储管理模拟
课程名称:
计算机操作系统
实验类型:
?
演示性?
验证性?
操作性?
设计性?
综合性专业:
班级:
姓名:
学号:
实验日期:
2012年5月24日实验地点:
实验学时:
实验成绩:
指导教师签字:
年月日
4
实验题目:
........................................................................................错误~未定义书签。
实验要求:
........................................................................................错误~未定义书签。
一、方案设计.....................................................................................错误~未定义书签。
1.技术方案:
..............................................................................错误~未定义书签。
(1)先进先出法(FirstInFirstOut):
.......................错误~未定义书签。
(2)最近最久未使用(LeastRecentlyUsed):
..............错误~未定义书签。
2.功能设计:
..............................................................................错误~未定义书签。
(1)chushihua()函数的功能:
.......................................错误~未定义书签。
(2)FIFO()的功能:
.......................................................错误~未定义书签。
(3)LRU()的功能:
........................................................错误~未定义书签。
二、结构设计.....................................................................................错误~未定义书签。
1、数据结构设计........................................................................错误~未定义书签。
2、程序结构设计........................................................................错误~未定义书签。
三、程序设计.....................................................................................错误~未定义书签。
1.FIFO()函数流程图;..............................................................错误~未定义书签。
2.LRU()函数流程图:
............................................................错误~未定义书签。
四、编码调试.....................................................................................错误~未定义书签。
主要问题及解决方法:
...............................................................错误~未定义书签。
五、实验总结.....................................................................................错误~未定义书签。
六、程序清单.....................................................................................错误~未定义书签。
源代码:
.....................................................................................错误~未定义书签。
运行结果:
.................................................................................错误~未定义书签。
5
实验题目:
请求页式存储管理模拟
实验要求:
设计一个虚拟存储区和内存工作区,并使用下述算法计算访问命中率。
(1)先进先出的算法(FIFO)
(2)最近最久未用算法(LRU)
(3)最近最不经常使用算法(NUR)*(选做)(4)最佳淘汰算法(OPT)*(选做)
(5)最少访问页面算法(LFU)*(选做)
命中率=1-页面失效次数/页面地址流长度
程序设计中,首先用Srand()和Rand()函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,针对不同的算法计算出相应的命中率。
6
一、方案设计
1.技术方案:
(1)先进先出法(FirstInFirstOut):
该算法总是淘汰最先进入内存的页面,既选择在内存中驻留时间最久的页面予以淘汰。
在该算法的模拟过程中,每当页面需要被置换进入内存时,最先进入内存的内容们都依次向底移一位,需要访问的内容存入数组0号单元,即最顶部,这时缺页数加1;当不需要进行页面置换,即所需访问的内容在内存中时,不需要操作,继续读下一条指令。
这样就实现了总是淘汰最先进入内存的页面,选择了在内存中驻留时间最久的页面予以淘汰。
(2)最近最久未使用(LeastRecentlyUsed):
该算法将过去最长一段时间里不曾被使用的页面置换掉。
在该算法的模拟过程中,每当页面需要被置换进入内存时,最先进入内存的内容们都依次向底移一位,需要访问的内容存入数组0号单元,即最顶部,这时缺页数加1;当不需要进行页面置换,即所需访问的内容在内存中时,将要访问的指令移到内存顶部,其他指令依次向下移一位,这样就把最久不用的指令沉到了底部,有必要时淘汰,即实现了总是淘汰最近最久未使用的指令。
2.功能设计:
(1)chushihua()函数的功能:
先由Srand()和Rand()函数定义和随机产生指令序列,然后将指令序列变换成相
应的页地址流存入地址流数组里。
(2)FIFO()的功能:
实现FIFO算法,淘汰最先进入内存的页面并根据缺页数算出命中率。
(3)LRU()的功能:
实现LRU算法,淘汰最近最久未使用的页面并根据缺页数算出命中率。
二、结构设计
1、数据结构设计
本程序使用了三个一维数组:
yemianliu[]存放地址指令流序列;
fifo[]存放FIFO算法时的内存指令;
lru[]存放LRU算法时的内存指令。
2、程序结构设计
7
开始
主函数
Chushihua()FIFO()LRU()
结束
三、程序设计
1.FIFO()函数流程图;
开始
得到执行的指令
指令是否
在内存中否
queye加1,指令
是存入内存,最先
存入指令被淘汰
是下面是否
还有指令
否
得出命中率
结束
8
2.LRU()函数流程图:
开始
得到执行的指令
指令是否
在内存中
否
是
queye加1,指令
将指令移到数存入内存,淘汰
数组底部指令组顶部,其他
依次下移一位
是下面是否
还有指令
否
得出命中率
结束
9
四、编码调试
主要问题及解决方法:
刚开始老师的例题看不懂,虽然知道FIFO和LRU的原理,但不知道从何下手。
我觉得老师的那个例题太复杂了,如果我也写那么复杂程序肯定崩溃得一塌糊涂,所以我觉
,老师的例题和网上定按自己的理解写。
我也搜了很多例题,但都和题目要求不太一样
的例题都用到了结构体数组,在内存的指令旁都附加了一个累加器,以访问次数和时间决定要淘汰的指令,而我是每访问一次后,按访问次数冒泡排序一次,这样最近被访问的就在数组的最顶上,最远被访问的在内存数组的最底部,没有用到循环队列,但也能实现功能。
这次我没有用到结构体数组,也没有用到指针(有点遗憾),不过测试了好几组数据,结果都和我用笔算的一样。
在编程中,因为定义的变量太多了,取名也有点混乱,弄得我很晕,刚开始一直崩溃,后来我把程序的运行过程一步步的cout出来和调试,终于发现了错误的地方。
开始我一直用for()语句来控制循环,但是都找不到适合的让它结束循环的方法,后来才想到了可以用while(n--)来控制,效果还不错。
还有就是第一次使用随机函数,有点陌生,上网查了些资料,终于会应用它了。
这次试验大概就遇到了以上问题,都一一解决了,当然程序还是存在一些问题的,但是收获很多~
五、实验总结
通过本次实验,我对操作系统这门课程有了更进一步的认识和了解,通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟储技术的特点。
通过对页面、页表、地址转换和页面置换过程的模拟,加深对请求调页系统的原理和实现过程的理解,也知道了几种算法的效率,也验证了LRU算法的命中率平均的比FIFO算法的高。
过程中,用到了许多C++的基本知识和操作系统的基本原理,是对平时所学在本次设计
知识的一次考验,尽管这些知识都学过,但运用到实际时,却不知从何下手,而且错误不断,往往为了找一个错误而花了大量的时间,这是专业知识掌握不够,缺乏实践动手能力的表现。
在设计的过程中我们发现了许多自己的不足之处。
通过该实验,我收获了很多。
我了解到编写程序不是首要任务,而是一种实现手段。
我们最重要的是如何做好需求分析和理清思路,做出正确、简洁的流程设计,这样可以达到事半功倍的效果。
10
六、程序清单
源代码:
#inclu#includede
#include
#include
#include
usingnamespacestd;intyemianliu[32]={0};//全局变量组数,地址流intp;//全局变量p是一共有多少地址流
voidchushihua()//初始化函数
{
intt;
srand(time(0));//随机产生指令序列
p=12+rand()%32;cout<<"地址流序列,";
for(inti=0;i
t=1+rand()%9;
yemianliu[i]=t;//将随机产生的指令数存入页面流
cout<}
cout<}
voidFIFO(intn)//FIFO算法,n是M的值{
inti;
intq=p;
inte;
intqueye=0;
intflag;
intfifo[32]={0};while(q--)
{
flag=0;
e=q;
for(i=0;i{
if(fifo[i]==yemianliu[q])
{
flag=1;
11
break;
}
}
if(flag==0)
{
intm=n-1;
intk=m;
while(m--)
{
fifo[k]=fifo[k-1];
k--;
}
fifo[0]=yemianliu[e];
queye++;
}
}
cout<<"M="<}
voidLRU(intn)//LRU算法{
inti;
intq=p;
inte;
intqueye=0;
intflag;
intflag1,;
inty;
intlru[32]={0};
while(q--)
{
flag=0;
e=q;
for(i=0;i{
if(lru[i]==yemianliu[q])
{
flag=1;
flag1=i;
break;
}
}
if(flag==0)
{
12
intm=n-1;
intk=m;
while(m--)
{
lru[k]=lru[k-1];
k--;
}
lru[0]=yemianliu[e];
queye++;
}
elseif(flag==1)
{
y=flag1;
while(y--)
{
lru[flag1]=lru[flag1-1];
flag1--;
}
lru[0]=yemianliu[e];
}
}
cout<<"M="<}
voidmain()
{
chushihua();
for(inti=3;i<33;i++)
{
FIFO(i);
LRU(i);
}
}
13
运行结果:
14