0615—主存空间的分配和回收
2016-06-15 08:25 09张鑫相 阅读(224) 评论(0) 收藏 举报实验四 主存空间的分配和回收
专业:商业软件工程一班 姓名:张鑫相 学号:201406114109
1. 目的和要求
1.1. 实验目的
用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方式及其算法的理解。
1.2. 实验要求
采用连续分配方式之动态分区分配存储管理,使用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法4种算法完成设计。
(1)**设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。采用分区说明表进行。
(2)或在程序运行过程,由用户指定申请与释放。
(3)设计一个空闲区说明表,以保存某时刻主存空间占用情况。
把空闲区说明表的变化情况以及各作业的申请、释放情况显示。
2. 实验内容
根据指定的实验课题,完成设计、编码和调试工作,完成实验报告。
3. 实验环境
可以选用Visual C++作为开发环境。也可以选用Windows下的VB,CB或其他可视化环境,利用各种控件较为方便。自主选择实验环境。
4. 参考数据结构:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#define MAX 24
struct partition{
char pn[10];
int begin;
int size;
int end; ////////
char status; //////////
};
typedef struct partition PART;
5、源代码
#include<stdio.h>
#include<stdlib.h>
#include <conio.h>
#define nil -1
#define NULL 0
#define maxisize 600 //用户的空闲区空间最大值
#define minisize 4
#define getspace(type) (type*)malloc(sizeof(type)) //分配空间
struct partition{
char pn; //作业标号
float begin; //分区起始地址
float size; //分区长度,单位为字节
int status; //分区表的状态位
struct partition *FRlink; //前向指针
struct partition *RElink; //后向指针
}*free_partition=NULL,*place; //已分配分区表,空闲分区表
typedef struct partition PART;
PART *init(PART *td) //空间分区链表初始化
{
td->FRlink=NULL;
td->pn=nil;
td->begin=1064;
td->size=1664;
td->status=0;
td->RElink=NULL;
return td;
}
//主存分配函数,为作业pn分配大小为xk的分区空间
void allocate(char pn,float xk,int choice)
{
PART *td,*link;
int k=0;
float temp=600;
if (free_partition->FRlink==NULL&&free_partition->RElink==NULL)
{//给首个作业分配空间,改写分区链表
free_partition->pn=pn;
free_partition->size=xk;
free_partition->status=1;
if (xk<maxisize)
{
td=getspace(PART);
free_partition->RElink=td;
td->FRlink=free_partition;
td->pn=nil;
td->begin=1064+xk;
td->size=maxisize-xk;
td->status=0;
}
if (choice==2)
{//链接成循环链表
free_partition->FRlink=td;
td->RElink=free_partition;
place=td;
}
else
{
free_partition->FRlink=NULL;
if (xk<maxisize)
td->RElink=NULL;
}
k=1;
}
else
{
if (2==choice)
td=place;//采用CFF时将ta定位到上次找到的合适空间分区的下个空间分区
else
td=free_partition;
while(td!=NULL)
{
if (3==choice)
{
while(td!=NULL)
{
if (td->size>=xk&&td->status==0)
if (td->size<temp)
{
place=td;temp=td->size;
} //选择最适合空间
td=td->RElink;
}
td=place;
}
if (td->size>=xk&&td->status==0)
if (td->size-xk<=minisize)
{//当搜索到的空间大小<=xk+minisize时,将空间全部分配给作业
td->pn=pn;
td->status=1;
place=td->RElink;
k=1;
break;
}
else
{//当搜索到的空间大小>xk+minisize时,将空间划分,再分配给作业
link=getspace(PART);
link->size=td->size-xk;
td->pn=pn;
td->size=xk;
td->status=1;
link->RElink=td->RElink;
if (NULL!=td->RElink)
td->RElink->FRlink=link;
td->RElink=link;
link->FRlink=td;
link->pn=nil;
link->begin=td->begin+xk;
link->status=0;
place=link;
k=1;
break;
}
td=td->RElink;
}
}
if (0==k)
{//未寻找到合适的空间分区,返回
printf("空间申请失败! \n");
return;
}
}
void reclaim(char pn,int choice) //主存回收函数,回收作业pn所占用的分区空间
{
int bool1=0,bool2=0;
PART *td,*link;
td=free_partition;
if (2==choice)
link=td;
else
link=NULL;
do
{
if (pn==td->pn&&1==td->status)
break;
td=td->RElink;
if (td==link)
{
printf("\n抱歉,作业不存在%c! \n",pn);
return;
}
}
while(td!=link);
bool1=(NULL==td->FRlink||td->FRlink==td->RElink)? 1:td->FRlink->status;
bool2=(NULL==td->RElink||td->FRlink==td->RElink)? 1:td->RElink->status;
if (bool1&&bool2)
{
td->pn=nil;
td->status=0;
}
else if ((NULL==td->FRlink||1==td->FRlink->status)&&0==td->RElink->status)
{
link=td->RElink;
td->pn=nil;
td->size+=link->size;
td->status=0;
td->RElink=link->RElink;
if (NULL!=link->RElink)
link->RElink->FRlink=td;
free(link);
}
else if (0==td->FRlink->status&&1==td->RElink->status)
{
link=td->FRlink;
link->size+=td->size;
link->RElink=td->RElink;
td->RElink->FRlink=link;
if (free_partition==td)
free_partition=link;
free(td);
}
else if (0==td->FRlink->status&&0==td->RElink->status)
{
link=td->FRlink;
link->size=link->size+td->size+td->RElink->size;
link->RElink=td->RElink->RElink;
if (NULL!=td->RElink->RElink)
td->RElink->RElink->FRlink=link;
if (free_partition==td)
free_partition=link;
free(td);
free(td->RElink);
}
}
//显示空间分区链表
void display(PART *td,int choice)
{
PART *temp;
if (2==choice)
temp=td;
else
temp=NULL;
printf("\n\t作业\t分区首地址\t分区大小(KB)\t 状态\n");
printf("\n\t sys\t 1024.00\t 40.00\t\t 1\n");
do
{
printf("\n\t %c\t %.2f\t %.2f\t\t %d\n",td->pn,td->begin,td->size,td->status);
td=td->RElink;
}while(temp!=td);
}
//主函数
int main()
{
int i,a,choice;
float xk;
char pn;
PART *ta=getspace(PART);
free_partition=init(ta);
do
{
printf("--------------------------------------------");
printf("\n 分区分配算法:\n\t1 - 首次适应算法(FF)\n\t2 - 循环首次适应算法(CFF)\n\t0 - 退出(Exit)\n \n");
printf("--------------------------------------------\n");
printf("请选择相应的算法(0-2):");
scanf("%d",&choice);
if (0==choice)
exit(0);
}while(0>choice&&2<choice);
while(1)
{
printf("--------------------------------------------");
printf("\n 菜单:\n\t1 - 申请空间(Allocation)\n\t2 - 回收空间(Reclaim)\n\t0 - 退出(Exit) \n");
printf("--------------------------------------------\n");
printf("请选择你的操作(0-2):");
scanf("%d",&a);
switch(a)
{
case 0:
exit(0); //a=0,程序结束
case 1: //a=1,分配主存空间
printf("请输入作业标号和所需要申请的空间:");
scanf("%*c%c%f",&pn,&xk);
allocate(pn,xk,choice);
display(free_partition,choice);
break;
case 2: //a=2,回收主存空间
printf("请输入你想回收的作业的相应标号:");
scanf("%*c%c",&pn);
reclaim(pn,choice);
display(free_partition,choice);
break;
default:printf("出错了,没有此项选择! \n");
}
}
}
六、实验截图




浙公网安备 33010602011771号