1、操作系统实验内存的分配与回收 实验报告1、实验题目:内存的分配与回收2、实验内容:利用可变分区的首次适应算法,模拟内存的分配与回收。3、实验目的:掌握可变分区首次适应算法的原理以及其编程实现。4、实验过程:1、基本思想:可变分区分配是根据进程的实际需求,动态地为之分配内存空间。首次适应算法要求空闲空间链以地址递增的次序链接。进行内存分配时,从链表头部开始依次检索,找到第一个不小于请求空间大小的空闲空间进行分配。分配时需考虑碎片问题,若分配会导致碎片产生则将整块分区分配。内存的回收需要考虑四种情况:回收分区前后两个分区都空闲,则需要和前后两个分区合并;(2)回收分区只有前一分区空闲,则与前一分区
2、合并;(3)回收分区只有后一分区空闲,则和后一分区合并;(4)回收分区独立,不考虑合并。2、主要数据结构:struct FreeArea 链结点包含的数据:分区号、大小、起址、标记 int ID;int size;long address;int sign;struct Node 双链表结点结构体:数据区、前向指针、后继指针FreeArea data;struct Node *prior; struct Node *next; *DLinkList;3、输入、输出:输入: I.内存分配时由键盘输入分区 ID 和大小;II.内存回收时由键盘输入需要回收的分区 ID;输出: 输出内存的分配情况(按
3、照地址从低到高)4、程序流程图:选择操作choice输出可选操作Choice3 或choiceusing namespace std;#define Free 0 /空闲状态#define Busy 1 /已用状态#define PBusy 2 /碎片已用状态#define FINISH 1 /完成#define FINISH2 1 /完成#define ERROR 0 /出错#define memory 512 /最大内存空间为( 单位:KB)#define min 10 /碎片最小值(单位:KB)typedef struct FreeArea/空闲链数据int ID;int size;lo
4、ng address;int sign;typedef struct Node /空闲连结构 FreeArea data;struct Node *prior; struct Node *next; *DLinkList;DLinkList head; /头结点DLinkList tail; /尾结点int Create()/初始化head=(DLinkList)malloc(sizeof(Node);/分配内存tail=(DLinkList)malloc(sizeof(Node);head-prior=NULL;head-next=tail;tail-prior=head;tail-next
5、=NULL;tail-data.address=0;tail-data.size=memory;tail-data.ID=0;tail-data.sign=Free;return FINISH;int FirstFit(int ID,int request)/首次适应算法DLinkList temp=(DLinkList)malloc(sizeof(Node);/新建作业的结点temp-data.ID=ID;temp-data.size=request;temp-data.sign=Busy;Node *p=head;/插入指针P while(p)if(p-data.sign=Free p-d
6、ata.ID=ID;return FINISH;break;else if(p-data.sign=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=p-data.size-request;return FINISH;break;else if(p-data.sign=Free p-data.ID=ID;return FINISH;break;p=p-next;/若
7、前面的分区都已分配,P指针后移return ERROR;int Allocate()/主存分配int ID,request;coutID;coutrequest;if(requestdata.ID=ID)p-data.sign=Free;/p-data.ID=Free;if(p-prior-data.sign=Free)p-prior-next=p-next-next;if(p-next-next=NULL)/若p-next 是最后一个结点p-prior-data.ID=Free;p-next=NULL;elsep-next-next-prior=p-prior;break; if(p-pri
8、or-data.sign=Free)/与前面的空闲块相连p-prior-data.size+=p-data.size;p-prior-next=p-next;p-next-prior=p-prior;break;if(p-next-data.sign=Free)/与后面的空闲块相连p-data.size+=p-next-data.size;if(p-next-next=NULL)/若p-next 是最后一个结点p-next=NULL;elsep-next-next-prior=p;p-next=p-next-next;break;break;p=p-next;coutnext;while(p)coutdata.ID=Free)coutdata.IDdata.address ;coutdata.size data.sign=Free)coutdata.sign=PBusy)coutnext;coutchoice;if(choice=1)/ 分配内存Allocate();else if(choice=2)/ 内存回收 int ID;coutID;Recycle(ID);else if(choice=3)/显示主存show();else if(choice=0)/退出break;else /非法输入cout“输入有误!“endl;continue;