⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fenye.txt

📁 分页式管理 主存分配与回收
💻 TXT
字号:
#include <iostream.h> 
#include <stdio.h> 
#include <string.h> 


struct program 
{ 
char name[30]; 
long start; 
long length; 
struct program *next; 
}; 


struct space 
{ 
long start; 
long length; 
struct space *next; 
}; 


void creat(); 
void allot(); 
void back(); 
void callback(program *r); 
void sort(space *L); 
void sort(program *S); 
void display(space *L); 
void display(program *S); 


space *L; 
program *S; 



void creat() 
{ 
L=new space; 
space *p=new space; 
p->start=0; 
p->length=128; 
p->next=NULL; 
L->next=p; 
S=new program; 
S->next=NULL; 
} 
//***********************分配主存空间************************
void allot()   
{ 
program *q; 
q=new program; 
cout<<"请输入进程名和占用空间大小:"<<endl; 
cin>>q->name>>q->length; 
if(q->length<=0) 
{ 
cout<<"进程空间大小错误."<<endl; 
delete q; 
return; 
} 
space *p,*r; 
p=L; 
r=p; 
while(p->next!=NULL&&p->next->length<q->length) 
{ 
r=p; 
p=p->next; 
} 
if(p->next==NULL) 
{ 
cout<<"占用空间过大,分配失败"<<endl; 
delete q; 
return; 
} 
else 
{ 
q->start=p->next->start; 
q->next=S->next; 
S->next=q; 

p->next->length-=q->length; 
if(p->next->length!=0) 
p->next->start+=q->length; 
else 
{ 
if(p->next->next!=NULL) 
p->next=p->next->next; 
else 
{ 
r->next=NULL; 
delete p->next; 
} 
} 
} 
display(L); 
display(S); 
} 

//***********************回收主存空间************************
void back() 
{ 
	char name[30]; 
	cout<<"输入要回收的进程名:"; 
	cin>>name; 
	program *p; 
	p=S; 
	while(p->next!=NULL) 
	{ 
		if(strcmp(p->next->name, name)==0) 
		{ 
		  callback(p); 
		  return; 
		} 
		  p=p->next; 
	} 
	  if(p->next==NULL) 
	  cout<<"此进程不存在,内存回收失败"<<endl; 
} 
  void callback(program *t) 
{ 
  program *r; 
  r=t->next; 
  space *p,*q; 
  long n; 
  n=r->length; 
  if(L->next==NULL) 
	{ 
	space *w=new space; 
	w->start=0; 
	w->length=n; 
	w->next=NULL; 
	L->next=w; 
	t->next=r->next; 
	delete r; 
	cout<<"此进程内存回收完毕."<<endl; 
	display(L); 
	display(S); 
	return; 
	} 
     p=L->next; 
	 q=p; 
    while(p!=NULL&&p->start<r->start) 
	{ 
	q=p; 
	p=p->next; 
	} 
if((q->start+q->length==r->start)&&(r->start+n==p->start)) //上下均空 
{ 
q->next=p->next; 
q->length=q->length+p->length+n; 
t->next=r->next; 
delete r; 
} 
else if(r->start+n==p->start) //下邻空 
{ 
p->start-=n; 
p->length+=n; 
t->next=r->next; 
delete r; 
} 
else if(q->start+q->length==r->start) 
{ 
q->length+=n; 
t->next=r->next; 
delete r; 
} 
else 
{ 
space *sp=new space; 
sp->start=r->start; 
sp->length=n; 
sp->next=L->next; 
L->next=sp; 
t->next=r->next; 
delete r; 
} 
cout<<"此进程内存回收完毕."<<endl; 
display(L); 
display(S); 
} 
//****************显示空闲区*************************8
void display(space *L) 
{ 
sort(L); 
space *p=L->next; 
cout<<endl<<"空闲区情况:"<<endl; 
if(p==NULL) 
{ cout<<"无空闲区了."<<endl; return;} 
while(p!=NULL) 
{ 
cout<<"起始地址:"<<p->start<<" 长度:"<<p->length<<endl; 
p=p->next; 
} 
} 
//****************显示已分配区域************************
void display(program *S) 
{ 
sort(S); 
program *p=S->next; 
cout<<endl<<"进程内存分配情况:"<<endl; 
if(p==NULL) 
{ cout<<"内存中无进程."<<endl; return;} 
while(p!=NULL) 
{ 
cout<<"进程名:"<<p->name<<" 起始地址:"<<p->start<<" 长度:"<<p->length<<endl; 
p=p->next; 
} 
cout<<endl; 
} 
//*****************空闲区链表排序************************
void sort(space *L)  
{ 
space *p=L->next, *q, *r; 
if(p!=NULL) 
{ 
r=p->next; 
p->next=NULL; 
p=r; 
while(p!=NULL) 
{ 
r=p->next; 
q=L; 
while(q->next!=NULL&&q->next->start<p->start) 
q=q->next; 
p->next=q->next; 
q->next=p; 
p=r; 
} 
} 
} 
//***************************分配去链表排序*************************
void sort(program *S)  
{ 
program *p=S->next, *q, *r; 
if(p!=NULL) 
{ 
r=p->next; 
p->next=NULL; 
p=r; 
while(p!=NULL) 
{ 
r=p->next; 
q=S; 
while(q->next!=NULL&&q->next->start<p->start) 
q=q->next; 
p->next=q->next; 
q->next=p; 
p=r; 
} 
} 
} 

void main() 
{ 
creat(); 
int a; 
cout<<" 内存分配与回收模拟"<<endl; 
cout<<"1:分配内存"<<endl; 
cout<<"2:回收内存"<<endl; 
cout<<"3:退出"<<endl; 
while(1) 
{ 
cout<<endl<<"请按数字键选择:"; 
cin>>a; 
if(a>3||a<1) 
{ 
cout<<endl<<"输入错误,请重新输入:"; 
continue; 
} 
switch(a) 
{ 
case 1: allot(); break; 
case 2: back(); break; 
case 3: goto end; 
} 
} 
end: 
getchar(); 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -