首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
自考
编写一个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
4
问题
编写一个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
操作系统
理工类
相关试题推荐
基于网关的入侵检测系统是由新一代的___________结合路由与高速交换技术构成的。()
把自己的程序加入或取代部分操作系统进行工作,可以导致整个系统瘫痪的病毒称为()
根据任务属性的不同,入侵检测系统的功能结构分为哪几部分,作用分别是什么?
密码学中的五元组包括明文、密文、密钥、加密算法和___________。
列举恶意代码的防范方法。
在关于下图决策树的构成中正确的是
马尔柯夫分析在管理工作中得到应用的关键是首先找到()
在组通信中,组是定义为在某一系统中相互有关系的________的集合。
FSK的优缺点是什么?
随机试题
在Windows7中,使用还原按钮将窗口恢复成原来的大小,仅仅适应于___________。
A.0.1B.0.2C.0.5D.1E.2
具有咸味而能泻下软坚,还有清热功效的药物是()。
一般来说,如果某种户型单位特别比较难以消化,如开盘()月内仍未销售,此种户型可作为难点户型处理。
大型施工机械中,起重机械包括()、塔式起重机、龙门吊、桥式吊、叉车、卷扬机(≥3t)、电动葫芦(≥5t)等。
总结写作中一般使用的称谓是()。
若f(χ)在χ=0的某邻域内二阶连续可导,且=1,则下列正确的是().
设用两种仪器测量同一物体的长度分别得到如下结果:X1=5.51±0.05mmX2=5.80±0.02mm为综合这两种测量结果以便公布统一的结果,拟采刚加权平均方法,每个数的权与该数的绝对误差的平方成反比。经计算后,公布的测量结果是(
下列设备在断电后会丢失数据的是()。
A、Roadrage.B、Roadaccidents.C、Modernmotorists.D、Growthofhighways.A主持人在访谈开始部分就提到参加节目的嘉宾Neil会谈及roadrage的概况,而随后的访谈内容也是紧紧围绕
最新回复
(
0
)