页面置换算法
- 格式:doc
- 大小:51.00 KB
- 文档页数:6
#include "windows.h"
#include
#include
#include
#include
#include
#include
void initialize(); //初始化相关数据结构
void createps(); //随机生成访问序列
void displayinfo(); //显示当前状态及缺页情况
void fifo(); //先进先出算法
int findpage(); //查找页面是否在内存
void lru(); //最近最久未使用算法
int invalidcount = 0; // 缺页次数
int vpoint; //页面访问指针
int pageframe[10]; // 分配的页框
int pagehistory[10]; //记录页框中数据的访问历史
int rpoint; //页面替换指针
int inpflag; //缺页标志,0为不缺页,1为缺页
struct PageInfo //页面信息结构
{
int serial[100]; // 模拟的最大访问页面数,实际控制在20以上
int flag; // 标志位,0表示无页面访问数据
int diseffect; // 缺页次数
int total_pf; // 分配的页框数
int total_pn; // 访问页面序列长度
} pf_info;
////////////////////////////////////////////////////////////////////////
//初始化相关数据结构
void initialize()
{
int i,pf;
inpflag=0; //缺页标志,0为不缺页,1为缺页
pf_info.diseffect =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;
}
}
///////////////////////////////////////////////////////////////////
// 随机生成访问序列
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
{
pf_info.serial[i]=((float) rand() / 32767) * 16 ; //随机数的大小在0-15之间
}
}
////////////////////////////////////////////////////////////////////////
// 显示当前状态及缺页情况
void displayinfo(void)
{
int i,n;
if(vpoint==0)
{
printf("\n=============页面访问序列=============\n");
for(i=0; i
{
printf("%4d",pf_info.serial[i]);
if ((i+1) % 10 ==0) printf("\n"); //每行显示10个
}
printf("\n======================================\n");
}
printf("访问%3d : 内存<",pf_info.serial[vpoint]);
for(n=0;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/vpoint);
}
printf("\n");
}
////////////////////////////////////////////////////////////////////////
// 查找页面是否在内存,1为在内存,0为不在即缺页
int findpage(int page)
{
int n;
for(n=0;n
{
pagehistory[n] ++; // 访问历史加1
}
for(n=0;n
{
if (pageframe[n]==page )
{
inpflag=0 ; //inpflag缺页标志,0为不缺页,1为缺页
pagehistory[n]=0; //置访问历史为0
return 1;
}
}
inpflag=1; //页面不存在,缺页
return 0;
}
////////////////////////////////////////////////////////////////////////
// FIFO页面置换算法
void fifo(void)
{
int n,count,pstate;
rpoint=0; // 页面替换指针初始化为0
invalidcount = 0; // 缺页数初始化为0
createps(); // 随机生成访问序列
count=0; // 是否装满是所有的页框
for(n=0;n
{
pageframe[n]=-1;
}
inpflag=0; //缺页标志,0为不缺页,1为缺页
for(vpoint=0;vpoint
{
pstate=findpage(pf_info.serial[vpoint]); //查找页面是否在内存
if(count
{
if(pstate==0) // 页不存在则装入页面
{
pageframe[rpoint]=pf_info.serial[vpoint];
rpoint=(rpoint+1) % pf_info.total_pf;
count++;
}
}
else // 正常缺页置换
{
if(pstate==0) // 页不存在则置换页面
{
pageframe[rpoint]=pf_info.serial[vpoint];
rpoint=(rpoint+1) % pf_info.total_pf;
pf_info.diseffect++; // 缺页次数加1
}
}
Sleep(10);
displayinfo(); // 显示当前状态
} // 置换算法循环结束
_getch();
return;
}
///////////////////////////////////////////////////////////////////
// LRU页面置换算法
void lru(void)
{
int n,count,pstate,max;
rpoint=0; // 页面替换指针
invalidcount = 0; // 缺页次数初始化为0
createps(); // 随机生成访问序列
count=0; // 是否装满所有的页框
for(n=0;n
{
pageframe[n]=-1; // 清除页框信息
pagehistory[n]=0; // 清除页框历史
}
inpflag=0; //缺页标志,0为不缺页,1为缺页