⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 课程设计.cpp

📁 一个操作系统的课程设计!看了一定要下哦! 
💻 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 + -