操作系统实验-可变分区存储管理_第1页
操作系统实验-可变分区存储管理_第2页
操作系统实验-可变分区存储管理_第3页
操作系统实验-可变分区存储管理_第4页
操作系统实验-可变分区存储管理_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

作业一实验一:可变分区存储管理(一)

实验题目编写一个C程序,用char*malloc(unsignedsize函数向系统申请一次内存空间(如size=1000,单位为字节),模拟可变分区内存管理,实现对该内存区的分配和释放管理。(二)

实验目的1.加深对可变分区的存储管理的理解;2.提高用C语言编制大型系统程序的能力,特别是掌握C语言编程的难点:指针和指针作为函数参数;3.掌握用指针实现链表和在链表上的基本操作。图2-9释放区与前后空闲区相邻的情况(三)程序代码#include#include#include#definenew(type(type*malloc(sizeof(typetypedefstruct_map{unsignedintsize;char*address;struct_map*next;struct_map*prev;}map;typedefmap*pmap;typedefstruct_mem{unsignedinttotalSize;char*space;pmaphead;pmapcMap;}mem;typedefmem*pmem;pmemcreateMem(unsignedintto_size//创建内存区域{pmemnewMem=new(mem;pmapnewHead=new(map;newMem->totalSize=to_size;newHead->size=to_size;newHead->address=newMem->space;newHead->next=newHead;newHead->prev=newHead;newMem->head=newHead;newMem->cMap=newHead;returnnewMem;}voidfreeMem(pmemm{pmapmap,cMap;pmaphead=m->head;free(map->address;for(map=head;map->next!=head;{cMap=map;map=cMap->next;free(cMap;}free(m;}char*lmalloc(pmemcMem,unsignedintsize//分配函数{if(size>1000{printf("内存容量超出范围!\n";//当需要分配的内存空间已经大于实际空间时出错}else{pmapp=cMem->cMap;char*rAddr;if(size==0returnNULL;while(p->size{if(p->next==cMem->cMapreturnNULL;p=p->next;}rAddr=p->address;p->size-=size;p->address+=size;if(p->size==0{p->prev->next=p->next;p->next->prev=p->prev;cMem->cMap=p->next;if(cMem->head==pcMem->head=p->next;if(p->next!=cMem->headfree(p;}else{cMem->cMap=p;}returnrAddr;}}voidlfree(pmemm,unsignedintsize,char*addr//释放函数{pmapnextMap,prevMap,newMap;if(addrspace||addr>=m->space+m->totalSize{fprintf(stderr,"地址越界\n";//释放空间时,大小输入出错return;}nextMap=m->head;while(nextMap->address{nextMap=nextMap->next;if(nextMap==m->headbreak;}prevMap=nextMap->prev;if(nextMap!=m->head&&prevMap->address+prevMap->size==addr//第一种情况{prevMap->size+=size;if(addr+size==nextMap->address//第二种情况{prevMap->size+=nextMap->size;prevMap->next=nextMap->next;prevMap->next->prev=prevMap;if(nextMap==m->cMap{m->cMap=prevMap;}free(nextMap;nextMap=NULL;}}else{if(addr+size==nextMap->address//第三种情况{nextMap->address-=size;nextMap->size+=size;}else//第四种情况{newMap=new(map;newMap->address=addr;newMap->size=size;prevMap->next=newMap;newMap->prev=prevMap;newMap->next=nextMap;nextMap->prev=newMap;if(nextMap==m->headm->head=newMap;}}}voidprintMem(pmemm//打印函数{pmapmap=m->head;printf("\空闲内存空间:\n\-----------------------\n\大小起始地址\n";do{if(map==m->cMapprintf("->";elseprintf("";printf("%10u%10u\n",map->size,map->address;map=map->next;}while(map!=m->head;printf("-----------------------\n";}voidmain(//主函数{printf("--------------------------------------------------------\n";printf("请选择操作:分配内存(mor释放内存(for打印内存表(p\n";printf("--------------------------------------------------------\n";typedefenum{cmdMalloc,cmdFree,cmdPrint,cmdHelp,cmdQuit,cmdInvalid}cmdType;pmemm=createMem(1000;charcmd[20];char*addr;unsignedintsize;cmdTypetype;while(1{scanf("%s",cmd;if(cmd[1]=='\0'{switch(cmd[0]{case'm':case'M':type=cmdMalloc;break;case'f':case'F':type=cmdFree;break;case'p':case'P':type=cmdPrint;break;}}else{if(!strcmp(cmd,"malloc"type=cmdMalloc;elseif(!strcmp(cmd,"free"type=cmdFree;elseif(!strcmp(cmd,"print"type=cmdPrint;}switch(type{casecmdMalloc:scan

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论