用分页管理,使用位示图实现主存的分配与回收 第2页

采用分页管理,使用位示图实现主存的分配与回收 第2页
  }
  cout<<endl;
 }
 cout<<"-----------------------------------"<<endl;
}
void map_work()//计算并将作业装入内存
{
int k=0;
int FNUMBER;
NUMBER=file.FileSize/LENGTH;
if((file.FileSize%LENGTH)>0||(file.FileSize/LENGTH)<8)
{NUMBER=NUMBER+1;}//计算输入的文件分割后的块数
FNUMBER=NUMBER;
   for(int i=0;i<N;i++)
   {
    for(int j=0;j<N;j++)
    {
       if(MAP[i][j]==0)
       {
       FREE++;
     
       }
    }
   
   }
  if(file.FileSize<=FREE*8)//判断主存是否能够分配
  {
         
   for(int i=0;i<N;i++)
   {
    for(int j=0;j<N;j++)
    {
       if(MAP[i][j]==0&&FNUMBER>0)
       {
       
        MAP[i][j]=1;
        FNUMBER--; 
        file.FileKuaiNumber[k]=i*8+j;
                     k++;
       }
    }
   
   }
   map_state();
   PageTable();
  }
  else
  {
   cout<<"申请空间大于系统所剩空间!"<<endl;
  }

}
void PageTable()//页表
{
 cout<<"页表状态如下表:"<<endl;
 cout<<"---------------------------"<<endl;
    cout<<"页号"<<"      |      "<<"块号"<<endl;
  for(int i=0;i<NUMBER;i++)
  {
   cout<<"---------------------------"<<endl;
    cout<<i<<"         |      "<<file.FileKuaiNumber[i]<<endl;
   
  }
}
void back()//主存回收函数
 {
  cout<<"请输入要回收作业的作业名:"<<endl;
  string backfilename;
  cin>>backfilename;
  cout<<"需要回收的作业的作业名:"<<backfilename<<endl;
  int i;//字节号
  int j;//位号
  if(file.FileName==backfilename)
  {
   for(int m=0;m<NUMBER;m++)
   {
      i=file.FileKuaiNumber[m]/8;
   j=file.FileKuaiNumber[m]%8; 
   MAP[i][j]=0;
   }
  }
  map_state();
www.751com.cn
   MAP[0][3]=1;
   MAP[0][5]=1;
   map_state();
L: char a;
   cout<<"请选择操作(输入s表示申请空间,h表示回收空间):"<<endl;
   cin>>a;
   if(a=='s')
   {
   Filecin();
   map_work();
   }
   if(a=='h')
   {
    back();
   }
   goto L;

}
 
六、实验总结
 
在输入位示图状态时,两个循环即将结束的时候要初始化位示图,防止重复显示。
按找到的位计算对应的块号。计算公式:块号=J*8+I。其中,J表示找到的字节号,I表示找到的位号。由块号计算字节号和位号的公式如下:字节号=int(块号/8)    位号=mod(块号/8),所以,判断主存是否能够分配即为:if(file.FileSize<=FREE*8) 否则将显示申请空间大于系统所剩空间!420

上一页  [1] [2] 

  • 上一篇文章:
  • 下一篇文章:
  • Copyright © 2007-2012 www.chuibin.com 六维论文网 版权所有