计算机操作系统页面置换算法实验.docx
《计算机操作系统页面置换算法实验.docx》由会员分享,可在线阅读,更多相关《计算机操作系统页面置换算法实验.docx(21页珍藏版)》请在冰豆网上搜索。
计算机操作系统页面置换算法实验
计算机操作系统实验报告
实验题目:
页面置换算法
院系:
公共管理学院
班级:
信息管理与信息系统一班
姓名:
周晨妍
学号:
2014190314
指导老师:
匡林爱
日期:
2015年11月22日
一.题目要求:
设计一个虚拟存储区和内存工作区,编程序演示下述算法的具体实现过程,并计算访问命中率:
要求设计主界面以灵活选择某算法,且以下算法都要实现
1)最佳置换算法(OPT):
将以后永不使用的或许是在最长(未来)时间内不再被访问的页面换出。
2)先进先出算法(FIFO):
淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
3)最近最久未使用算法(LRU):
淘汰最近最久未被使用的页面。
4)时钟页面置换算法(Clock)
二.实验目的:
1、用C语言编写OPT、FIFO、LRU,Clock四种置换算法。
2、熟悉内存分页管理策略。
3、了解页面置换的算法。
4、掌握一般常用的调度算法。
5、根据方案使算法得以模拟实现。
6、锻炼知识的运用能力和实践能力。
三.相关知识:
1.虚拟存储器的引入:
局部性原理:
程序在执行时在一较短时间内仅限于某个部分;相应的,它所访问的存储空间也局限于某个区域,它主要表现在以下两个方面:
时间局限性和空间局限性。
2.虚拟存储器的定义:
虚拟存储器是只具有请求调入功能和置换功能,能从逻辑上对内存容量进行扩充的一种存储器系统。
3.虚拟存储器的实现方式:
分页请求系统,它是在分页系统的基础上,增加了请求调页功能、页面置换功能所形成的页面形式虚拟存储系统。
请求分段系统,它是在分段系统的基础上,增加了请求调段及分段置换功能后,所形成的段式虚拟存储系统。
4.页面分配:
平均分配算法,是将系统中所有可供分配的物理块,平均分配给各个进程。
按比例分配算法,根据进程的大小按比例分配物理块。
考虑优先的分配算法,把内存中可供分配的所有物理块分成两部分:
一部分按比例地分配给各进程;另一部分则根据个进程的优先权,适当的增加其相应份额后,分配给各进程。
5.页面置换算法:
常用的页面置换算法有OPT、FIFO、LRU、Clock、LFU、PBA等。
四.设计思想:
选择置换算法,先输入所有页面号,为系统分配物理块,依次进行置换:
OPT基本思想:
是用一维数组page[pSIZE]存储页面号序列,memery[mSIZE]是存储装入物理块中的页面。
数组next[mSIZE]记录物理块中对应页面的最后访问时间。
每当发生缺页时,就从物理块中找出最后访问时间最大的页面,调出该页,换入所缺的页面。
【特别声明】
若物理块中的页面都不再使用,则每次都置换物理块中第一个位置的页面。
FIFO基本思想:
是用队列存储内存中的页面,队列的特点是先进先出,与该算法是一致的,所以每当发生缺页时,就从队头删除一页,而从队尾加入缺页。
或者借助辅助数组time[mSIZE]记录物理块中对应页面的进入时间,每次需要置换时换出进入时间最小的页面。
LRU基本思想:
是用一维数组page[pSIZE]存储页面号序列,memery[mSIZE]是存储装入物理块中的页面。
数组flag[10]标记页面的访问时间。
每当使用页面时,刷新访问时间。
发生缺页时,就从物理块中页面标记最小的一页,调出该页,换入所缺的页面。
五.流程图:
如下页所示
6、作业表
表1、最佳置换算法
页面走向
1
2
3
4
1
2
5
1
2
3
4
5
物理快1
1
1
1
1
1
1
1
1
1
3
3
3
物理快2
2
2
2
2
2
2
2
2
2
4
4
物理快3
3
4
4
4
5
5
5
5
5
5
缺页中断
×
×
×
×
×
×
×
表2、先进先出置换算法
页面走向
1
2
3
4
1
2
5
1
2
3
4
5
物理快1
1
1
1
4
4
4
5
5
5
5
5
5
物理快2
2
2
2
1
1
2
1
1
3
3
3
物理快3
3
3
3
2
5
2
2
2
4
4
缺页中断
×
×
×
×
×
×
×
×
×
表3、最近最久未使用算法
页面走向
1
2
3
4
1
2
5
1
2
3
4
5
物理快1
1
1
1
4
4
4
5
5
5
3
3
3
物理快2
2
2
2
1
1
2
1
1
1
4
4
物理快3
3
3
3
2
5
2
2
2
2
5
缺页中断
×
×
×
×
×
×
×
×
×
×
表4、时钟页面置换算法
页面走向
1
2
3
4
1
2
5
1
2
3
4
5
物理快1
1
1
3
3
1
1
1
1
2
3
3
3
物理快2
2
2
2
2
2
5
5
5
5
5
5
物理快3
4
4
4
4
4
4
4
4
4
缺页中断
×
×
×
×
×
×
×
×
七、程序源代码
#include
usingnamespacestd;
voidPrint(intbc[],intblockCount)
{
for(inti=0;i{
cout<}
cout<}
boolTravel(intbc[],intblockCount,intx)
{
boolis_found=false;
inti;
for(i=0;i{
if(bc[i]==x)
{
is_found=true;
break;
}
}
returnis_found;
}
voidFIFO(intpc[],intbc[],intpageCount,intblockCount)
{
cout<<"0:
先进先出置换算法"<inti;
if(pageCount<=blockCount)
{
cout<<"缺页次数为"<<0<cout<<"缺页率为"<<0<}
else
{
intnoPage=0;
intp=0;
for(i=0;i{
cout<<"引用页:
"<if(!
Travel(bc,blockCount,pc[i]))
{
if(i{
bc[i]=pc[i];
}
else
{
if(p==blockCount)
{
p=0;
}
bc[p]=pc[i];
p++;
}
noPage++;
cout<<"物理快情况:
";
Print(bc,blockCount);
}
cout<}
cout<<"缺页次数为:
"<cout<<"缺页率为:
"<<(float)noPage/pageCount<}
}
intFoundMaxNum(inta[],intn)
{
intk,j;
k=a[0];
j=0;
for(inti=0;i{
if(a[i]>=k)
{
k=a[i];
j=i;
}
}
returnj;
}
voidLRU(intpc[],intbc[],intpageCount,intblockCount)
{
cout<<"1:
最近最久未使用算法"<if(pageCount<=blockCount)
{
cout<<"缺页次数为"<<0<cout<<"缺页率为"<<0<}
else
{
intnoPage=0;
inti,j,m;
int*bc1=newint[blockCount];
for(i=0;i{
bc1[i]=0;
}
for(i=0;i{
cout<<"引用页:
"<if(!
Travel(bc,blockCount,pc[i]))
{
if(i{
bc[i]=pc[i];
for(intp=0;p<=i;p++)
{
bc1[p]++;
}
}
else
{
for(j=0;j{
bc1[j]++;
}
intk=FoundMaxNum(bc1,blockCount);
bc[k]=pc[i];
bc1[k]=1;
}
noPage++;
cout<<"物理快情况:
";
Print(bc,blockCount);
}
elseif(Travel(bc,blockCount,pc[i]))
{
if(i{
for(j=0;j<=i;j++)
{
bc1[j]++;
}
for(m=0;m<=i;m++)
{
if(bc[m]==pc[i])
{
break;
}
}
bc1[m]=1;
bc[m]=pc[i];
}
else
{
for(j=0;j{
bc1[j]++;
}
for(m=0;m{
if(bc[m]==pc[i])
{
break;
}
}
bc1[m]=1;
bc[m]=pc[i];
}
}
cout<}
cout<<"缺页次数为:
"<cout<<"缺页率为:
"<<(float)noPage/pageCount<deletebc1;
}
}
voidOptiomal(intpc[],intbc[],intpageCount,intblockCount)
{
cout<<"2:
最佳置换算法"<if(pageCount<=blockCount)
{
cout<<"缺页次数为"<<0<cout<<"缺页率为"<<0<}
else
{
intnoPage=0;
inti,j,k;
for(i=0;i{
cout<<"引用页:
"<if(!
Travel(bc,blockCount,pc[i]))
{
if(i{
bc[i]=pc[i];
}
else
{
intmax=0;
intblockIndex;;
for(j=0;j{
for(k=i;k{
if(bc[j]==pc[k])
{
break;
}
}
if(k>=max)
{
max=k;
blockIndex=j;
}
}
bc[blockIndex]=pc[i];
}
noPage++;
cout<<"物理快情况:
";
Print(bc,blockCount);
}
cout<}
cout<<"缺页次数为:
"<cout<<"缺页率为:
"<<(float)noPage/pageCount<}
}
voidNRU(intpc[],intbc[],intpageCount,intblockCount)
{
cout<<"3:
时钟页面置换算法"<if(pageCount<=blockCount)
{
cout<<"缺页次数为"<<0<cout<<"缺页率为"<<0<}
else
{
intnoPage=0;
inti,j;
int*bc1=newint[blockCount];
for(i=0;i{
bc1[i]=0;
}
for(i=0;i{
cout<<"引用页:
"<if(!
Travel(bc,blockCount,pc[i]))
{
for(j=0;j{
if(bc1[j]==1)
{
bc1[j]=0;
}
elseif(bc1[j]==0)
{
break;
}
if(j==blockCount-1)
{
j=-1;
}
}
bc[j]=pc[i];
bc1[j]=1;
noPage++;
cout<<"物理快情况:
";
Print(bc,blockCount);
}
cout<}
cout<<"缺页次数为:
"<cout<<"缺页率为:
"<<(float)noPage/pageCount<deletebc1;
}
}
intmain()
{
intpageCount,blockCount,i;
/*cout<<*/printf("输入页面数:
");/*<cin>>pageCount;
int*pc=newint[pageCount];
/*cout<<*/printf("输入页面走向:
");/*<for(i=0;i{
cin>>pc[i];
}
/*cout<<*/printf("输入物理块数:
");/*<cin>>blockCount;
cout<<"0:
先进先出置换算法"<cout<<"1:
最近最久未使用算法"<cout<<"2:
最佳置换算法"<cout<<"3:
时钟页面置换算法"</*cout<<*/printf("按数字选择算法类别:
");/*<intn;
while(cin>>n)
{
if(n==0)
{
int*bc=newint[blockCount];
FIFO(pc,bc,pageCount,blockCount);
deletebc;
}
elseif(n==1)
{
int*bc=newint[blockCount];
LRU(pc,bc,pageCount,blockCount);
deletebc;
}
elseif(n==2)
{
int*bc=newint[blockCount];
Optiomal(pc,bc,pageCount,blockCount);
deletebc;
}
elseif(n==3)
{
int*bc=newint[blockCount];
for(i=0;i{
bc[i]=-1;
}
NRU(pc,bc,pageCount,blockCount);
deletebc;
}
elsebreak;
}
deletepc;
return0;
}
八、运行结果