用分页管理,使用位示图实现主存的分配与回收 第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