计算机科学与工程学院学生实验报告
学号
专业 计 算 机 科
学与技术
班级
姓名
课程名称
操作系统
课程类型 专业必修
实验名称
主存空间的分配和回收
实验目的:
熟悉可变分区存储管理方式下,主存空间的分配和回收。
实验内容:
系统采用最优适应分配算法为作业分配主存空间,而且具有紧凑技术。请编程
完成以下步骤:
(1)、输出此时的已分配区表和未分配区表;
(2)、装入 Job3(15K),输出主存分配后的已分配区表和未分配区表;
(3)、回收 Job2 所占用的主存空间,输出主存回收后的已分配区表和未分配
区表;
(4)、装入 Job4(130K),输出主存分配后的已分配区表和未分配区表。
附加要求:增加分区移动策略,要求移动开销最小。
实验要求:
1、已分配区表的数据结构定义如下:
#define n 10
//假定系统允许的最大作业数量为 n,n 值为 10
struct
{
int
number;
//序号
int
address;
//已分配分区起始地址,单位为 KB
int
length;
//已分配分区长度,单位 KB
float
flag;
//已分配区表登记栏标志,0:空表项,否则为作业名;
}used_table[n];
//已分配区表
2、未分配区表的数据结构定义如下:
#define m 10
//假定系统允许的空闲区表最大为 m,m 值为 10
struct
{
int
number;
//序号*/
int
address;
//空闲区起始地址,单位为 KB
int
length;
//空闲区长度,单位为 KB
int
flag;
//空闲区表登记栏标志,0:空表项;1:空闲区
}free_table[m];
//空闲区表
3、以 allocate 命名主存分配所用的过程或函数。
4、以 reclaim 命名主存回收所用的过程或函数。
实验流程图:
主要算法:
选择算法 a
a=1,首次适应算法
a=2,最佳适应算法
a=3,最坏适应算法
初始化 first 和 end
整理分区序号
显示空闲分区链
选择操作 i
i=1,分配空间函数 a
i=0,退出程序
i=2 回收空间函数
结束
实验步骤:
1、 完成程序数据结构的创建,初始化内存分配情况,创建空闲分区表和已分区表。
2、 显示菜单,由用户选择使用哪一种分配算法:
(1)首次适应算法;
(2)最佳适应算法;
(3)最坏适应算法。
3、 完成为某作业分配内存空间:
(1)用户输入作业所占内存空间大小;
(2)判断是否能够在剩余的空闲区域中找到一块放置该作业,如果不行则要求用
户重新输入;
(3)为该作业分配内存空间,
(4)屏幕显示分配后的内存分区情况。
4、完成内存空间回收:
(1)由用户输入作业的分区序号,决定所要终止的作业;
(2)判断是否存在用户所输入的分区序号,如果在则进行终止,否则提示作业不
存在;
(3)判断即将终止的作业前后是否有空闲区域,如果没有则作业所占的空间独立
成为一个空闲块,分区状态置为空闲区。
5、实验主要函数:
Initblock():初始化内存分配
menu():菜单
sort():分区序号重新排序
show():显示主存分配情况
allocation():分配主存函数
recovery():主存那你回收函数
实验结果:
实验总结:
通过此实验,使我了解了在不同的存储管理方式下应怎样实现主存空间的分配
和回收。在可变分区方式是按作业需要的主存大小来分隔分区的。当要装入一个作
业时,根据需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个
分区分配给该作业;若无,则作业不能装入。随着作业的装入、撤离,主存空间被
分成多个分区,有的分区被占用,而有的分区是空闲的。
实验评语:
实验成绩
附:
实验代码:
#include
#include
#include
#define SIZE 1
#define ERROR 0 //出错
typedef int Status;
教师签名
typedef struct free_table//定义一个空闲区说明表结构
{
int num;
long begin;
long size;
int status;
//分区序号
//起始地址
//分区大小
//分区状态
}ElemType;
typedef struct Node
{
// 线性表的双向链表存储结构
ElemType data;
struct Node *prior; //前趋指针
struct Node *next;
//后继指针
}Node,*LinkList;
LinkList first; //头结点
LinkList end;
int flag;
//尾结点
//记录要删除的分区序号
Status Initblock()//开创带头结点的内存空间链表
{
first=(LinkList)malloc(sizeof(Node));
end=(LinkList)malloc(sizeof(Node));
first->prior=NULL;
first->next=end;
end->prior=first;
end->next=NULL;
end->data.num=1;
end->data.begin=20;
end->data.size=600;
end->data.status=0;
return SIZE;
}
//菜单
void menu()
{
printf("\n
printf("
printf("
printf("
printf("
printf("
***************内存分配和回收*************\n");
\n");
\n");
\n");
\n");
****************************************\n");
0.退出
1.首次适应算法
2.最佳适应算法
3.最坏适应算法
}
void sort()//分区序号重新排序
{
Node *p=first->next,*q;
q=p->next;
for(;p!=NULL;p=p->next)
{
for(q=p->next;q;q=q->next)
{
if(p->data.num>=q->data.num)
{
q->data.num+=1;
}
}
}
}
//显示主存分配情况
void show()
{
int flag=0;//用来记录分区序号
Node *p=first;
p->data.num=0;
p->data.begin=0;
p->data.size=40;
p->data.status=1;
sort();
printf("\n\t\t---主存空间分配情况---\n");
printf("*************************************\n\n");
printf("分区序号\t 起始地址\t 分区大小\t 分区状态\n\n");
while(p)
{
printf("%d\t\t%d\t\t%d",p->data.num,p->data.begin,p->data.size);
if(p->data.status==0) printf("\t\t 空闲\n\n");
else printf("\t\t 已分配\n\n");
p=p->next;
}
printf("---------------------------------------------------\n\n");
}
//首次适应算法
Status First_fit(int request)
{
//为申请作业开辟新空间且初始化
Node *p=first->next;
LinkList temp=(LinkList)malloc(sizeof(Node));
temp->data.size=request;
temp->data.status=1;
p->data.num=1;
while(p)
{
if((p->data.status==0)&&(p->data.size==request))
{
//有大小恰好合适的空闲块
p->data.status=1;
return SIZE;
break;
}
else if((p->data.status==0) && (p->data.size>request))
{
//有空闲块能满足需求且有剩余
temp->prior=p->prior;
temp->next=p;
temp->data.begin=p->data.begin;
temp->data.num=p->data.num;
p->prior->next=temp;
p->prior=temp;
p->data.begin=temp->data.begin+temp->data.size;
p->data.size-=request;
p->data.num+=1;
return SIZE;
break;
}
p=p->next;
return ERROR;
}
}
//最佳适应算法
Status Best_fit(int request)
{
int ch; //记录最小剩余空间
Node *p=first;
Node *q=NULL; //记录最佳插入位置
LinkList temp=(LinkList)malloc(sizeof(Node));
temp->data.size=request;
temp->data.status=1;
p->data.num=1;
while(p) //初始化最小空间和最佳位置
{
if((p->data.status==0) && (p->data.size>=request) )
{
if(q==NULL)
{
q=p;
ch=p->data.size-request;
}
else if(q->data.size > p->data.size)
{
q=p;
ch=p->data.size-request;
}
return SIZE;
}
//最差适应算法
Status Worst_fit(int request)
{
int ch; //记录最大剩余空间
Node *p=first->next;
Node *q=NULL; //记录最佳插入位置
LinkList temp=(LinkList)malloc(sizeof(Node));
temp->data.size=request;
temp->data.status=1;
p->data.num=1;
while(p) //初始化最大空间和最佳位置
}
}
p=p->next;
}
if(q==NULL)
return ERROR;//没有找到空闲块
else if(q->data.size==request)
{
q->data.status=1;
return SIZE;
}
else
{
temp->prior=q->prior;
temp->next=q;
temp->data.begin=q->data.begin;
temp->data.num=q->data.num;
q->prior->next=temp;
q->prior=temp;
q->data.begin+=request;
q->data.size=ch;
q->data.num+=1;
return SIZE;