标签:
实验四、主存空间的分配和回收实验
专业:计算机科学与技术(网络工程) 姓名:陈玉婷 学号:201306114132
一、 实验目的
用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方式及其算法的理解。
二、 实验内容和要求
采用连续分配方式之动态分区分配存储管理,使用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法4种算法完成设计(任选两种算法)。
(1)**设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。采用分区说明表进行。(2)或在程序运行过程,由用户指定申请与释放。
(3)设计一个空闲区说明表,以保存某时刻主存空间占用情况。把空闲区说明表的变化情况以及各作业的申请、释放情况显示。
三、 实验方法、步骤及结果测试
可执行程序名:four.exe
存储结构:用结构体存储已分分区表 空闲分区表
关键函数的实现:
#include<stdio.h>
#define n 3 //假设系统允许的最大作业为n
#define m 10 //假设系统允许的空闲区表最大为m
#define min 100
void allocate(char name,int length);
void reclaim(char name);
struct
{
int address; //已分分区起始地址
int length; //已分分区长度
int flag; //已分分区标志("0"表示空栏目)
char name[10]; //作业名
}usedtable[10];
struct
{
int address; //空闲分区起始地址
int length; //空闲分区长度
int flag; //空闲分区标志("0"表示空栏目,"1"表示未分配)
char name[10]; //作业名
}freetable[10];
void allocate(char name,int length)
{
int useflag=0; //分配表标志
int freeflag=0; //空闲表标志
int i,k,resize;
for(i=0;i<m;i++)
{
if(freetable[i].flag==1&&freetable[i].length>=length)
{
freeflag=1; break;
}
if(freeflag==0)
printf("没有满足条件的空闲区\n");
else
{
resize=freetable[i].length-length;
for(k=0;k<n;k++)
{
if(usedtable[k].flag==0)
{
if(resize<min) //剩余块过少
{
usedtable[k].length=freetable[i].length;
usedtable[k].address=freetable[i].address;
usedtable[k].flag=name;
freetable[i].length=0;
freetable[i].flag=0;
break;
}
else
{
usedtable[k].address=freetable[i].address+resize;
usedtable[k].flag=name;
usedtable[k].length=length;
freetable[i].length=resize;
break;
}
}
}
}
}
}
void reclaim(char name)
{
int useflag=0; //分配表标志
int freeflag=0; //空闲表标志
int u_endaddress;
int f_endaddress;
int k,i;
for(k=0;k<n;k++)
{
if(usedtable[k].flag==name)
{
useflag=1;
break;
}
}
if(useflag==0)
printf("找不到该作业\n");
else
{
for(i=0;i<m;i++)
{
u_endaddress=usedtable[k].address+usedtable[k].length;
f_endaddress=freetable[i].address+freetable[i].length;
if(usedtable[k].address==f_endaddress)//上邻
{
freeflag=1;
freetable[i].length=freetable[i].length+usedtable[k].length;
freetable[i].flag=1;
usedtable[k].flag=0;
usedtable[k].length=0;
usedtable[k].address=0;
printf("已回收\n");
break;
}
else
{
if(freetable[i].address==u_endaddress)//下邻
{
freeflag=1;
freetable[i].address=usedtable[k].address;
freetable[i].length=freetable[i].length+usedtable[k].length;
freetable[i].flag=1;
usedtable[k].flag=0;
usedtable[k].length=0;
usedtable[k].address=0;
printf("已回收\n");
break;
}
}
}
if(freeflag==0)
{
i=0;
for(i=0;i<m;i++)
{
if(freetable[i].flag==0)
{
freetable[i].address=usedtable[k].address;
freetable[i].length=usedtable[k].length;
freetable[i].flag=1;
usedtable[k].length=0;
usedtable[k].flag=0;
usedtable[k].address=0;
break;
}
}
printf("\n已回收!\n");
}
}
}
void main()
{
int i,a,length;
char name;
//空闲分区表初始化
freetable[0].address=10240;
freetable[0].length=102400;
freetable[0].flag=1;
for(i=1;i<m;i++)
{
freetable[i].flag=0;
}
for(i=0;i<n;i++)
{
usedtable[i].flag=0; //已分配区表初始化
}
allocate(name,length);
reclaim(name);
while(1)
{
printf("选择功能项(0-退出,1-分配主存,2-回收主存,3-显示主存)\n");
printf("选择功能项:");
scanf("%d",&a);
switch(a)
{
case 0: exit(0);
case 1:
printf("输入作业名和作业所需长度: ");
scanf("%c %d",&name,&length);
allocate(name,length);
break;
case 2:
printf("输入要回收分区的作业名");
scanf("%c",&name);
reclaim(name);
break;
case 3:
printf("输出空闲区表:\n起始地址 分区长度 标志\n");
for(i=0;i<m;i++)
{
printf("%6d%6d%6d\n",freetable[i].address,freetable[i].length, freetable[i].flag);
}
printf("按任意键输出已分配区表\n");
getchar();
printf(" 输出已分配区表:\n起始地址 分区长度 标志\n");
for(i=0;i<n;i++)
{
if(usedtable[i].flag!=0)
printf("%6d%6d%6d\n",usedtable[i].address,usedtable[i].length, usedtable[i].flag);
else
printf("%6d%6d%6d\n",usedtable[i].address,usedtable[i].length, usedtable[i].flag);
break;
}
default:
printf("没有该选项\n");
}
}
}
4 运行结果及分析
四、 实验总结
心得体会:算法仍然存在很大的不足,主要是对算法的理论知识理解不透彻,对C语言中存储结构基础掌握不深,导致自己写代码写不出,在网上参考代码看不懂的情况,网上的代码多数使用指针,自己对指针掌握少,所以理解起来很吃力。对算法的理论知识理解不透彻,还需要多看书理解理解。
标签:
原文地址:http://www.cnblogs.com/family6/p/4552119.html