首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
自考
编写一个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
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
操作系统
理工类
相关试题推荐
请把下图给出的入侵检测原理结构图填写完整。
根据访问权限,访问控制技术将用户分为三类:其中系统管理员为()
在计算机病毒检测手段中,下面关于特征代码法的表述,错误的是()
入侵检测工作组IDWG提出三项建议草案,分别是___________、入侵检测交换协议IDXP及隧道轮廓TunnelProfile。
某企业设备大修理活动明细如题37表,试编绘设备大修理的箭线式网络图,并在图中标出各结点时间参数。
盈亏平衡分析是以所有成本都能分为固定的和可变(变动)的两个组成部分为前提的。在这个前提下,总成本与销售量的关系是________的。
在关于下图决策树的构成中正确的是
下列属于进程调度算法的是()
什么是AMI码?它的优缺点是什么?
程序流程图主要用于软件开发的哪一阶段?它的主要优缺点有哪些?
随机试题
以下叙述中,错误的是________。
种植体周围组织病变分为两类,即
牙周组织破坏程度与局部刺激物的量不成比例的是
既能疏肝破气,又能散结消滞的药是
关于液体制剂质量要求的说法,错误的是()
患者,男性,60岁。头晕乏力3个月伴右侧锁骨骨折半月,体查:肋骨有压痛,血液生化检查血清碱性磷酸酶升高,骨髓细胞检查异常浆细胞>15%。骨照片示多个大小不等凿孔样溶骨性损害。该疾病最常见的类型是()。
某建筑公司承接一项综合楼任务,建筑面积100828m2,地下3层,地上26层,箱形基础,主体为框架一剪力墙结构。该项目地处城市主要街道交叉路口,是该地区的标志性建筑物。因此,施工单位在施工过程中加强了对工序质量的控制。在第5层楼板钢筋隐蔽工程验收时发现整个
公司借款需求与借款目的的区别在于:借款需求强调借款发生的原因,而借款目的强调借款的用途。()
线趋势延伸法的特点有()。
"Equalpayforequalwork"isaphraseusedbytheAmericanwomenwhofeelthattheyareunfairlytreatedbysociety.Theysayi
最新回复
(
0
)