📄 fenpei.txt
字号:
#include<iostream.h>
#define n 10 /*假定系统允许的最大作业为,假定模拟实验中n值为10*/
#define m 10 /*假定系统允许的空闲区表最大为m,假定模拟实验中m值为10*/
#define minisize 100
struct table
{
float address;
float length;
int flag;
};
table used_table[n],free_table[m];
void arr(int J,float x);
void release(int J);
void main()
{
int i,a;
float x;
int J;
free_table[0].address=10000;
free_table[0].length=4000;
free_table[0].flag=1;
for(i=1;i<m;i++)
free_table[i].flag=0;
for(i=0;i<n;i++)
used_table[i].flag=0;
while(1)
{
cout<<"选择功能项(0-退出,1-分配主存,2-显示主存,3-显示已分配区表,4-回收主存)"<<endl;
cout<<"选择功能项(0~4):";
cin>>a;
switch(a)
{
case 0:cout<<"退出系统"<<endl;break;
case 1:cout<<"输入作业名J: ";cin>>J;cout<<"作业所需长度x:";cin>>x;
arr(J,x);
break;
case 2:cout<<"显示主存:"<<endl;
for(i=0;i<m;i++)
{cout<<"第"<<i<<"块的情况:"<<" ";
cout<<"地址:"<<free_table[i].address<<" "<<"长度:"<<free_table[i].length<<" ";
cout<<"标识符:"<<free_table[i].flag<<endl;}break;
case 3:cout<<"输出已分配区表:"<<endl;
for(i=0;i<n;i++)
{cout<<"第"<<i<<"块的情况:";
if(used_table[i].flag!=0)
cout<<"地址:"<<used_table[i].address<<" "<<"长度:"<<used_table[i].length<<" "
<<"标识符:"<<used_table[i].flag<<endl;
else
cout<<"地址:"<<used_table[i].address<<" "<<"长度:"<<used_table[i].length<<" "
<<"标识符:"<<used_table[i].flag<<endl;}
break;
case 4:cout<<"输入要回收分区的作业名";cin>>J;
release(J);break;
default:cout<<"没有该选项"<<endl;
}
if(a==0) break;
}
}
void arr(int J,float x)//分配主存资源
{
int i,k;
float ad;
k=-1;
for(i=0;i<m;i++)
if(free_table[i].length>=x &&free_table[i].flag==1)
//if(k==-1||free_table[i].length<free_table[k].length)
k=i;
if(k==-1)
{
cout<<"无满足此作业的空闲区"<<endl;
return;
}
//找到可用空闲区,开始分配
if(free_table[k].length-x<=minisize)
{
free_table[k].flag=0;
ad=free_table[k].address;
x=free_table[k].length;
}
else
{
free_table[k].length=free_table[k].length-x;
ad=free_table[k].address;
free_table[k].address=free_table[k].address+x;
}
i=0;
while(used_table[i].flag!=0 && i<n)
i++;
if(i>=n)
{
cout<<"无表目填写已分分区,错误:"<<endl;
if(free_table[k].flag==0)
free_table[k].flag=1;
else
{
free_table[k].length=free_table[k].length+x;
return;
}
}
else
{
used_table[i].address=ad;
used_table[i].length=x;
used_table[i].flag=J;
}
return;
};
void release(int J)
{
int i,k,j,s,t;
float S,L;
s=0;
while((used_table[s].flag!=J ||used_table[s].flag==0)&&s<n)
s++;
if(s>=n)
{
cout<<"找不到该作业"<<endl;
return;
}
used_table[s].flag=0;
S=used_table[s].address;
L=used_table[s].length;
j=-1;k=-1;i=0;
while(i<m&&(j==-1||k==-1))
{
if(free_table[i].flag==1)
{
if(free_table[i].address+free_table[i].length==S) k=i;//前
if(free_table[i].address==S+L) j=i;//后
}
i++;
}
if(k!=-1)
if(j!=-1)
{
free_table[k].length=free_table[j].length+free_table[k].length+L;//前后都有空闲区
free_table[j].flag=0;
}
else free_table[k].length=free_table[k].length+L;//只前面有
else
if(j!=-1)//只后面有
{
free_table[j].address=S;
free_table[j].length=free_table[j].length+L;
}
else//前后都没有
{
t=0;
while(free_table[t].flag==1&&t<m)
t++;
if(t>m)
{
cout<<"主存空闲表没有空间,回收空间失败"<<endl;
used_table[s].flag=J;
return;
}
free_table[t].address=S;
free_table[t].length=L;
free_table[t].flag=1;
cout<<"回收成功"<<endl;
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -