首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
自考
编写一个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
9
问题
编写一个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
操作系统
理工类
相关试题推荐
恶意代码的关键技术主要有:生存技术、___________和隐藏技术。
在计算机病毒检测手段中,下面关于特征代码法的表述,错误的是()
对于给定的明文“idea”,使用加密函数E(m)=(m3+4)mod26进行加密,其中m表示明文中被加密字符在字符集合(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z)中的序号,序号依次为0~25。
从工作原理角度看,防火墙主要可以分为哪两类?防火墙的主要实现技术有哪些?
在库存管理中,为了预防可能出现缺货现象而保持的额外库存量,称为()
线性规划是试图合理地分配各种_______以最优地实现某个_______的规划方法。
库存管理的目标主要是保证企业按科学的计划实现_________生产,并且使_________达到最低。
所谓原语就是只具有某种功能,运行时有________的小段程序。
在组通信中,组是定义为在某一系统中相互有关系的________的集合。
需求开发的意图是,生成并分析________、产品需求和________。
随机试题
根据提供的“沙尘暴简介.docx”文件,制作名为“沙尘暴”的演示文稿,具体要求如下:采用在展台浏览的方式放映演示文稿,动画效果要贴切、丰富,幻灯片切换效果要恰当。
钙化性转移常见于
Crohn病腹痛常见位于
属于医师同情美德的是属于医师克己美德的是
影响神经系统发育最重要的激素是
首先创用活血利水法治疗瘀血水肿的古籍是()
设α1,α2,α3为三维向量,则对任意常数k,l,向量组α1+kα3,α2+lα3线性无关是向量组α1,α2,α3线性无关的()
教育是培养人的社会活动,这是()。
临渴掘井:临阵磨枪
AutoIndustryInMichiganInthe20thCentury,theroadtotheAmericanDreambeganinMichigan.Ourstatenotonlyputthe
最新回复
(
0
)