内存分配模拟算法源代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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<
if((fp=fopen(fname,"r"))==NULL) //读文件
cout<
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;i
for(j=i+1;j
}
if(p!=i){
frees[free_quantity]=frees[i];
frees[i]=frees[p];
frees[p]=frees[free_quantity]; }
}
}
//显示函数
void view() {
int i;
cout<
cout.width(12);
cout<
cout<
cout<
cout<
cout.width(12);
cout<
cout<
cout<
//最先适应分配算法
void earliest() {
//空闲分区按地址递增的顺序排列
char job_name[20];
int job_length;
int i,j,flag,t;
cout<
cin>>job_length; //输入作业的长度
flag=0; //分配成功与否信号
for(i=0;i
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;j
free_quantity--;
cout<
}
//最优适应分配算法
void excellent() {
//空闲分区按大小递增的顺序排列
char job_name[20];
int job_length;
int i,j,flag,t;
cout<
cin>>job_length;
flag=0;
for(i=0;i
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;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
free_quantity--;
cout<
}
//最坏适应算法
void worst() {
//空闲分区按大小递减的顺序排列
char job_name[20];
int job_length;
int i,j,flag,t;
cout<
cin>>job_length;
flag=0;
for(i=0;i
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;j
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<
flag=-1;
for(i=0;i
flag=i;
start=occupys[i].start;
length=occupys[i].length; }
}
if(flag==-1){
cout<<"没有这个作业名"<
{
//加入空闲表
for(i=0;i
{ if(((i+1)
frees[i].length=frees[i].length+frees[i+1].length+length;
for(j=i+1;j
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;i
occupy_quantity--; }
}
void main()
{ int flag=0;
int t=1;
int chioce=0;
initial();
flag=readData();
while(flag==1){
sort();
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