请求页式管理缺页中断模拟设计FIFOOPT.docx
《请求页式管理缺页中断模拟设计FIFOOPT.docx》由会员分享,可在线阅读,更多相关《请求页式管理缺页中断模拟设计FIFOOPT.docx(14页珍藏版)》请在冰豆网上搜索。
请求页式管理缺页中断模拟设计FIFOOPT
请求页式管理缺页中断模拟设计--FIFO、OPT
1.程设计目的与功能
2.1目的
实现请求页式管理缺页中断FIFO、OPT算法,掌握页式存储管理系统的相关理论知识。
2.2功能
实现指定淘汰算法。
能够处理一下情形:
2.2.1能够输入给作业分配的内存块数;
2.2.2能够输入给定的页面,并计算发生缺页的次数以及缺页率;
2.2.3缺页时,如果发生页面置换,输出淘汰的页号。
2.需求分析,数据结构或模块说明(功能与框图)
2.1算法的原理描述:
2.1.1先进先出页面置换(FIFO)
FIFO法基本思想:
选择在内存驻留时间最长的页将其淘汰。
FIFO算法认为先调入内存的页不再被访问的可能性要比其他页大,因而选择最先调入内存的页换出。
2.1.2理想型淘汰页面置换算法(OPT)
OPT法基本思想:
当要调入一新页而必须淘汰一旧页时,所淘汰的页是以后不再使用的,或者是以后相当长的时间内不会使用的。
这样,淘汰掉该页将不会造成因需要访问该页而又立即把它调入的现象。
该算法无法实现,因为,它要求必须预先知道每一个进程的访问串。
2.2本次课程设计中的算法流程图
2.2.1FIFO算法的流程图如下图所示:
2.2.2OPT算法的流程图如下图所示:
3.源程序的主要部分
3.1程序中要到的全局变量说明
#defineM40//最大的访问页面序列数目
intN;//内存页面块数
3.2结构体说明
structPro
{
intnum;//num记录页面序列号
};
3.3主函数说明及注释
voidmain()
{cin>>N;//请输入可用内存物理块数:
";
Prop[M];//最大的访问页面序列数目
Pro*page=newPro[N];
charc;
intm=0,t=0;
floatn=0;
intfifoout[M];//记录FIFO算法淘汰的页面
intoptout[M];//记录OPT算法淘汰的页面
intf=0,o=0;
m=Input(m,p);//m返回输入的访问页面总书目
do{
for(inti=0;i{
page[i].num=0;//初试化内存页面
}
i=0;
cout<<"****请选择页面置换的(f代表FIFO,o代表OPT)****策略"<cout<<"f:
FIFO页面置换"<cout<<"o:
OPT页面置换"<cout<<"其他键退出"<cin>>c;
if(c=='f')//FIFO页面置换
{
n=0;
cout<<"******FIFO页面置换算法运行结果如下:
******"<cout<<"FIFO页面置换情况为:
"<while(i{
if(Search(p[i].num,page)>=0)//判断当前输入页面p[i].num是否已经在内存中,若在则返回其在内存页面块中的位置
{
i++;//找到相同的页面
}
else
{
if(t==N)//N为内存页面数目,t记录是那个页面最先进入内存页面,用来判断内存页面块是否已满
t=0;
else
{
n++;//记录缺页次数
fifoout[f]=page[t].num;//记录淘汰页面
f++;
page[t].num=p[i].num;//换入
print(page);//输出当前内存页面分配情况
t++;}}}
cout<<"采用FIFO算法时依次淘汰的页面为:
";
for(i=0;i{
if(fifoout[i]==0)continue;
else
cout<}
cout<<"采用FIFO算法时的缺页次数为:
"<cout<<"采用FIFO算法时的缺页率为:
"<<(double)n/m<}
if(c=='o')//OPT算法页面置换情况
{
n=0;
cout<<"******OPT页面置换算法运行结果如下:
******"<cout<<"OPT页面置换情况为:
"<intcount=0;
while(i{
if(Search(p[i].num,page)>=0)//判断当前输入页面p[i].num是否已经在内存中,若在则返回其在内存页面块中的位置
{
i++;
}
else
{
count++;
if(count<=N)//判断内存页面是否有空空闲页面
{
page[count-1].num=p[i].num;//进入空闲内存
n++;
print(page);
continue;
}
inttemp=0,cn;
for(t=0;t{
if(temp{
temp=Compfu(page,i,t,p);
cn=t;
}
}
optout[o]=page[cn].num;//输出淘汰页面
o++;
page[cn].num=p[i].num;//页面置换
n++;
print(page);
i++;
}
}
cout<<"采用OPT算法时依次淘汰的页面为:
";
for(i=0;i{
if(optout[i]==0)continue;
else
cout<}
cout<<"采用OPT算法时的缺页次数为:
"<cout<<"采用OPT算法时的缺页率:
"<<(double)n/m<}
else
{
exit;
}}while(c=='f'||c=='o');
}
3.4输入函数Input(intm,Prop[M])
intInput(intm,Prop[M])
{cout<<"请输入访问页面目数:
";
do
{
cin>>m;//访问页面数目
if(m>M)
cout<<"数目太多,请重试"<else
break;
}
while
(1);
cout<<"请输入访问页面号序列:
";
for(inti=0;i{
cin>>p[i].num;//依次输入页面访问顺序
}returnm;//返回输入的访问页面总数目
}
3.5输出函数print(Pro*page1)
voidprint(Pro*page1)//输出当前内存块中的访问页面
{
Pro*page=newPro[N];
page=page1;
for(inti=0;icout<cout<}
3.6Search(inte,Pro*page1)函数
intSearch(inte,Pro*page1)//用于查找当前页面是否已在内存块中
{
Pro*page=newPro[N];
page=page1;
for(inti=0;iif(e==page[i].num)
returni;//返回页面号为e的页面在那个内存页面中
return-1;//若不在则返回-1
}
3.7Compfu(Pro*page1,inti,intt,Prop[M])函数
intCompfu(Pro*page1,inti,intt,Prop[M])//i为当前页面在输入序列中的位置,t记录页面进入内存的顺序,此函数判断内存快中的页面page[t]在后续访问序列中出现的次数
{
Pro*page=newPro[N];
page=page1;
intcount=0;//记录当前页面的未来访问的次数
for(intj=i;j{
if(page[t].num==p[j].num)break;//页面已经在内存中
elsecount++;
}
returncount;//返回当前页面在未来还要出现的次数
}
4、测试用例,运行结果与运行情况分析
4.1测试用例设计
4.1.1用例1设计:
内存物理块数:
N=3
页面引用序列中总页面个数为:
m=12
页面引用序列为:
4、3、2、1、4、3、5、4、3、2、1、5
4.1.2用例2设计:
内存物理块数:
N=4
页面引用序列中总页面个数为:
m=15
页面引用序列为:
3、7、4、8、3、1、6、7、8、3、1、2、9、3、5
4.2运行结果及运行情况分析
4.2.1测试用例1运行结果如下:
4.2.1.1FIFO算法的运行结果:
结果验证如下:
FIFO
4
3
2
1
4
3
5
4
3
2
1
5
4
4
4
1
1
1
5
5
5
5
5
5
3
3
3
4
4
4
4
4
2
2
2
2
2
2
3
3
3
3
3
1
1
缺页
淘汰页号
4
3
2
1
4
3
共缺页中断9次
缺页率=缺页次数/总访问次数=9/12=75%
依次淘汰的页面号为:
4、3、2、1、4、3
4.2.1.2OPT算法的运行结果为:
OPT算法验证如下:
OPT
4
3
2
1
4
3
5
4
3
2
1
5
4
4
4
4
4
4
4
4
4
2
1
1
3
3
3
3
3
3
3
3
3
3
3
2
1
1
1
5
5
5
5
5
5
缺页
淘汰页号
2
1
4
2
共缺页中断9次
缺页率=缺页次数/总访问次数=7/12=58.33%
依次淘汰的页面号为:
2、1、4、2
4.2.2测试用例2运行结果如下:
4.2.2.1FIFO算法运行结果如下:
FIFO运行结果验证如下:
FIFO
3
7
4
8
3
1
6
7
8
3
4
2
9
3
5
3
3
3
3
3
1
1
1
1
1
4
4
4
4
4
7
7
7
7
7
6
6
6
6
6
2
2
2
2
4
4
4
4
4
7
7
7
7
7
9
9
9
8
8
8
8
8
8
3
3
3
3
3
5
缺页标记
淘汰页号
3
7
4
8
1
6
7
3
共缺页中断11次
缺页率=缺页次数/总访问次数=12/15=80%
依次淘汰的页面号为:
3、7、4、8、1、6、7、3
4.2.2.2OPT算法运行结果
OPT运行结果验证如下:
OPT
3
7
4
8
3
1
6
7
8
3
4
2
9
3
5
3
3
3
3
3
3
3
3
3
3
3
3
3
3
5
7
7
7
7
7
7
7
7
7
4
4
9
9
9
4
4
4
1
6
6
6
6
6
6
6
6
6
8
8
8
8
8
8
8
8
8
8
8
8
缺页标记
淘汰页号
4
1
7
4
2
3
共缺页中断10次
缺页率=缺页次数/总访问次数=10/15=66.67%
以此淘汰的页面号为:
4、1、7、4、2、3
5、自我评价与总结
本周我们进行了《操作系统》的课程设计,在拿到题目以后便着手准备,通过查阅课本和相关的资料,对本次课程设计要实现的功能有了深刻的了解,在此基础上写起实验代码变得心应手。
现将本次课程设计总结如下:
本次课程设计顺利的实现了对页面置换算法FIFO和OPT的模拟演示。
通过本次课程设计,加深了对操作系统的认识,了解了操作系统中各种资源分配算法的实现,特别是对虚拟存储,页面置换有了深入的了解,并能够用高级语言进行模拟演示。
页面置换算法FIFO和OPT理解起来相当容易,但在实际编程实现的时候需要注意各种细节,需要耐心细致,实际编程中遇到一些细节上的小问题确实需要仔细考虑才行。
从实验结果分析可知,OPT置换算法的效率要高于FIFO置换算法,这也符合理论分析。
遗憾的是,OPT算法无法在操作系统中实现,因为它要求必须预先知道每一个进程的访问串。
本次课程设计中的不足之处在于所采用的数据结构不够合理,输入的页面序列是保存在一个数组中,有最大长度的限制,应该采用像动态链表等数据结构,减少静态方法的限制。
通过一周紧张的课程设计,进一步的加深了对课本上知识的理解和掌握,更深的体会到了操作系统的构造性能在计算机系统中的重要性,更深贴的体会到了实践的重要性,只有将在课堂上学到的知识融入于实践中,才能锻炼我们的思维能力、培养我们学以致用灵感,在以后的学习中,在学好理论知识的同时,我会更加重视每一次实验,使自己能更好的将知识用于实践中。
最后,感谢在课程设计过程中给予我帮助的同学和在检查验收过程中提出本次课程设计中不足之处的老师,是你们的帮助和指正让我明白的自己的不足,谢谢你们!