编写一个C程序,用char*malloc(unsigned size)函数向系统申请一块内存空间(如size=1000,单位为字节),用首次适应法 addr=(char *)fmalloc(unsigned slze) 和 ffree(unsigned s

admin2016-05-14  5

问题 编写一个C程序,用char*malloc(unsigned size)函数向系统申请一块内存空间(如size=1000,单位为字节),用首次适应法
addr=(char *)fmalloc(unsigned slze)

ffree(unsigned size,char*addr)
模拟UNIX的可变分区内存管理,实现对该内存区的分配和释放管理。
空闲存储区表可采用结构数组的形式:
struct map{
unsigned m_size;
char*m addr;
};
struct map coremap[N];
要分配函数fmalloc的参数size和释放函数ffree的参数size、addr以键盘命令的形式输入,每次分配和释放后显示空闲存储区表。

选项

答案图13—1为整个程序的基本框架。 [*] 在程序清单13-1中,ffree函数释放的地址原应为位数较长的虚地址,为了便于调试, 本程序采用释放输入的地址为相对空闲区始地 址的相对地址,在调用ffree函数进行释放时, 将它加上空闲区始地址(base_addr)构成绝对地 址。同时,在输出空闲分区表时,不仅输出每个 分区的绝对地址,也输出相对地址。 程序清单13-1:first_fit.c #include<stdlib.h> #include<unistd.h> #include<stdio.h> #include<malloc.h> /*表的定义*/ #define N 5 structmap{ /*空闲存储区表*/ unsigned m_size; char*m_addr; }; Struct map coremap[N]; /*首次适应的分配函数*/ char*fmalloc(unsigned size) /*由于本函数只管理内存空间的分配,不需要核心代码的mp参数*/ { register char*a; register struct map*bp; for(bp=coremap;bp->m_size;bp++){/*从表首开始搜索*/ if(bp->m size>=size){/*找到够用的空闲区*/ a=bp->m_addr; bp->m addr+=size;/*修改空闲项起始地址*/ if((bp->m size-=size)==0)/*修改大小*/ do{/*该项空闲区全部被分配,删去该项*/ bp++; (bp-1)->m_addr=bp->m_addr; }while((bp-1)->m_size=bp->m_size); return(a);/*返回分配到的空闲区始址*/ } } return(0);/*无足够大小的空闲区*/ } /*首次适应的释放函数*/ ffree(unsigned size,char*aa) { struct map*bp; char*a,*t; unsignedtt; a=aa; for(bp=coremap;bp->m_addr<=a&&bp->m_size!=0;bp++); if(bp>coremap&&(bp-1)->m_addr+(bp-1)->m-size==a){/*情况1和2*/ (bp-1)->m_size+=size;/*情况1,与上空闲区合并*/ if(a+size==bp->m_addr){/*情况2,又与下空闲区合并*/ (bp-1)->m_size+=bp->m_size; while(bp->m_size){/*删除下空闲区*/ bp++; (bp-1)->m_addr=bp->m_addr; (bp-1)->m_size=bp->m_size; } } } else{ if(a+size==bp->m_addr&&bp->m_size){/*情况3,仅与下空闲区合并*/ bp->m_addr-=size, bp->m_size+=size; } else/*情况4,插入、一个新空闲区*/ if(size) do{ t=bp->m_addr; bp->m_addr=a; a=t; tt=bp->m_size; bp->m_size=size; bp++; }while(size=tt); } } /*coremap表的初始化程序*/ initCoremap(base addr,size) char*base addr; unsigned size; { /*第一项的m_addr指向用malloc申请到的addr, *第一项的m_size等于malloc申请的size, *其他各项清0*/ int i; coremap[0].m_addr=base addr; coremap[0].m_Size=size; for(i=1;i<N;i++){ coremap[i].m_size=0; coremap[i].m_addr=0; } } printcoremap(base addr)/*输出表的内容*/ char*base_addr; { int i,zero=0; printf("Size\tR_Addr ititAddrin"); for(i=0;i<N;i++){ if(coremap[i].msize!=0) printf("coremap[%d]:%u\t\t%u\t\t%u\n",i,coremap[i].m_size, coremap[i].m_addr-base_addr,coremap[i].m_addr); else printf("coremap[%d]:%uit\t%u\t\t%u\n",i,coremap[i].m_size,zero, zero); } } shouHelp()/*显示帮助信息*/ { printf("msize:分配内存in"); printf("fsize addr:释放内存\n"); printf("P:打印coremap表in"); printf("h:显示帮助信息in"); printf("q:退出执行in"); } maln() { unsigned size,total_size; char*base addr*addr,*start_addr,cmdchar; unsigned r_addr; printf("Please Input malloc size:"); scanf("%u",&total_size); base addr=malloc(total_size); initCoremap(base_addr,total_size); do{ printf("Please Input command,h for help.\n"); do/*过滤空白字符*/ cmdchar=getchar(); while(cmdchar==’’‖cmdchar==’\t’‖cmdchar==’\n’); switch(cmdchar) { case’m’:/*分配内存空间*/ scanf("%u",&size)j if(Size<0‖size>=total size){ printf("参数size错误\n"); break; } start_addr=fmalloc(size); if(start_addr==0) printf("没有足够大的空闲分区\n"); break; case’f’:/*释放分配的内存空间*/ Scanf("%u%u",&Size,&raddr); if(r_addr<0‖r_addr>=total_size){ printf("释放空闲区的起始地址超出范围\n"); break; } addr=base_addr+r_addr; ffree(size,addr); break; case’D’:/*输出coremap表*/ printCoremap(base_addr); break; case’h’:/*输出帮助信息*/ shouHelp(); break; case’q’:/*退出执行*/ break; detault: printf("非法命令,显示帮助信息,请键入"h"\n"); continue; } }while(cmdchar!=’q’); free(base_addr);/*释放用malloc申请到的内存*/ return; } 测试的输入命令和参数如下。 Please Input malloc size:1000/*输入向系统申请的整块内存的大小*/ Please Input command,h for help. m 100 m 100 m 100 f 100 0/*测试释放区与后空闲区不相邻,在其前面插入一个空闲区项*/ m 200 m 300 m 300/*测试没有足够大的空闲区情况*/ m 200 f 100 100/*测试释放区与第一个空闲区相邻,与前空闲区合并*/ f 3005 00/*测试释放区与前后空闲区皆不相邻,插入一个空闲区项*/ f 100 1000/*测试释放空闲区的起始地址超出范围的情况*/ m -100/*测试分配存储大小的参数非法*/ f 200 300/*测试释放区与后空闲区相邻,与后空闲区合并*/ f 100 200/*测试释放区与前、后空闲区皆相邻,三块合并成一块,删除后空闲区项*/ q/*退出运行*/ 上面的测试数据包含了用fmalloc分配到空闲内存的情况、没有足够大的空闲区和分配存储大小的参数非法的情况。释放空闲区时包含了释放区与前空闲区相邻、与后空闲区相邻、与前空闲区和后空闲区皆相邻和与前空闲区和后空闲区皆不相邻四种情况,还包括简单的出错判断和处理。如要在释放空闲区时判断更多的错误,程序中还有增加其他的出错判断和处理程序段。 测试数据中打印空闲存储区表coremap的p命令和输出结果等部分省略了。

解析
转载请注明原文地址:https://kaotiyun.com/show/oONx777K
本试题收录于: 操作系统题库理工类分类
0

最新回复(0)