首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
自考
编写一个C程序,用char*malloc(unsigned size)函数向系统申请一块内存空间(如size=1000,单位为字节),用首次适应法 addr=(char *)fmalloc(unsigned slze) 和 ffree(unsigned s
编写一个C程序,用char*malloc(unsigned size)函数向系统申请一块内存空间(如size=1000,单位为字节),用首次适应法 addr=(char *)fmalloc(unsigned slze) 和 ffree(unsigned s
admin
2016-05-14
6
问题
编写一个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
操作系统
理工类
相关试题推荐
下列说法中,符合CIDF体系结构原理的说法是()
从20世纪90年代到现在,入侵检测系统的研发在___________和分布式两个方向取得了长足的进展。()
文件型病毒按其驻留内存方式可以分为哪几种?
入侵检测的目的是()
文件型病毒按其驻留内存方式可以分为哪几种?
在计算机病毒检测手段中,下面关于校验和法的表述,错误的叙述是()
入侵检测工作组IDWG提出三项建议草案,分别是___________、入侵检测交换协议IDXP及隧道轮廓TunnelProfile。
依据事物发展内部因素变化的因果关系来预测事物未来发展趋势的方法属于()
用于广播等特殊应用的IP地址为()
在页式存储管理中,若最大的程序可允许有8个页面,每页1024字节,则逻辑地址为________位。
随机试题
【背景资料】某机电公司承建某制造厂扩建一个车间的机电设备安装工程,内容包括:一台解体的油压机大型设备及其辅助设备;一台起重量为20t的桥式起重机;电气动力、照明系统;送风、排风系统等。该油压机最大净重为94t,其油压管路是50MPa的高
某钢筋混凝土现浇板跨度为7.8m,其模板是否起拱设计无具体要求,施工过程中其起拱高度可能为()cm。
关于钢筋代换的说法,正确的有()。
根据波特的价值链分析理论,下列各项中,属于企业支持活动(或称辅助活动)的是()。
资本有机构成的提高意味着在不变资本和可变资本的比例中()
结合材料回答问题:十八大报告指出,以毛泽东同志为核心的党的第一代中央领导集体,带领全党全国各族人民完成了新民主主义革命,进行了社会主义改造,为当代中国一切发展进步奠定了根本政治前提和制度基础;并对建设社会主义进行了初步探索,为新的历史时期开创中国
极限=_______.
判别级数的敛散性.
窗体上有一个名称为Commandl的命令按钮,其单击事件过程如下:PrivateSubCommand1_Click()Fori=3ToStep-1Sum=0Forj=1ToiSum=Sum+i*jNextNextPrint
下面描述中,不属于软件危机表现的是( )。
最新回复
(
0
)