📄 课程设计.cpp
字号:
#include<iostream.h>
#include<math.h>
class List;
class item
{
public:
friend class List;
private:
item(int p=0,int s=0,int b=0,int l=0,int c=0){page=p;sign=s;block=b;locate=l;changesign=c;next=NULL;}
item *next;
int page;
int sign;
int changesign;
int block;
int locate;
};
class List
{
public:
List(int p=0,int s=0,int b=0,int l=0,int c=0){list=new item(p,s,b,l,c);}
int check(int p);
int insert(int p,int s,int b,int l);
void print();
int append(int p,int s,int b,int l);
int length();
int alternative(int k,int p);
void reverse();
private:
item *list;
item *end();
};
int List ::alternative(int k,int p)
{
int n,m;
item *pt=list,*pr=list;
for(int temp=1;temp<=k;temp++)
{
pt=pt->next;
}
cout<<endl;
n=pt->block;
cout<<"被调换的页的页号为:"<<pt->page<<" 该页所对应的修改标志位为:"<<pt->changesign<<endl;
cout<<"被调入的页的页号为:"<<p<<endl;
cout<<"*****************************************"<<endl;
cout<<"请输入被调入页的磁盘地址:";
cin>>m;
for(;pr;pr=pr->next)
{
if(pr->locate==m)
{
cout<<"该磁盘地址已存有数据,请选择另外的磁盘地址进行存储:";
cin>>m;
pr=list;
}
}
//cout<<"++++++++++++++++++++++++++++++++++"<<endl;
pt->locate=m;
pt->page=p;
return n;
}
void List :: print()
{
if(list==0)
cout<<"页表中无数据!"<<endl;
cout<<"页号 标志 主存块号 修改标志 磁盘地址"<<endl;
item *pt=list;
while(pt)
{
cout<<" "<<pt->page<<" "<<pt->sign<<" "<<pt->block<<" "<<pt->changesign<<" "<<pt->locate<<endl;
pt=pt->next;
}
cout<<endl;
}
int List::append(int p,int s,int b,int l)
{
item *pt=new item(p,s,b,l);
if(list==0)
list=pt;
else
{
(end())->next=pt;
}
return 1;
}
item *List::end()
{
item *prv,*pt;
for(prv=pt=list;pt;prv=pt,pt=pt->next)
;
return prv;
}
int List::insert(int p,int s,int b,int l)
{
item *pt=new item(p,s,b,l);
pt->next=list;
list=pt;
return 1;
}
int List::length()
{
int cnt=0;
item *pt=list;
for(;pt;pt=pt->next,cnt++)
;
return cnt;
}
int List::check(int p)
{
item *pt=list;
int a=-1;
for(;pt;pt=pt->next)
{
if(pt->page==p&&pt->sign==1)
a=pt->block;
}
return a;
}
void List::reverse()
{
item *pt,*prv,*tmp;
prv=NULL;
pt=list;
list=end();
while(pt!=list)
{
tmp=pt->next;
pt->next=prv;
prv=pt;
pt=tmp;
}
list->next=prv;
}
int checkp(int n);
int main()
{
int j=0;
List list(0,1,5,11);
list.append(1,1,8,12);
list.append(2,1,9,13);
list.append(3,1,1,21);
//list.append(4,0,-1,22);
//list.append(5,0,-1,23);
//list.append(6,0,-1,121);
j=list.length();
cout<<"************************模拟FIFO页面调度算法处理缺页中断************************"<<endl;
cout<<"页表初始长度为:"<<j<<endl;
cout<<"++++++++++++++++++++++++++++页表初始状态如下+++++++++++++++++++++++++++++++"<<endl;
list.print();
char a[12]={'+','+','*','I','O','-','M','+','I','O','+','I'};
int b[12]={70,50,15,21,56,40,53,23,37,78,1,84};
int m=0,n;
int k=0;
int c=0;
for(int i=0;i<12;i++)
{
int t;
cout<<"*************************"<<"第"<<i+1<<"步["<<a[i]<<"]操作!"<<"*************************"<<endl;
cout<<"请输入该操作对应的页号:";
cin>>n;
cout<<"*************************************************"<<endl;
m=list.check(n);
t=checkp(n);
if(t==1)
{
if(m==-1)
{
cout<<"*缺页中断,页号:"<<n<<endl;
cout<<"****************调用FIFO页面调度算法处理中断**************";
c=list.alternative(k,n);
k=(k+1)%j;
cout<<"该页所在的主存块号为:"<<c<<endl;
cout<<"该指令的物理地址为:"<<n<<b[i]<<endl;
cout<<"********************"<<"中断处理后页表的状态"<<"*******************"<<endl;
}
else
{
cout<<"该指令的物理地址为:"<<n<<b[i]<<endl;
}
}
if(m!=-1&&t==0)
{
cout<<"该页所在主存块号:"<<m<<endl;
m*=128+b[i];
//cout<<"+++++++++++++++++++++++++++++++"<<endl;
cout<<"该指令的物理地址为:"<<m<<endl;
//cout<<"+++++++++++++++++++++++++++++++"<<endl;
}
else if(m==-1&&t==0)
{
cout<<"*缺页中断,页号:"<<n<<endl;
//cout<<"++++++++++++++++++++++++++++++++++";
cout<<"****************调用FIFO页面调度算法处理中断**************";
c=list.alternative(k,n);
k=(k+1)%j;
cout<<"该页所在的主存块号为:"<<c<<endl;
//cout<<"++++++++++++++++++++++++++++++++++"<<endl;
cout<<"该指令的物理地址为:"<<c*128+b[i]<<endl;
//cout<<"++++++++++++++++++++++++++++++++++"<<endl;
cout<<"********************"<<"中断处理后页表的状态"<<"*******************"<<endl;
}
else
;
list.print();
//cout<<"-------------------------------------------------------------------"<<endl;
}
return 1;
}
int checkp(int n)
{
int a=0;
int k=1;
for(int c=(int)sqrt(double (n))+2;c>=1;c--)
{
if(n==k)
a=1;
else
k=k*2;
}
return a;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -