操作系统存储管理实验 第4页
class freetable//空闲区说明表
{ public:
int length;//从起始地址开始的一个连续空闲区的长度
int startaddress;//空闲区的主存起始地址
int statue;}//为时是未分配状态,为0时是空表目状态
freetable t[max];
void adjust()//用冒泡法排列,并将状态为未分配的栏放在前部分
{ int i=0;
int j ;
int temp;
for(;i<max;i++)//是表格紧缩,让空表目集中在表格后面
{if(t[i].statue==0)
{ j=1;
for(;(j<max)&&(t[j].statue==0;j++)
if(j==max) break;
t[i].startaddress=t[j].startaddress;
t[i].length=t[j].lenth;
t[i].statue=t[j].statue;
t[j].statue=0;
}
}
for(i=0;t[i].state==1;i++)//用冒泡法排序
i--;
for(;i>0;i--)
for(j=0;j<=i-1;j++)
{ if(t[j].startaddress>t[j+1].startaddress)
{temp=t[j+1].startaddress;
t[j+1].startaddress>t[j].startaddress;
t[j].startaddress=temp;
temp=t[j+1].lenth;
t[j+1].startaddress>t[j].lenth;
t[j].lenth=temp;
void printtable() //输出空闲表
{ int j;
for(i=0;t[i].statue==1;i++)
{cout<<"t["<<i<<"].startaddress="t[i].startaddress<<endl;
cout<<"t["<<i<<"].length="t[i].length<<endl;
cout<<"t["<<i<<"].statue="t[i].statue<<endl;
}
}
int FF(int x)//最先适应算法分配主存空间
{int address;
int j=0;
for(;j<max;j++)
{if(t[j].statue==1)//未分配状态时
{if(t[j].length==x)//刚好有与作业一样大小的空闲区
{t[j].statue==0;//把状态置为空表目
adjust();
cout<<"作业分配后的空闲区说明表:"<<endl;
printtable();
ruturn(t[j].startaddress);}//返回作业在内存的首地址
if (t[j].length>x)//当空闲区的大小比作业的大
{address=t[j].startaddress;//先保存作业在内存的首地址
t[j].lenth=t[j].lenth-x;//把空闲区分为两块
t[j].startaddress=t[j].startaddress+x;
adjust();
cout<<"作业分配后的空闲区说明表:"<<endl;
printtable();
return(address);}
else //当前空闲区不够大时
if(j==max) {cout<<"作业不能装入"<<endl;return 0;break;}}
else if(j==max) {cout<<"作业不能装入"<<endl;return 0;break;}}}
void circle(int l,int s)
{int c,i;
for(c=0;(t[c].statue==1)&&(c<max);c++)
{if((t[c-1].startaddress==s+1)&&(t[c].starataddress+t[c].length==s)&&(c+1<max)//上下都临
{t[c+1].statue=0; //把下临的空闲表状态置0
t[c].length=t[c].length+t[c+1].length+1; //把上临的空闲区的长度置为3者之和
break;}
if((t[c].startaddress==s+1//下临
{ t[c].startaddress=s;
t[c].length=1-t[c].length;
break;}
if((t[c].startaddress+t[c].length==s))//上临
{t[c+1].statue=0;
t[c].length=t[c].length+1;
break;}}
if(t[c].statue==0)//上下都不临
for(i=0;i<=mac;i--) //填入空表目中
if(t[i].statue==0)
{t[j].startaddress=s;
t[j].length=1;
t[i].statue=1;
break;}
adjust();//顺序调整和紧缩空闲区表
printtable();}//最先适应算法回收
void main()
{int i;
int x;
int ad[5];
for(i=0;i<max;i++)
t[i].statue=0;
ad[0]=5;
ad[1]=26;
ad[2]=0;
t[0].startaddress=14;//初始化
t[0].length=12;
t[0].statue=1;
t[1].startaddress=32;
t[1].length=96;
t[1].statue=1;
cout<<”原始表格为”<<endl;
printable();
cout<<”作业长度为”<<endl;
cin>>x;
ad[3]=FF(x);//调用分配函数
cout<<”作业3的归还量:4k”<<endl;
circle(4,ad[2]);//调用回收函数,回收作业3
cout<<”作业2的归还量:6k”<<endl;
circle(6,ad[1]);//调用回收函数,回收作业2