内存分配模拟算法源代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include
#include
#include
#include

const int MAXJOB=100; //定义表最大记录数

typedef struct node{
int start; //空闲分区的起始地址
int length; //空闲分区的长度
char tag[20]; //分区信息是否已分配
}job;

job frees[MAXJOB]; //定义空闲区表
int free_quantity; //空闲区的个数

job occupys[MAXJOB];//定义已分配区表
int occupy_quantity; //已分配区的个数

//初始化函数
void initial() {
int i;

for(i=0;i
frees[i].start=-1;
frees[i].length=0;
strcpy(frees[i].tag,"free");

occupys[i].start=-1;
occupys[i].length=0;
strcpy(occupys[i].tag,""); }
free_quantity=0;
occupy_quantity=0;
}

//读数据函数
int readData() {
FILE *fp;
char fname[20];
cout<cout<cin>>fname;
if((fp=fopen(fname,"r"))==NULL) //读文件
cout<else{
while(!feof(fp)) //文件结束
{
fscanf(fp,"%d",&frees[free_quantity].start);
fscanf(fp,"%d",&frees[free_quantity].length);
free_quantity++; }
return 1; }
return 0;
}

//sort选择——排序
void sort() {
int i,j,p;
for(i=0;ip=i;
for(j=i+1;j{ if(frees[j].start{ 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<<"当前空闲表:"<cout<<"起始地址 长度 状态"<for(i=0;icout.setf(2);
cout.width(12);
cout<cout.width(10);
cout<cout.width(8);
cout<}
cout<cout<<"当前已分配表:"<cout<<"起始地址 长度 占用作业名"<for(i=0;icout.setf(2);
cout.width(12);
cout<cout.width(10);
cout<cout.width(8);
cout<}

//最先适应分配算法
void earliest() {
//空闲分区按地址递增的顺序排列
char job_name[20];
int job_length;
int i,j,flag,t;
cout<cin>>job_name; //输入作业的名称
cin>>job_length; //输入作业的长度

flag=0; //分配成功与否信号
for(i=0;iif(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].start=frees[i].start; //修改已分区的相关信息
strcpy(occupys[occupy_quantity].tag,job_name);
occupys[occupy_quantity].length=job_length;
occupy_quantity++;

if(frees[i].length>job_length)
{
frees[i].start+=job_length;
frees[i].length-=job_length;
}
else //刚好分配则空闲分区数减一
{ for(j=i;jfrees[j]=frees[j+1]; }
free_quantity--;
cout<}
}
//最优适应分配算法
void excellent() {
//空闲分区按大小递增的顺序排列
char job_name[20];
int job_length;
int i,j,flag,t;

cout<cin>>job_name;
cin>>job_length;

flag=0;
for(i=0;iif(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--;
for(j=0;jif((frees[j].length>=job_length)&&(frees[j].length{ i=j; }
}

occupys[occupy_quantity].start=frees[i].start;
strcpy(occupys[occupy_quantity].tag,job_name);
occupys[occupy_quantity].length=job_length;
occupy_quantity++;

if(frees[i].length>job_length){
frees[i].start+=job_length;
frees[i].length-=job_length; }
else{
for(j=i;j{ frees[j]=frees[j+1]; }
free_quantity--;
cout<}
}

//最坏适应算法
void worst() {
//空闲分区按大小递减的顺序排列
char job_name[20];
int job_length;
int i,j,flag,t;

cout<cin>>job_name;
cin>>job_length;

flag=0;
for(i=0;iif(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--;
for(j=0;jif((frees[j].length>=job_length)&&(frees[j].length>frees[i].length))
i=j;
}

occupys[occupy_quantity].start=frees[i].start;
strcpy(occupys[occupy_quantity].tag,job_name);
occupys[occupy_quantity].length=job_length;
occupy_quantity++;

if(frees[i].length>job_length)
{
frees[i].start+=job_length;
frees[i].length-=job_length;
}
else
{
for(j=i;j{
frees[j]=frees[j+1];
}
free_quantity--;
cout<}
}
}

//撤消

作业
void finished() {
char job_name[20];
int i,j,flag,p=0;
int start;
int length;

cout<cin>>job_name;

flag=-1;
for(i=0;iif(!strcmp(occupys[i].tag,job_name)){
flag=i;
start=occupys[i].start;
length=occupys[i].length; }
}
if(flag==-1){
cout<<"没有这个作业名"<else
{
//加入空闲表
for(i=0;iif((frees[i].start+frees[i].length)==start)//上空
{ if(((i+1){ //上空且下空,不为最后一个
frees[i].length=frees[i].length+frees[i+1].length+length;
for(j=i+1;jfrees[j]=frees[j+1];
free_quantity--;
p=1;
}
else{
frees[i].length+=length; //上空且下不空
p=1; }
}
if(frees[i].start==(start+length)) { //下空
frees[i].start=start;
frees[i].length+=length;
p=1; }
}
//空闲中没有
if(p==0){
frees[free_quantity].start=start;
frees[free_quantity].length=length;
free_quantity++;
}
//删除分配表中的该作业
for(i=flag;ioccupys[i]=occupys[i+1];
occupy_quantity--; }
}


void main()
{ int flag=0;
int t=1;
int chioce=0;
initial();

flag=readData();

while(flag==1){

sort();
cout<cout<<" ==========================================="<cout<<" 主存储器空间的分配与回收模拟"<cout<<" ==========================================="<cout<<" 1.首次适应算法申请空间"<cout<<" 2.最佳适应算法申请空间"<cout<<" 3.最坏适应算法申请空间"<cout<<" 4.撤消作业"<cout<<" 5.显示空闲表和分配表 "<cout<<" 0.退出"<cout< 请选择:";
cin>>chioce;

switch(chioce){

case 1: earliest(); break;
case 2: excellent() ;break;
case 3: worst() ;break;
case 4: finished(); break;
case 5: view(); break;
case 0: flag=0; break;
default: cout<<"选择错误!"<}

//文件 fname





相关文档
最新文档