?? 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 + -