1、实验报告课程名称:计算机操作系统 实验项目名称:存储管理 实验时间: 班级: 姓名: 学号:一实验目的理解可变分区管理方式下采用最优/佳适应分配算法实现主存分配和回收。对理论课中学习的内存管理中的概念作进一步的理解。二、实验环境PC 机、操作系统:Windowsxp3 、VC+6.0四实验步骤1. 编写程序,由必要的数据结构、主函数、内存分配函数及主存回收函数构成。实现可变分区管理方式下采用最优/佳适应分配算法实现主存的分配和回收。2. 在上机环境中输入程序,调试,编译。3. 设计输入数据,写出程序的执行结果。实验内容与结果及分析如下: 1.按照流程图编好程序;2.打开 VisualC+ 软件
2、 ,新建工程文件;3.新建源文件(sd) ,将程序写入(sd)中并在 VisualC+ 中调试(sd.exe)运行;4.运行结果如下:分配内存当一个作业要求装入主存时,查找空闲区说明表,从中找出一个足够大的空闲区。有成 绩:指导教师(签名):时候空闲区大于作业需要量,需要将空闲区分成两部分,一部分作业占用,另一部分成为小的空闲区。为了方便查找,总是让“空表目”集中在表格的后面。内存分配后,查看内存空间分配情况如下表格所示:区号 起始地址 长度 标志21 0 32 已分配1 32 25 已分配free 57 32710 空闲释放后内存空间情况,如下表格所示:区号 起始地址 长度 标志free 0
3、 32 空闲1 32 25 已分配free 57 32710 空闲回收内存 当一个作业执行结束撤离时,作业所占的区域应该归还,归还的区域如果与其他空闲区相邻,则应合成一个大的空闲区,登记在空闲区说明表中。归还主存时的回收算法参考流程图如下图:图 主存回收示意图1.以上程序分为首次适应算法即最先适应算法(First fit)空闲区按地址大小递增顺序排列。查找分区说明表,找到第一个满足申请长度的空闲区,分配并分割。剩余部分保留在空白区表中原来的位置。最先适应算法:尽可能利用存储器的低地址部分,因此在低地址部分会很快地产生大量碎片其次为最佳适应算法即空闲区表中的空闲区按其容量以递增的次序排列。当要求
4、分配一个空闲区时,由小到大顺序查找分区说明表,找到第一个满足申请长度的最小空闲区,分配并分割。如果有剩余部分,作为一个空闲区将其插入适当的位置;2、最佳分配算法:选择容量接近的空闲区来分配,产生大量碎片。实验心得:附录:程序代码: #include#include#define Free 0 /空闲状态#define Busy 1 /已用状态 d#define OK 1 /完成#define ERROR 0 /出错#define MAX_length 32767 /最大内存空间为 32767KBtypedef int Status;int n=0; typedef struct freeare
5、a/定义一个空闲区说明表结构int ID; /分区号 dlong size; /分区大小long address; /分区地址int state; /状态ElemType;/- 线性表的双向链表存储结构 -typedef struct DuLNode /double linked listElemType data; struct DuLNode *prior; /前趋指针struct DuLNode *next; /后继指针DuLNode,*DuLinkList;DuLinkList block_first; /头结点DuLinkList block_last; /尾结点Status all
6、oc(int);/内存分配Status free(int); /内存回收Status First_fit(int,int);/首次适应算法Status Best_fit(int,int); /最佳适应算法void show();/查看分配Status Initblock();/开创空间表Status Initblock()/开创带头结点的内存空间链表block_first=(DuLinkList)malloc(sizeof(DuLNode);block_last=(DuLinkList)malloc(sizeof(DuLNode);block_first-prior=NULL;block_fi
7、rst-next=block_last;block_last-prior=block_first;block_last-next=NULL;block_last-data.address=0;block_last-data.size=MAX_length;block_last-data.ID=0;block_last-data.state=Free;return OK;/- 分 配 主 存 -Status alloc(int ch)int ID,request;coutID;coutrequest;if(requestdata.ID=ID; temp-data.size=request;tem
8、p-data.state=Busy;DuLNode *p=block_first-next;while(p)if(p-data.state=Free p-data.ID=ID;return OK;break;if(p-data.state=Free temp-next=p; temp-data.address=p-data.address;p-prior-next=temp; p-prior=temp;p-data.address=temp-data.address+temp-data.size;p-data.size-=request;return OK;break;p=p-next;ret
9、urn ERROR;/- 最佳适应算法 -Status Best_fit(int ID,int request)int ch; /记录最小剩余空间DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode); temp-data.ID=ID; temp-data.size=request;temp-data.state=Busy;DuLNode *p=block_first-next;DuLNode *q=NULL; /记录最佳插入位置while(p) /初始化最小空间和最佳位置if(p-data.state=Free ch=p-data.size-re
10、quest;break;p=p-next;while(p)if(p-data.state=Free p-data.state=Busy;return OK;break;if(p-data.state=Free /更新剩余最小值q=p;/更新最佳位置指向p=p-next;if(q=NULL) return ERROR;/没有找到空闲块else/找到了最佳位置并实现分配temp-prior=q-prior;temp-next=q;temp-data.address=q-data.address;q-prior-next=temp;q-prior=temp;q-data.address+=reque
11、st;q-data.size=ch;return OK;/- 主 存 回 收 -Status free(int ID)DuLNode *p=block_first;while(p)if(p-data.ID=ID)p-data.state=Free;p-data.ID=Free;if(p-prior-data.state=Free)/与前面的空闲块相连p-prior-data.size+=p-data.size;p-prior-next=p-next;p-next-prior=p-prior;if(p-next-data.state=Free)/与后面的空闲块相连p-data.size+=p-n
12、ext-data.size;p-next-next-prior=p;p-next=p-next-next; break; p=p-next;return OK;/- 显示主存分配情况 -void show()coutnext;while(p)coutdata.ID=Free) coutdata.IDdata.addressdata.sizedata.state=Free) coutnext;/- 主 函 数-void main()int ch,d=0;/算法选择标记coutch;if(ch=0|ch=1|ch=2) d+;while(d=0)coutch;if(ch=0|ch=1|ch=2) d+;if(ch=0) exit(0);if(n=0) Initblock(); /申请整块空闲区int choice; /操作选择标记while(1)coutchoice;if(choice=1) alloc(ch); / 分配内存n+;else if(choice=2) / 内存回收int ID;coutID;free(ID);n+;else if(choice=3) show();/显示主存n+;else if(choice=0) main(); /退出n+;else /输入操作有误cout“输入有误,请重试!“endl;continue;