📄 pages.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
#include<iomanip.h>
#include<time.h>
#include<ctype.h>
#define MAXpagesize 10
#define MAXmemorysize 10
#define MAXpmsize 10
#define MAXOPTnum 10
struct pagetable
{
int pagenum; //页号
int memorynum;//块号
int state;//状态位
}pag[MAXpagesize];
struct OPTN
{
int OPT_logicalad;//OPT中连续i输入的逻辑地址
int OPT_shang;//OPT中由逻辑地址求得的商
}OPTnum[MAXOPTnum];
int memory[MAXmemorysize]; //用数组表示内存
int temmap[8][8]; //定义8*8的位示图
int pagelength,memorylength,pmlength;//定义页表长度 内存长度 块长
int visit,hit,lackpage,instead; //定义访问,命中,缺页,置换 次数
int logicalad,physicalad,shang,yu;
float hitRate,lackpageRate; //命中率, 缺页率
void PagetableResult()
{
cout<<"页表:"<<endl;
cout<<setw(17)<<"页号"<<setw(7)<<"块号"<<setw(7)<<"状态位"<<endl;
for(int i=0;i<pagelength;i++)
cout<<setw(17)<<pag[i].pagenum<<setw(7)<<pag[i].memorynum<<setw(7)<<pag[i].state<<endl;
}
void MemoryResult()
{
cout<<"内存:"<<endl;
cout<<setw(17)<<"序号"<<setw(7)<<"页号"<<endl;
for(int i=0;i<memorylength;i++)
cout<<setw(17)<<i<<setw(7)<<memory[i]<<endl;
}
void TemmapResult()
{
cout<<"位示图:"<<endl;
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
if(j/7==1)
cout<<setw(3)<<temmap[i][j]<<endl;
else if(j==0)
cout<<setw(15)<<temmap[i][j];
else
cout<<setw(3)<<temmap[i][j];
}
void PrintResult()
{
cout<<"------------当前页面内存信息-----------"<<endl;
PagetableResult();
MemoryResult();
TemmapResult();
cout<<"---------------------------------------"<<endl;
}
void PagetableInitialize()
{
for(int i=0;i<pagelength;i++)
{
pag[i].pagenum=i;
pag[i].memorynum=-1;
pag[i].state=0;
}
}
void MemoryInitialize()
{
for(int i=0;i<memorylength;i++)
memory[i]=-1;
}
void TemmapInitialize()
{
srand((unsigned)time(0));;//随机数种子。
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
if(i==0)
temmap[i][j]=1;
else
temmap[i][j]=rand()%2; //随机赋予1或0
}
void Initialize() //初始化页表,内存,位示图
{
PagetableInitialize();
MemoryInitialize();
TemmapInitialize();
}
void VisitMessage()
{
cout<<"-------当前参数信息--------"<<endl;
printf("商:%d 余数:%d\n",shang,yu);
cout<<"10进制 逻辑地址:"<<logicalad<<" 物理地址:"<<physicalad<<endl;
printf("16进制 逻辑地址:%x 物理地址:%x\n",logicalad,physicalad);
cout<<"命中次数:"<<hit<<"置换次数:"<<instead<<"缺页次数:"<<lackpage<<"访问次数:"<<visit<<endl;
cout<<"命中率:"<<hitRate<<"%"<<" 缺页率:"<<lackpageRate<<"%"<<endl;
cout<<"---------------------------"<<endl;
}
int judge_memory() //判断内存是否已经满,满返回-1,否则返回第一个空位序号
{
int jud;
for(int i=0;i<memorylength;i++)
if(memory[i]==-1)
{
jud=i; break;
}
else
jud=-1;
return jud;
}
void change_temmap() /*有问题待修改*/
{
int judc=0,hang,lie;
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
if(temmap[i][j]==0)
{
hang=i;
lie=j;
temmap[i][j]=1;
judc=1;
break; //跳出第二层循环
}
if(judc==1)
break; //跳出第一层循环
}
if(judc==0)
cout<<"提示:位示图全为1,更改失败!"<<endl;
else
cout<<"将位示图第"<<hang<<"行第"<<lie<<"列置1成功。"<<endl;
pag[shang].memorynum=hang*7+lie+1;
}
void change_temmap0(int pag_memorynum)
{
int hang,lie;
hang=pag_memorynum/8;
lie=pag_memorynum%8;
temmap[hang][lie]=0;
cout<<"将位示图第"<<hang<<"行第"<<lie<<"列置0成功。"<<endl;
}
void FIFO()
{
char flag='Y';
logicalad=0;
physicalad=0;
shang=0;
yu=0;
hit=0;
lackpage=0;
instead=0; //初始化各参数状态
visit=0;
hitRate=0;
lackpageRate=0;
Initialize(); //初始化页表,内存,位示图
PrintResult();
cout<<"---------FIFO页面置换算法---------"<<endl;
while((flag!='N')&&(flag!='n'))
{
printf("请输入逻辑地址:");
scanf("%x",&logicalad);
shang=logicalad/(pmlength*1024);
yu=logicalad%(pmlength*1024);
if(shang<pagelength)
{
if(pag[shang].state==0) //如果状态位为0
{
if(judge_memory()!=-1) //一直缺页状态,判断内存存在空,否则满
{
pag[shang].state=1;
memory[judge_memory()]=pag[shang].pagenum;
change_temmap();
physicalad=pag[shang].memorynum*pmlength+yu;
}
else //置换状态
{
pag[memory[0]].state=0;
change_temmap0(pag[memory[0]].memorynum);//将页表块号中对应的位示图置0
pag[memory[0]].memorynum=-1;
for(int i=0;i<memorylength;i++)
if(i==memorylength-1)
memory[i]=pag[shang].pagenum;
else
memory[i]=memory[i+1];
pag[shang].state=1;
change_temmap();
instead++;
physicalad=pag[shang].memorynum*pmlength+yu;
}
lackpage++;
visit++;
hitRate=(float)hit/visit*100;
lackpageRate=(float)lackpage/visit*100;
}
else //状态位为1即命中一次
{
hit++;
visit++;
hitRate=(float)hit/visit*100;
lackpageRate=(float)lackpage/visit*100;
}
}
else
cout<<"提示:输入的逻辑地址溢出。"<<endl;
PrintResult();
VisitMessage();
cout<<"是否继续FIFO?(Y/N)";
cin>>flag;
}
}
void LRU()
{
char flag='Y';
logicalad=0;
physicalad=0;
shang=0;
yu=0;
hit=0;
lackpage=0;
instead=0; //初始化各参数状态
visit=0;
hitRate=0;
lackpageRate=0;
Initialize(); //初始化页表,内存,位示图
PrintResult();
cout<<"---------LRU页面置换算法---------"<<endl;
while((flag!='N')&&(flag!='n'))
{
printf("请输入逻辑地址:");
scanf("%x",&logicalad);
shang=logicalad/(pmlength*1024);
yu=logicalad%(pmlength*1024);
if(shang<pagelength)
{
if(pag[shang].state==0) //如果状态位为0
{
if(judge_memory()!=-1) //一直缺页状态,判断内存存在空,否则满
{
pag[shang].state=1;
memory[judge_memory()]=pag[shang].pagenum;
change_temmap();
physicalad=pag[shang].memorynum*pmlength+yu;
}
else //置换状态
{
pag[memory[0]].state=0;
change_temmap0(pag[memory[0]].memorynum);//将页表块号中对应的位示图置0
pag[memory[0]].memorynum=-1;
for(int i=0;i<memorylength;i++)
if(i==memorylength-1)
memory[i]=pag[shang].pagenum;
else
memory[i]=memory[i+1];
pag[shang].state=1;
change_temmap();
instead++;
physicalad=pag[shang].memorynum*pmlength+yu;
}
lackpage++;
visit++;
hitRate=(float)hit/visit*100;
lackpageRate=(float)lackpage/visit*100;
}
else //状态位为1即命中一次
{
int memorytemp;
memorytemp=memory[0];
for(int i=0;i<memorylength;i++) //将命中页置顶
if(i==memorylength-1)
memory[i]=memorytemp;
else
memory[i]=memory[i+1];
hit++;
visit++;
hitRate=(float)hit/visit*100;
lackpageRate=(float)lackpage/visit*100;
}
}
else
cout<<"提示:输入的逻辑地址溢出。"<<endl;
PrintResult();
VisitMessage();
cout<<"是否继续LRU?(Y/N)";
cin>>flag;
}
}
int MaxOPTmi(int OPTmi[MAXmemorysize]) //返回数组最大值的下标
{
int MaxOPTmi=OPTmi[0],maxj=0;
for(int i=0;i<memorylength;i++)
if(MaxOPTmi<OPTmi[i])
{
MaxOPTmi=OPTmi[i];
maxj=i;
}
return maxj;
}
void OPT()
{
cout<<"---------OPT页面置换算法---------"<<endl;
cout<<" 实际应用中无法实现,仅供参数比较 "<<endl;
cout<<"---------------------------------"<<endl;
char flag='Y',OPTflag='Y';
int find=0; //如果OPTmi[]在后面的OPTnum[OPTi].OPT_shang中则置1
int OPTi=0,MaxOPTi,OPTmi[MAXmemorysize],MaxOPTmor; //MaxOPTmor 存储要替换的memory[]的数组下标
logicalad=0;
physicalad=0;
shang=0;
yu=0;
hit=0;
lackpage=0;
instead=0; //初始化各参数状态
visit=0;
hitRate=0;
lackpageRate=0;
Initialize(); //初始化页表,内存,位示图
PrintResult();
while((OPTflag!='N')&&(OPTflag!='n'))
{
printf("请输入逻辑地址:");
scanf("%x",&OPTnum[OPTi].OPT_logicalad);
OPTnum[OPTi].OPT_shang=OPTnum[OPTi].OPT_logicalad/(pmlength*1024);
MaxOPTi=OPTi;
if(OPTi<MAXOPTnum)
{
cout<<"还可以输入"<<MAXOPTnum-OPTi-1<<"个逻辑地址。"<<endl;
cout<<"是否继续输入?(Y/N)";
cin>>OPTflag;
}
else
OPTflag='N';
OPTi++;
}
OPTi=0;
while((flag!='N')&&(flag!='n'))
{
logicalad=OPTnum[OPTi].OPT_logicalad;
shang=OPTnum[OPTi].OPT_shang;
yu=logicalad%(pmlength*1024);
if(shang<pagelength)
{
if(pag[shang].state==0) //如果状态位为0
{
if(judge_memory()!=-1) //一直缺页状态,判断内存存在空,否则满
{
pag[shang].state=1;
memory[judge_memory()]=pag[shang].pagenum;
change_temmap();
physicalad=pag[shang].memorynum*pmlength+yu;
}
else //置换状态
{
for(int i=0;i<memorylength;i++)
{
for(int j=OPTi+1;j<MaxOPTi;j++)
if(memory[i]==OPTnum[j].OPT_shang)
{
find=1;
OPTmi[i]=j;
break;
}
else if((j==MaxOPTi-1)&&(memory[i]!=OPTnum[j].OPT_shang))
{
find=0;
MaxOPTmor=i;
break;
}
else find=0;
}
if(find==1)
MaxOPTmor=MaxOPTmi(OPTmi); //求出将来最久要访问的memory[i];即最大OPTmi
pag[memory[MaxOPTmor]].state=0;
change_temmap0(pag[memory[MaxOPTmor]].memorynum);//将页表块号中对应的位示图置0
pag[memory[MaxOPTmor]].memorynum=-1;
memory[MaxOPTmor]=pag[shang].pagenum; //内存置换
pag[shang].state=1;
change_temmap();
instead++;
physicalad=pag[shang].memorynum*pmlength+yu;
}
lackpage++;
visit++;
hitRate=(float)hit/visit*100;
lackpageRate=(float)lackpage/visit*100;
}
else //状态位为1即命中一次
{
hit++;
visit++;
hitRate=(float)hit/visit*100;
lackpageRate=(float)lackpage/visit*100;
}
}
else
cout<<"提示:输入的逻辑地址溢出。"<<endl;
PrintResult();
VisitMessage();
if(OPTi<MaxOPTi)
{
cout<<"剩余"<<MaxOPTi-OPTi<<"个逻辑地址。"<<endl;
cout<<"是否继续OPT?(Y/N)";
cin>>flag;
}
else
flag='N';
OPTi++;
}
}
void main()
{
int sel;
char ch='Y';
cout<<"--------------存储管理模拟系统--------------"<<endl;
cout<<"模拟存储管理,输出页表,内存和位示图"<<endl;
cout<<" 作者:billdong 时间:2006.10"<<endl;
cout<<"--------------------------------------------"<<endl;
for(;;)
{
cout<<"请输入页表长度: ";
cin>>pagelength; cout<<endl;
if(pagelength>MAXpagesize)
cout<<"提示:页表长度大了,请重新输入!"<<endl;
else break;
}
for(;;)
{
cout<<"请输入内存长度: ";
cin>>memorylength; cout<<endl;
if(memorylength>MAXmemorysize)
cout<<"提示:内存长度大了,请重新输入!"<<endl;
else break;
}
for(;;)
{
cout<<"请输入页块长度(KB): ";
cin>>pmlength; cout<<endl;
if(pmlength>MAXpmsize)
cout<<"提示:页块长度大了,请重新输入!"<<endl;
else break;
}
while((ch!='N')&&(ch!='n'))
{
cout<<"--------------请选择页面置换算法--------------"<<endl;
cout<<"1.FIFO 2.LRU 3.OPT "<<endl;
cout<<"----------------------------------------------"<<endl;
cin>>sel; cout<<endl;
switch(sel)
{
case 1: FIFO();
break;
case 2: LRU();
break;
case 3: OPT();
break;
default:cout<<"提示:输入错误!"<<endl;
break;
}
cout<<"是否切换置换算法以继续(Y/N)";
cin>>ch;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -