可变分区存储管理方式的内存分配和回收_分区分配内存管理方式
可变分区存储管理方式的内存分配和回收由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“分区分配内存管理方式”。
#include//定义输入/输出函数
#include//数据流输入/输出
#include//字符串处理
#include//参数化输入/输出
const int MJ=10;//假定系统允许的最大作业数量为10
typedef struct node{
int addre;
int length;
char tag[10];
}job;
job frees[MJ];
int free_quantity;
job occupys[MJ];
int occupy_quantity;
int read()
{
FILE *fp;
char fn[10];
cout
cin>>fn;
if((fp=fopen(fn,“r”))==NULL){ 其意义是在当前目录下打开文件file a,只允许进行“读”操作,并使fp指向该文件
cout
}
else{
while(!feof(fp)){
fscanf(fp,“%d,%d”,&frees[free_quantity].addre,&frees[free_quantity].length);free_quantity++;fscanf(文件指针,格式字符串,输入表列);
}
return 1;
}
return 0;
}
void sort()
{
int i,j,p;
for(i=0;i
p=i;
for(j=i+1;j
if(frees[j].addre
p=j;
}
}
if(p!=i){
frees[free_quantity]=frees[i];
frees[i]=frees[p];
frees[p]=frees[free_quantity];
}
}
}
void view()
{
int i;
cout
cout
for(i=0;i
cout.setf(2);
cout.width(12);
cout
cout.width(10);
cout
cout.width(8);
cout
}
cout
cout
for(i=0;i
cout.setf(2);
cout.width(12);
cout
cout.width(10);
cout
cout.width(8);
cout
}
}
void ear()
{
char job_name[10];
int job_length;
int i,j,flag,t;
cout
cin>>job_name;
cin>>job_length;
flag=0;
for(i=0;i
if(frees[i].length>=job_length){
flag=1;
}
}
if(flag==0){//未找到空闲区,返回
cout
}
else{
t=0;
i=0;
while(t==0){
if(frees[i].length>=job_length){//找到可用空闲区,开始分配
t=1;
}
i++;
}
i--;
occupys[occupy_quantity].addre=frees[i].addre;//修改已分配区表
strcpy(occupys[occupy_quantity].tag,job_name);
occupys[occupy_quantity].length=job_length;
occupy_quantity++;
if(frees[i].length>job_length){
frees[i].addre+=job_length;
frees[i].length-=job_length;
}
else{
for(j=i;j
frees[j]=frees[j+1];
}
free_quantity--;
cout
}
}
}
void reclaim()//回收作业所占的内存空间
{
char job_name[20];
int i,j,flag,p=0;
int addre;
int length;//寻找已分分区表中对应的登记项
cout
cin>>job_name;
flag=-1;
for(i=0;i
if(!strcmp(occupys[i].tag,job_name)){
flag=i;
addre=occupys[i].addre;
length=occupys[i].length;
}
}
if(flag==-1){ //在已分分区表中找不到作业
cout
}
else{//修改空闲区表,加入空闲表
for(i=0;i
if((frees[i].addre+frees[i].length)==addre){
if(((i+1)
for(j=i+1;j
frees[j]=frees[j+1];
}
free_quantity--;
p=1;
}
else{
frees[i].length+=length;
p=1;
}
}
if(frees[i].addre==(addre+length)){
frees[i].addre=addre;
frees[i].length+=length;
p=1;
}
}
if(p==0){
frees[free_quantity].addre=addre;
frees[free_quantity].length=length;
free_quantity++;
}//删除分配表中的该作业
for(i=flag;i
occupys[i]=occupys[i+1];
}
occupy_quantity--;
}
}
void main()
{
int flag=0;
int t=1;
int chioce=0;
int i;
for(i=0;i
frees[i].addre=-1;//空闲区表初始化
frees[i].length=0;
strcpy(frees[i].tag,“free”);
occupys[i].addre=-1;//已分分区表初始化
occupys[i].length=0;
strcpy(occupys[i].tag,“”);
}
free_quantity=0;
occupy_quantity=0;
flag=read();
while(flag==1){
sort();
cout
cin>>chioce;
switch(chioce){
case 0:
flag=0;
break;
case 1:
ear();
break;
case 2:
reclaim();
break;
case 3:
view();
break;
default:
cout
}
}
}