1、 实验五、 请求页式存储管理得模拟 [实验内容]: 熟悉虚拟存储管理得各种页面置换算法,并编写模拟程序实现请求页式存储管理得页面置换算法-——-最近最久未使用算法(LRU),要求在每次产生置换时显示页面分配状态与缺页率。 [实验要求]: 1、运行给出得实验程序,查瞧执行情况,进而分析算法得执行过程,在理解FIFO页面置换算法与最近最久未使用算法(LRU)置换算法后,给出最佳置换算法得模拟程序实现,并集成到参考程序中。 2、执行2个页面置换模拟程序,分析缺页率得情况。最好页框数与访问序列长度可调节,在使用同一组访问序列数
2、据得情况下,改变页框数并执行2个页面置换模拟程序,查瞧缺页率得变化。
3、在每次产生置换时要求显示分配状态与缺页率.程序得地址访问序列通过随机数产生,要求具有足够得长度。最好页框数与访问序列长度可调节。
实验得执行结果如下图所示(左下图为FIFO执行结果,右下图为LRU执行结果):
程序源代码:
#include
#i
3、nclude
4、t pageframe[10]; // 分配得页框 int pagehistory[10]; //记录页框中数据得访问历史 int rpoint; //页面替换指针 int inpflag; //缺页标志,0为不缺页,1为缺页 struct PageInfo //页面信息结构 { int serial[100]; // 模拟得最大访问页面数,实际控制在20以上 int flag; // 标志位,0表示无页面访问数据 int diseffect;
5、 // 缺页次数 int total_pf; // 分配得页框数 int total_pn; // 访问页面序列长度 } pf_info; //////////////////////////////////////////////////////////////////////// //初始化相关数据结构 void initialize() { ﻩint i,pf; ﻩinpflag=0; //缺页标志,0为不缺页,1为缺页 ﻩpf_info、diseffect =
6、0; // 缺页次数 pf_info、flag =0; // 标志位,0表示无页面访问数据 ﻩprintf("\n请输入要分配得页框数:"); // 自定义分配得页框数 scanf("%d",&pf); ﻩpf_info、total_pf =pf; for(i=0;i<100;i++) // 清空页面序列 ﻩ{ pf_info、serial[i]=-1; } } /////////////////////////////////////////////////////////////////// //
7、随机生成访问序列 void createps(void ) { int s,i,pn; initialize(); //初始化相关数据结构 printf(”\n请输入要随机生成访问序列得长度:”); //自定义随机生成访问序列得长度 scanf("%d",&pn); srand(rand()); //初始化随机数队列得”种子” s=((float) rand() / 32767) * 50 + pn; // 随机产生页面序列长度 ﻩpf_info、total_pn = s; ﻩfor(i=0;i〈s;i++) //产
8、生随机访问序列 { ﻩpf_info、serial[i]=((float) rand() / 32767) * 16 ; //随机数得大小在0—15之间 } } //////////////////////////////////////////////////////////////////////// // 显示当前状态及缺页情况 void displayinfo(void) { int i,n; if(vpoint==0) { ﻩ printf("\n=============页面访问序列=
9、============\n”);
for(i=0; i 10、 for(n=0;n<pf_info、total_pf;n++) // 页框信息
{
if (pageframe[n] 〉=0)
ﻩ printf(”%3d”,pageframe[n]);
else
printf(” ”);
}
printf(" >");
if(inpflag==1) //缺页标志,0为不缺页,1为缺页
{
printf(" ==〉缺页 ");
printf(”缺页率%3.1f",(float)(pf_info、diseffect)*100、00 11、/vpoint);
}
printf("\n");
}
////////////////////////////////////////////////////////////////////////
// 查找页面就是否在内存,1为在内存,0为不在即缺页
int findpage(int page)
{
ﻩint n;
for(n=0;n〈pf_info、total_pf;n++)
ﻩ{
pagehistory[n] ++; // 访问历史加1
}
ﻩfor(n=0;n 12、 if (pageframe[n]==page )
{
ﻩﻩ inpflag=0 ; //inpflag缺页标志,0为不缺页,1为缺页
pagehistory[n]=0; //置访问历史为0
return 1;
ﻩ }
}
inpflag=1; ﻩ//页面不存在,缺页
return 0;ﻩ
}
////////////////////////////////////////////////////////////////////////
// FIFO页面置换算法
void fifo(void 13、)
{
int n,count,pstate;
rpoint=0; // 页面替换指针初始化为0
invalidcount = 0; // 缺页数初始化为0
createps(); // 随机生成访问序列
count=0; // 就是否装满就是所有得页框
for(n=0;n〈pf_info、total_pf;n++) // 清除页框信息
{
pageframe[n]=-1;
}
inpflag=0; //缺页标志,0为不缺页,1为缺页
for(vpoint=0; 14、vpoint<pf_info、total_pn;vpoint++) // 执行算法
{
ﻩ pstate=findpage(pf_info、serial[vpoint]); //查找页面就是否在内存
ﻩ if(count<pf_info、total_pf) // 开始时不计算缺页
{
ﻩ if(pstate==0) // 页不存在则装入页面
{
ﻩ pageframe[rpoint]=pf_info、serial[vpoint];ﻩ
ﻩﻩrpoint=(rpoint+1) % pf_info、total_pf; ﻩ ﻩ
15、ﻩﻩﻩcount++;
ﻩ }
}ﻩ
ﻩ else // 正常缺页置换
ﻩ {
ﻩﻩ if(pstate==0) // 页不存在则置换页面
ﻩﻩ {
ﻩ ﻩpageframe[rpoint]=pf_info、serial[vpoint];ﻩ ﻩ
ﻩﻩﻩﻩrpoint=(rpoint+1) % pf_info、total_pf;ﻩﻩ ﻩﻩ
ﻩ ﻩpf_info、diseffect++; // 缺页次数加1ﻩﻩ ﻩ ﻩ
}
ﻩ }
Sleep(10);
16、
ﻩ displayinfo(); // 显示当前状态
} // 置换算法循环结束
getch();
return;
}
///////////////////////////////////////////////////////////////////
// LRU页面置换算法
void lru(void)
{
int n,count,pstate,max;
rpoint=0; 17、 // 页面替换指针
invalidcount = 0; // 缺页次数初始化为0
createps(); // 随机生成访问序列
count=0; // 就是否装满所有得页框
for(n=0;n<pf_info、total_pf;n++)
{
ﻩ pageframe[n]=-1; // 清除页框信息
ﻩ pagehistory[n]=0; // 清除页框历史
}
inpflag=0; //缺页标志,0为不缺页,1为缺页
for(vpoint=0;vpoint<pf_info、tota 18、l_pn;vpoint++) // 执行算法
{
pstate=findpage(pf_info、serial[vpoint]); //查找页面就是否在内存
if(count〈pf_info、total_pf) // 开始时不计算缺页
ﻩ {
if(pstate==0) // 页不存在则装入页面
ﻩ {
ﻩﻩﻩpageframe[rpoint]=pf_info、serial[vpoint]; //把要调入得页面放入一个空得页框里
ﻩﻩﻩrpoint=(rpoint+1) % pf_info、total_pf;ﻩ
19、 ﻩﻩcount++;
ﻩﻩ }
}
else // 正常缺页置换
{
ﻩ if(pstate==0)// 页不存在则置换页面
{
max=0;
for(n=1;n〈pf_info、total_pf;n++)
ﻩﻩ {
ﻩﻩﻩ if(pagehistory[n]>pagehistory[max])
ﻩ ﻩ{
ﻩﻩ max=n;
ﻩﻩ}
ﻩ }
ﻩ ﻩ rpoint=max;
ﻩ pageframe[rpoint]=pf_info、serial[vpoint];
ﻩﻩ p 20、agehistory[rpoint]=0;
ﻩﻩﻩ pf_info、diseffect++; // 缺页次数加1 ﻩ
ﻩ }
ﻩ }
Sleep(10);
ﻩ displayinfo(); // 显示当前状态
} ﻩ// 置换算法循环结束
_getch();
return;
}
///////////////////
//最佳置换算法
自己完成
///////////////////////////////////////////////////////////////////
// 主函数
int mai 21、n()
{
char ch;
system("cls") ;
while ( true )
{
printf("*******************************************\n”);
printf(” 若要执行FIFO页面置算法请按1\n”);
printf(” 若要执行LRU 页面置算法请按2\n");
printf(” 若要退出请按3\n") ;
printf(”*************************** 22、***************\n");
printf( "Enter your choice (1 or 2 or 3): ");
do
{ //如果输入信息不正确,继续输入
ch = (char)getch() ;
}while(ch != ’1' && ch != ’2'&& ch != '3');
printf(”\n\n您按得就是:%c ,现在为您执行对应操作.",ch);
if(ch == ’3') //选择3,退出
{
return 0;
}
ﻩelse
{
ﻩif(ch = 23、 '1’) //选择1,FIFO
ﻩ {
ﻩ printf("\n\n-—----—--—*****执行FIFO算法*****-—-——--—-—-\n");
fifo();
ﻩ}
else
ﻩ{
ﻩ printf("\n\n—----—---—*****执行LRU算法*****—----—-—--\n”);
//lru();
}
}
system("cls”) ;
}
printf(”\n\nPress Any Key To Continue:");
getch() ;
return 0;
}






