logo资料库

操作系统实验五 主存空间的分配与回收 附代码.doc

第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
资料共13页,剩余部分请下载后查看
计算机科学与工程学院学生实验报告 学号 专业 计 算 机 科 学与技术 班级 姓名 课程名称 操作系统 课程类型 专业必修 实验名称 主存空间的分配和回收 实验目的: 熟悉可变分区存储管理方式下,主存空间的分配和回收。 实验内容: 系统采用最优适应分配算法为作业分配主存空间,而且具有紧凑技术。请编程 完成以下步骤: (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;
分享到:
收藏