欢迎来到天天文库
浏览记录
ID:18324580
大小:79.73 KB
页数:9页
时间:2018-09-16
《可变分区存储管理》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验一可变分区存储管理(一)实验题目编写一个C程序,用char*malloc(unsignedsize)函数向系统申请一次内存空间(如size=1000,单位为字节),模拟UNIX可变分区内存管理,实现对该内存区的分配和释放管理。(二)实验目的1.加深对可变分区的存储管理的理解;2.提高用C语言编制大型系统程序的能力,特别是掌握C语言编程的难点:指针和指针作为函数参数;3.掌握用指针实现链表和在链表上的基本操作。(三)重要数据结构和算法1。内存申请用首次适应法addr=(char*)fmalloc
2、(unsignedsize)和ffree(unsignedsize,char*addr)申请一块内存空间2。空闲存储区表可采用结构数组的形式(基本要求)或双向链接表的形式(提高一步),建议采用的数据结构为:结构数组的形式:structmap{unsignedm_size;char*m_addr;};structmapcoremap[N];然后构建大块的结构STRUCTCOLUME,由STRUCTMAP组成链接的小块依序向内填充。按照MALLOC和FREE的具体要求,对于链表的组成部分MAP进行分类
3、操作,并且由SIZE和ADDR来记录块的大小和位置。3.MALLOC和FREE的算法采用首次适应法为作业分配大小为size的内存空间时,总是从表的始端的低地址部分开始查找。当第一次找到大于或等于申请大小的空闲区时,就按所需大小分配给作业。如果分配后原空闲区还有剩余空间,就修改原存储区表项的m_size和m_addr,使它记录余下的“零头”。如果作业所需空间正好等于该空闲区大小,那么该空闲区表项的m_size就成为0。接下来要删除表中这个“空洞”,即将随后的各非零表项依次上移一个位置。前空闲区释放区
4、后空闲区(a)前空闲区释放区后空闲区(b)前空闲区释放区后空闲区(c)前空闲区释放区后空闲区(d)图2-9释放区与前后空闲区相邻的情况由图示所述在释放时的4种不同情况,在FREE时先用IF语句对不同的情况做分类讨论,然后再各自进入所对应的支路。此外,由实践得知,在释放区紧贴内存申请区的边界时,所用循环语句可能有不适用的情况,需要做额外的处理。(四)源程序、注释、输入和结果#include#include#definesysmaxsize1000;structm
5、ap{unsignedm_size;char*m_addr;structmap*next;};char*addr=(char*)malloc(sysmaxsize);//程序内存申请structcolume{public:map*ori;colume(){ori=newmap;//大小为1000的内存空间ori->m_size=sysmaxsize;ori->m_addr=addr;ori->next=ori;}~colume(){deleteori;}voidadd(map*q,map*p)//
6、增加节点{if(q!=NULL){p->next=q->next;q->next=p;}else{ori=p;p->next=ori;}}voiddel(map*q)//删除节点{map*p=q->next;if(p==q)ori=NULL;elseq->next=p->next;deletep;}};colume*cure=newcolume;voidmain(){charcmdchar,*a,c;unsigneds;printf("%d%d",addr,sysmaxsize);//prin
7、tthelogicaladdresswhile(1){do{cmdchar=getchar();//inputthecommand}while(cmdchar==''
8、
9、cmdchar=='t'
10、
11、cmdchar=='');if(cmdchar=='m')//malloc{scanf("%u",&s);a=Imalloc(s);if(a==0)printf("mallocfailed");elseprintf("%d%d",s,a-int(addr));printfreespace(
12、);}elseif(cmdchar=='f')//free{scanf("%u%u",&s,&a);c=Ifree(s,a+int(addr));if(c!=0)printf("freesuccessfully");elseprintf("freeerror");printfreespace();}elsebreak;}}char*Imalloc(unsignedsize){registerchar*a;registerstructmap*blankpot;blankpot
此文档下载收益归作者所有