《操作系统实验3-动态分区存储管理》由会员分享,可在线阅读,更多相关《操作系统实验3-动态分区存储管理(12页珍藏版)》请在金锄头文库上搜索。
1、实验三动态分区存储管理一:实验目的了解动态分区存储管理方式中的数据结构和分配算法,加深对动态分区存储管理方式及其实现技术的理解。二:实验内容用C语言或Pascal语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程Allocate()和回收过程Free()。其中,空闲分区采用空闲分区链来组织,内存分配时,优先使用空闲区低地址部分的空间。三:实验类别动态分区存储管理四:实验类型模拟实验五:主要仪器计算机六:结果和小结七:程序#include#include#include#define SIZE 640 / 内存初始大小#define MINSIZE 5 / 碎片最小值struct me
2、morystruct memory *former;/前向指针int address;/地址int num;/作业号int size;/分配内存大小int state;/状态0表示空闲,1表示已分配struct memory *next;/后向指针linklist;void intmemory()/ 初始化空闲分区链memory *p=(memory *)malloc(sizeof(memory);/ 分配初始分区内存 p-address=0;/ 给首个分区赋值 p-size=SIZE; p-state=0; p-num=-1; p-former=&linklist; p-next=NULL;
3、 linklist.former=NULL;/ 初始化分区头部信息 linklist.next=p;int firstFit(int num, int size)/ 首次适应算法memory *p = linklist.next;while(p != NULL)if(p-state = 0 & p-size = size) / 找到要分配的空闲分区if(p-size - size state = 1; p-num = num; else / 分配大小为size的区间 memory *node=(memory *)malloc(sizeof(memory); node-address=p-add
4、ress + size; node-size=p-size-size; node-state=0; node-num=-1; / 修改分区链节点指针 node-former=p; node-next=p-next; if(p-next !=NULL) p-next-former=node; p-next = node; / 分配空闲区间 p-size = size; p-state = 1; p-num = num; printf(内存分配成功!n); return 1; p = p-next; printf(找不到合适的内存分区,分配失败.n); return 0;int bestFit(i
5、nt num, int size)/ 最佳适应算法 memory *tar=NULL; int tarSize=SIZE + 1; memory *p=linklist.next; while(p!=NULL) if(p-state=0 & p-size = size & p-size size; p=p-next; if(tar!=NULL) if(tar-size - size state = 1;/ 整块分配 tar-num=num; else / 分配大小为size的区间 memory *node = (memory *)malloc(sizeof(memory); node-addr
6、ess = tar-address + size; node-size = tar-size - size; node-state = 0; node-num = -1; / 修改分区链节点指针 node-former = tar; node-next = tar-next; if(tar-next != NULL) tar-next-former = node; tar-next = node; / 分配空闲区间 tar-size = size; tar-state = 1; tar-num = num; printf(内存分配成功!n); return 1; else / 找不到合适的空闲
7、分区 printf(找不到合适的内存分区,分配失败!n); return 0; int freememory(int num)/ 回收内存 int flag=0; memory *p=linklist.next, *pp; while(p!=NULL) if(p-state=1 & p-num=num) flag = 1; if(p-former!= &linklist & p-former-state = 0) & (p-next != NULL & p-next-state = 0) / 情况1:合并上下两个分区 / 先合并上区间 pp=p; p=p-former; p-size+=pp-
8、size; p-next=pp-next; pp-next-former=p; free(pp); / 后合并下区间 pp=p-next; p-size+=pp-size; p-next=pp-next; if(pp-next!=NULL) pp-next-former=p; free(pp); else if(p-former=&linklist | p-former-state=1)& (p-next!=NULL&p-next-state =0) / 情况2:只合并下面的分区 pp=p-next; p-size+=pp-size; p-state=0; p-num=-1; p-next=p
9、p-next; if(pp-next!= NULL) pp-next-former=p; free(pp); else if(p-former!=&linklist&p-former-state=0)& (p-next=NULL | p-next-state=1) / 情况3:只合并上面的分区 pp=p; p=p-former; p-size+=pp-size; p-next=pp-next; if(pp-next != NULL) pp-next-former = p; free(pp); else / 情况4:上下分区均不用合并 p-state=0; p-num=-1; p=p-next; if(flag=1) / 回收成功 printf(内存分区回收成功.n);