📄 主存储器空间的分配和回收.cpp
字号:
// 主存储器空间的分配和回收.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include "iostream"
#include <string.h>
using namespace std;
#define M 128
struct jcb
{
char name[4];
int start;
int length;
jcb *next;
};
struct kmen
{
int start;
int length;
kmen *next;
};
struct men
{
int total;
jcb *header;
kmen *b;
};
void init(men *m)
{
jcb *head,tmp;
strcpy(tmp.name,"p1");
//tmp.name="p1";
tmp.start =5;
tmp.length=5;
tmp.next=NULL;
head=new jcb();
m->header=head;
*head=tmp;
head->next =new jcb();
head=head->next ;
//tmp.name="p2";
strcpy(tmp.name,"p2");
tmp.start =26;
tmp.length =6;
*head=tmp;
head->next =new jcb();
head=head->next ;
//tmp.name="p3";
strcpy(tmp.name,"p3");
tmp.start =10;
tmp.length =4;
*head=tmp;
kmen *hk,ht;
ht.start=14;
ht.length=12;
ht.next=NULL;
hk=new kmen();
m->b=hk;
*hk=ht;
hk->next=new kmen();
hk=hk->next;
ht.start =32;
ht.length=96;
*hk=ht;
}
void dis(men *m)
{
jcb *head=m->header ,*tmp=new jcb();
kmen *km,*kt=NULL;
km=m->b;
cout<<"要求分配内存的作业名:";
//char nm[4];
cin.clear ();
cin>>tmp->name;
//strcpy(,nm);
//tmp->name=nm;
cout<<"空间大小:";cin>>tmp->length;
cout<<endl;
tmp->next=NULL;
tmp->start=0;
if(km==NULL){cout<<"所有内存空间已用完."<<endl;return;}
if(km->length >=tmp->length)
{
tmp->start=km->start;
//kt=km;
if(km->length ==tmp->length)
{
kt=km;
km=km->next;
//kt->next=NULL;
m->b=km;
if(head==NULL)m->header =tmp;
else{
while(head->next !=NULL)head=head->next ;
head->next =tmp;
}
return;
}
kt=new kmen();
kt->start =km->start ;
kt->start +=tmp->length;
kt->length =km->length -tmp->length ;
kt->next =km->next ;
km->next =NULL;
m->b=kt;
if(head==NULL)m->header =tmp;
else{
while(head->next !=NULL)head=head->next ;
head->next =tmp;
}
return;
}
kt=km->next ;
while(kt!=NULL)
{
//kt=km->next ;
if(kt->length ==tmp->length )
{
tmp->start =kt->start ;
if(head==NULL)m->header =tmp;
else{
while(head->next !=NULL)head=head->next ;
head->next =tmp;
}
km->next =kt->next ;
return;
}
if(kt->length >tmp->length)
{
tmp->start =kt->start ;
if(head==NULL)m->header =tmp;
else{
while(head->next !=NULL)head=head->next ;
head->next =tmp;
}
kt->start +=tmp->length ;
kt->length -=tmp->length ;
return;
}
km=kt;
kt=km->next;
}
cout<<"不存在足够大的空间来运行该作业."<<endl;
}
void recy(men *m)
{
jcb *head,*tmp=new jcb();
kmen *km,*kc,*kt;
cout<<"要求撤离内存的作业名:";
//char nm[4];
cin>>tmp->name;
//=nm;
tmp->length =0;
km=m->b;
head=m->header ;
if(strcmp(head->name ,tmp->name)==0 )
{
tmp=head;
m->header =head->next ;
tmp->next =NULL;
}
while(head->next !=NULL)
{
if(strcmp(head->next ->name ,tmp->name)==0 )
{
tmp=head->next ;
head->next =tmp->next ;
tmp->next =NULL;
break;
}
head=head->next ;
}
if(tmp->length ==0)
{
cout<<"不存在这样的作业."<<endl;
return;
}
kt=new kmen();
kt->length =tmp->length ;
kt->start =tmp->start ;
kt->next =NULL;
if(km->start >kt->start )
{
if(km->start ==(kt->start +kt->length ))
{
km->start =kt->start ;
km->length +=kt->length ;
return;
}
kt->next =km;
m->b=kt;
return;
}
kc=km->next ;
while(kc!=NULL)
{
int i=0;
if(kc->start >kt->start )
{
if((km->start +km->length )==kt->start )
{
//km->start =kt->start ;
km->length +=kt->length ;
kt=km;
i++;
}
if((kt->start +kt->length )==kc->start)
{
if(i==1){
km->length +=kc->length ;
km->next =kc->next ;
kc->next =NULL;
return;
}
kc->start =kt->start ;
kc->length +=kt->length ;
return;
}
}
}
km->next =kt;
return;
}
void out(men *m)
{
jcb *head=m->header ;
kmen *km;
km=m->b;
cout<<"-------主存分区一览-------"<<endl;
cout<<"进程名\t起始地址\t长度"<<endl;
while(head!=NULL)
{
cout<<head->name <<"\t"<<head->start <<"\t\t"<<head->length<<endl ;
head=head->next ;
}
int i=1;
cout<<"空区号\t起始地址\t长度"<<endl;
while(km!=NULL)
{
cout<<i<<"\t"<<km->start <<"\t\t"<<km->length<<endl ;
km=km->next ;
i++;
}
}
int main(int argc, char* argv[])
{
men m;
m.total =M;
m.header=NULL;
m.b=NULL;
int ch;
init(&m);
while(true){
cout<<endl;
cout<<"1.分配空间\t2.回收空间\t3.打印内存\t其他.退出\t:";
cin>>ch;
cout<<endl;
cout.flush();
switch(ch){
case 1:
dis(&m);
break;
case 2:
recy(&m);
break;
case 3:
out(&m);
break;
default:
return 0;
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -