可变内存分配模拟

#include<iostream>
#define memsize 1024   
using namespace std;

typedef struct space{
int startad;
int endad;
int ID;
space *next;
}space;


void job();
void showjob();
void showmem();
void recyclejob();
void menu();
space *freehead,*freetag,*usinghead,*usingtag,*newjob;

void main(){
int i;
freehead=new space;
freehead->startad=0;
freehead->endad=memsize;
freehead->next=NULL;
freetag=freehead;
usinghead=usingtag=NULL;
cout<<"/t#####  计06-6班 周飞  ####"<<endl<<endl;
L:menu();
cin>>i;
switch (i){
case 1:showjob();break;
case 2:showmem();break;
case 3:recyclejob();break;
case 4:job();break;};
 goto L;
}

void menu(){
cout<<"/t1.显示作业信息"<<endl;
cout<<"/t2.显示内存信息"<<endl;
cout<<"/t3.回收作业"<<endl;
cout<<"/t4.创建工作"<<endl;
};

void job(){
int size,ID;
cout<<"/t输入装载作业的大小和ID"<<endl;
cin>>size>>ID;
space *searchfree=freehead;
while((searchfree->endad)-(searchfree->startad)<size)
{
 if(searchfree->next!=NULL) searchfree=searchfree->next;
 else {cout<<"/t内存分配出错请回收作业以释放内存"<<endl;}
};
newjob=new space;
newjob->ID=ID;
newjob->startad=searchfree->startad;
newjob->endad=(newjob->startad)+size;
newjob->next=NULL;
searchfree->startad=(searchfree->startad)+size;
if(usinghead==NULL&&usingtag==NULL) usinghead=usingtag=newjob;
else {usingtag->next=newjob;usingtag=newjob;};
cout<<"/t作业已成功装入内存!!"<<endl<<endl;
};

void showjob(){
 cout<<"/tID/t"<<"size/t"<<"startad/t/t"<<"endad/t"<<endl;
 space *searchusing;
 for(searchusing=usinghead;searchusing!=NULL;searchusing=searchusing->next)
 {
  cout<<"/t"<<searchusing->ID<<"/t"<<
 (searchusing->endad)-(searchusing->startad)<<"/t"<<
 searchusing->startad<<"/t/t"<<searchusing->endad<<endl;
 };
 

};

void showmem(){
space *searchusing=usinghead;
space *searchfree=freehead;
showjob();

X: cout<<"/tNULL/t"<<(searchfree->endad)-(searchfree->startad)<<"/t"<<
 searchfree->startad<<"/t/t"<<searchfree->endad<<endl;
 searchfree=searchfree->next;
 if (searchfree!=NULL) goto X;
 };

void recyclejob(){
int ID;
int i=0;
space *searchfree=freehead;
space *searchusing=usinghead;
space *forward=new space;
forward->next=usinghead;
cout<<"/t输入作业ID"<<endl;
cin>>ID;
while(searchusing->ID!=ID){
 searchusing=searchusing->next;
 forward=forward->next;
}
forward->next=searchusing->next;
//更新加入
if (searchusing==usinghead) usinghead=searchusing->next;
else {if(searchusing==usingtag) usingtag=forward;}

//更新结束

//按内存顺序插入free链表排序,problemstart
if((freetag->startad)<(searchusing->startad)) {   //判断队尾
 freetag->next=searchusing;
 freetag=searchusing;
 searchusing->next=NULL;
 
}

if((freehead->startad)>(searchusing->startad)){  //判断对头
  searchusing->next=freehead;
  freehead=searchusing;
  
}

else {
 while((searchusing->startad)>(searchfree->next->startad))
  searchfree=searchfree->next;
 
  searchusing->next=searchfree->next;
  searchfree->next=searchusing;
 
 };
//problemend
//合并相邻空闲分区
//调试freehead
searchfree=freehead;
while((searchfree->next)!=NULL)
{
 if ((searchfree->endad)==(searchfree->next->startad))
 {
  (searchfree->endad)=(searchfree->next->endad);
  (searchfree->next)=(searchfree->next->next);
 }
 else searchfree=(searchfree->next);
 
}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值