📄 分页式存储管理.cpp
字号:
Visited++;
As++;
}
if(q[num-1].PageAddress!=-1)
{
p[q[0].PageAddress].PhyAddress=NULL;
p[q[0].PageAddress].Sign=0;
for(int i=0;i<num-1;i++)
q[i].PageAddress=q[i+1].PageAddress;
q[num-1].PageAddress=h;
}
else
{
for(int i=0;i<num;i++)
{
if(q[i].PageAddress==-1)
{
q[i].PageAddress=h;
break;
}
}
}
}
else if(p[h].Sign==1)
{
Visited++;
if(q[num-1].PageAddress!=-1)
for(int k=0;k<num;k++)
{
if(q[k].PageAddress==h)
{
for(int s=k;s<num-1;s++)
q[s].PageAddress=q[s+1].PageAddress;
q[num-1].PageAddress=h;
}
}
else
{
for(int k=0;k<num-1;k++)
{
if(q[k].PageAddress==h)
for(int s=k;s<num-1;s++)
q[s].PageAddress=q[s+1].PageAddress;
}
for(int r=0;r<num-1;r++)
{
if(q[r].PageAddress==-1)
{
q[r].PageAddress=h;
break;
}
}
}
}
//************************************************************************************
//************************************************************************************输出信息
cout<<"\n\n\t\t----------系统使用情况----------"<<endl;
cout<<"\n输入地址:"<<w<<"\t\t页号:"<<h<<"\n偏移地址:"<<offset<<"\t\t物理地址:"<<offset+size*1024*p[h].PhyAddress<<"\n页面大小:"<<size<<"k";
cout<<"\t\t访问数目:"<<Visited<<"\n缺页数目:"<<As;
cout<<"\t\t缺页率:"<<(int)(As*100)/Visited<<"%"<<endl;
cout<<"\n页表信息:"<<endl; //输出页表信息
cout<<"\t------------"<<"-------"<<endl;
cout<<"\t| |"<<" |"<<endl;
if(p[0].PhyAddress!=NULL)
cout<<"0"<<"\t| "<<p[0].PhyAddress<<"\t |"<<" "<<p[0].Sign<<"\t |"<<endl;
else
cout<<"0"<<"\t| "<<"\t |"<<" "<<p[0].Sign<<"\t |"<<endl;
cout<<"\t| |"<<" |"<<endl;
cout<<"\t------------"<<"-------"<<endl;
for(int i=1;i<length;i++)
{
cout<<"\t| |"<<" |"<<endl;
if(p[i].PhyAddress!=NULL)
cout<<i<<"\t| "<<p[i].PhyAddress<<"\t |"<<" "<<p[i].Sign<<"\t |"<<endl;
else
cout<<i<<"\t| "<<"\t |"<<" "<<p[i].Sign<<"\t |"<<endl;
cout<<"\t| |"<<" |"<<endl;
cout<<"\t------------"<<"-------"<<endl;
}
cout<<"\n内存信息:"<<endl; //输出内存信息
for(int j=num-1;j>0;j--)
{
cout<<"\t------------"<<endl;
cout<<"\t| |"<<endl;
if(q[j].PageAddress!=-1)
cout<<j<<"\t| "<<q[j].PageAddress<<"\t |"<<endl;
else
cout<<j<<"\t| "<<"\t |"<<endl;
cout<<"\t| |"<<endl;
}
cout<<"\t------------"<<endl;
cout<<"\t| |"<<endl;
if(q[0].PageAddress!=-1)
cout<<j<<"\t| "<<q[0].PageAddress<<"\t |"<<endl;
else
cout<<j<<"\t| "<<"\t |"<<endl;
cout<<"\t| |"<<endl;
cout<<"\t------------"<<endl;
// cout<<"\n\n\t\t----------系统使用情况----------"<<endl;
cout<<"\n\t\t----------输出完毕!-------------\n"<<endl;
//************************************************************************************输出信息
//************************************************************************************
}
do{
cout<<"\n\n(想退出请输入'#',继续请输入'!',完全退出请输入'@',清屏请输入'c'):";
cin>>ch;
if(ch=='#')
{
cout<<"\n\n\t\t----------以下是OPT算法----------"<<endl;
OPT();
cout<<"\n\t\t----------OPT输出完毕!----------"<<endl;
Found();
}
else if(ch=='@')
{
cout<<"\n\n\t\t----------以下是OPT算法----------"<<endl;
OPT();
cout<<"\n\t\t----------OPT输出完毕!----------"<<endl;
exit(0);
}
else if(ch=='c'||ch=='C')
Cls();
else
break;
}while(ch);
}
}
void Found()
{
int bitmap[8][8]={{1,1,1,1,1,1,1,1}, //位示图
{0,1,0,1,0,1,0,1},
{0,0,0,1,1,0,1,0},
{1,1,0,0,1,0,1,0},
{0,1,0,1,1,1,0,1},
{0,0,0,1,1,1,0,0},
{1,1,1,1,1,0,0,0},
{0,0,0,1,1,1,0,0}};
char ch;
// OPT();
Help();
cout<<"\n请输入页表长度:";
cin>>length;
cout<<"请输入内存块数:";
cin>>num;
//****************************************************************动态申请数组,结构体
p=new PageTable[length]; //申请页表空间长度
p2=new PageTable[length]; //申请页表空间长度
q=new Memory[num]; //申请内存长度
q2=new Memory[num]; //申请内存长度
buffer=new int[length];
max=new int[num];
//****************************************************************
for(int i=0;i<length;i++)
{
p[i].Sign=0; //将页表的标志位全部置0
p[i].PhyAddress=NULL;
p2[i].Sign=0; //将页表的标志位全部置0
p2[i].PhyAddress=NULL;
buffer[i]=-1;
}
for(int j=0;j<num;j++)
{
q[j].PageAddress=-1; //初始化内存中的值
q2[j].PageAddress=-1; //初始化内存中的值
max[j]=0;
}
cout<<"请输入内存空间大小(该内存空间单位为K)";
cin>>size;
cout<<"请选择您所使用的算法(F为FIFO算法,L为LRU算法):";
cin>>ch;
while(ch)
{
if(ch=='f'||ch=='F')
FIFO(length,num,size,bitmap);
else if(ch=='l'||ch=='L')
LRU(length,num,size,bitmap);
else
{
cout<<"\n输入错误,请重新输入!"<<endl;
cout<<"请选择您所使用的算法(F为FIFO算法,L为LRU算法):";
cin>>ch;
}
}
}
void Cls()
{
system("cls");
}
void OPT()
{
int lack3=0;
int m3=0;
int f3=0;
bool fig3=true;
cout<<"页表序列:"<<endl;
for(int i=0;i<Visited;i++)
{
/* if(buffer[i]==-1)
break;
*/
cout<<buffer[i]<<"\t"; //显示页号序列
}
cout<<endl;
cout<<"栈的变化情况:"<<endl;
// cout<<endl;
cout<<"(栈底--->栈顶)"<<endl;
for(int j=0;j<Visited;j++) //对每个页面 buffer[j] 作同样处理
{
int sign=0;
int k=0;
int c;
int value=0;
int n=0;
int flag=0;
while(n<num) // 查找,是否命中
{
if(buffer[j]==q2[n].PageAddress)
{
flag=1;
break;
}
n++;
}
if(flag==0) //没有命中
{
lack3++;
while(k<num) // 先看内存堆栈是否满
{
if(q2[k].PageAddress==-1)
{
sign=1;
break;
}
k++;
}
if(sign==1) //栈未满(只执行前几次)
{
q2[m3].PageAddress=buffer[j];
m3++;
//------------------------------------------------------------------------------
p2[buffer[j]].PhyAddress= p[f3].PhyAddress;
//------------------------------------------------------------------------------
p2[buffer[j]].Sign=1;
f3++;
}
else //栈满
{
cout<<"要换入的页号: "<<buffer[j]<<endl;
int tag=0;
for(int s=0;s<num;s++) //查找要置换的那一页 memory3[s]
{
for(int t=j;t<Visited;t++) //从此页号开始查找
{
if(buffer[t]==q2[s].PageAddress)
{
max[s]=t; //记录此页号要出现的位置
break;
}
if(t==Visited-1) //此页 memory3[s] 再也不会出现
{
max[s]=Visited;
}
}
}
int a=max[0]; //比较现在在内存中的页号的查找结果
for(int v=0;v<num;v++)
{
if(a<max[v])
{
value=1; //标记是否进入此条件语句
a=max[v];
c=v; //要换出的堆栈的号(最大值)
}
}
if(value==1)
s=c;
else
s=0;
cout<<"要换出的页号: "<<q2[s].PageAddress<<endl;
p2[buffer[j]].PhyAddress=p2[q2[s].PageAddress].PhyAddress;
p2[buffer[j]].Sign=1;
p2[q2[s].PageAddress].PhyAddress=NULL;
p2[q2[s].PageAddress].Sign=0;
q2[s].PageAddress=buffer[j];
}
}
if(fig3==true)
{
for(int b=0;b<num;b++)
{
if(b==0)
cout<<"\t--------";
else
cout<<"--------";
}
cout<<endl;
}
for(int d=0;d<num;d++)
/*
cout<<"-----"<<endl;
cout<<"| "<<q2[l].PageAddress<<" ";*/
cout<<"\t| ";
cout<<"\t|"<<endl;
for(int l=0;l<num;l++)
{
if(q2[l].PageAddress==-1)
cout<<"\t| ";
else
cout<<"\t| "<<q2[l].PageAddress;
}
cout<<"\t|"<<endl;
for(int g=0;g<num;g++)
cout<<"\t| ";
cout<<"\t|"<<endl;
for(int b=0;b<num;b++)
{
if(b==0)
cout<<"\t--------";
else
cout<<"--------";
}
cout<<endl;
fig3=false;
}
cout<<"\n缺页数:"<<lack3<<"\t缺页率:"<<(lack3*100)/Visited<<"%"<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -