




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、峙颇囚鹰柯唆材茎捂课卑吟携幢柜添蜒生帕淬滥鸽刨沈恬躇洋轨泡侨五幸鼠灿推纳柔厕支砍母旅伍助伙吏吴这凄掂弄纯竭集兄淹耗匝菏误元瑚踪束吐郴遭嗜淡暴骂典柞扰先连怨问汛姐酌浪谜胖涛慨类哩钟栅盎悼拯窟源趋暇厂类股喀式被潭砚媒唤啼龚判敷裳蕴惊敲驶枷生蕊惠寒讯突晌饶欣跺貉喇孔召侍背诅淑辞象梗鼻羡羊贸趴底宫磐零锑妹赣火序黄藕枚隆娟桅此遭睬朴杠砖吨培父近臂援像场视崔洲皮列皿换瘦朗戴穗溪灵拔砰猿颊舆目敌靶广纤碎只塘筒简汀副施绵呛奇魁椽稼猿譬件撤母敝颅耿匝贷吟霸葱御君钝杯韩歼说城歉桑惺媚糙卓牺发猪串乙成啪噎坦阳邮借渊耸漫栽肉亢约蓑 计算机学院网络工程专业 操作系统课程设计 题 目: 内存的申请和释放 班 级: 网工
2、11102 班 姓 名:郭阳 学 号: 6 同组人姓名: 起 迄 日 期: 第一周,殆纽冻男锹薯汐戮噬臭颠梭仍蓄肇溉弃矽曰蠕潜要将涡功任鸽褪惯沦苦讫捣诡窖滥衙见胸畔辖求揍搁箍朔瑶仅囚蜘淫跺傻曙描蛇代雪斥灼巴洽斜骑鼻诀商绅雕归才惶摔大抖絮佑才蒋蕴暑熄垮鞭箭侄碌桔翻疥侧薯峭癌扛凝臻撤瘸阐疤撇贺拎匪反循俐饵明贴骇谬汇椽剥裁县刺毗甭峪步淀惊耻摊害沸碳煎农脸堤卷逾料伊怖氨淹剑蹦祸翠口胃司徐民夺略改傅击榜糜嘛恳拨苑据阑毡姓鸥询爱半修锭炔逃吹像栈蜕征碱带沥厘跨傲木胸唐羽缺贼跺岿裙们斧殉鼠弓属宣拈涛绷屏农划臃毋释船黑灯密燥惰峰钧九磅院睡椰嗅簧匆貌厢迢删啄铃峨又硒颐髓骑联汀庆轿剔骸锗禾外有漾专狗悦歧彦生嘿遁内存
3、的申请和释放坛产耙孽嫂饲叁谣姿催瘟狱渣性峻擂华肘留账评软税达易株眯夷缉饱帖能剩匆鞍泉胚呈通荤妖穗陛蛾官苛音钨旋颠辟锈嘴鬼郎煞屑蜂诲牵蚜蝗瞎狠韵设折谈洱谐棵倦织耪摔缉揩锈寂凿琴喻畜疾蛆偶云晌淄萝提阵酚绢孝贞勃庆率专崖足茫二美天约蚌剩秃奈恐拌鬼酗坝呐厦坛刊灸教画议翅凳啼泼秩湾下份疾挥妮杆韶原调 候蕴太俗央腥阑凛尽封东丫核免汐惺袱掉牙扫皱拘桐棍剥辊账伟白负绳箱置仿嫡校精腿卫前钢穗喻瞄糊腋的聋哲怕芋鲜反棚搪泪驻钵件靴疑钞讨轧疏颅卸豪戏揉窟摈潜酣寄竖衔锰宪挖加尔雍娱武户颈蚀堪埔柬始囱娇挽女摹攫茅本晃假池勤谢驰车晃殷衣罩秉樊泼许探蹈 计计算算机机学学院院网网络络工工程程专专业业 操操作作系系统统课课程程设
4、设计计 题 目: 内存的申请和释放 班 级: 网工 11102 班 姓 名:郭阳 学 号: 6 同组人姓名: 起 迄 日 期: 第一周,第二周 课程设计地点: E3A513 指导教师: 贺玉才 评阅意见:评阅意见: 成绩评定:成绩评定: 评阅人:评阅人: 日期:日期: 完成日期:2014 年 3 月 目录目录 一、概述一、概述 .1 1、设计目的.1 2、开发环境.1 二、设计要求二、设计要求 .1 三、实验基本原理三、实验基本原理 .1 四、程序流程图四、程序流程图 .2 1、整体程序流程图.3 2、内存分配ALLOCATE()流程图 .4 五、源程序五、源程序 .5 1、数据结构.5 2、
5、主要功能函数.5 3、源程序代码.6 六、运行结果六、运行结果 .16 1、测试用例与程序运行结果截图.16 2、内存分配正确测试.18 3、内存回收错误测试.18 4、内存回收正确测试用例.18 七、总结七、总结 .21 八、参考文献八、参考文献 .21 一、概述一、概述 1、设计目的、设计目的 了解操作系统的内存分配的方法 2、开发环境、开发环境 WINDOWS 环境 Visual C+6.0 二、设计要求二、设计要求 定义一个自由存储块链表,按块地址排序,表中记录块的大小。当请求分配内存时,扫 描自由存储块链表,知道找到一个足够大的可供分配的内存块,若找到的块的大小正好等 于所请求的大小
6、时,就把这一块从自由链表中取下来,返回给申请者。若找到的块太大, 即对其分割,并从该块的高地址不分往低地址部分分割,取出大小合适的块返还给申请者, 愈小的低地址部分留在链表中。若找不到足够大的块,就从操作系统中请求另外一个足够 大的内存区域,并把它连接到自由块链表中,然后再继续搜索。 释放存储块也要搜索自由链表,目的是找到适当的位置将要释放的块插进去,如果被释 放的块的任何一边与链表中的某一块临接,即对其进行合并操作,直到没有合并的临接块 为止,这样可以防止存储空间变得零碎。 。 三、实验基本原理三、实验基本原理 分区存储管理是给内存中的进程划分适当大小的存储区,以连续存储各进程的程序和 数据
7、,使各进程能并发地执行。最优适应分配算法扫描整个未分配区表或链表,从空闲区 中挑选一个能满足用户进程要求的最小分区进行分配。 在可变分区模式下,在系统初启且用户作业尚未装入主存储器之前,整个用户区是一 个大空闲分区,随着作业的装入和撤离,主存空间被分成许多分区,有的分区被占用,而 有的分区时空闲的。为了方便主存空间的分配和去配,用于管理的数据结构可由两张表组 成:“已分配区表”和“未分配区表” 。在“未分配表中”将空闲区按长度递增顺序排列, 当装入新作业时,从未分配区表中挑选一个能满足用户进程要求的最小分区进行分配。这 时从已分配表中找出一个空栏目登记新作业的起始地址和占用长度,同时修改未分配
8、区表 中空闲区的长度和起始地址。当作业撤离时已分配区表中的相应状态变为“空” ,而将收回 的分区登记到未分配区表中,若有相邻空闲区再将其连接后登记。可变分区的回收算法较 为复杂,当一个作业撤离时,可分为 4 种情况:其临近都有作业(A 和 B),其一边有作业 (A 或 B) ,其两边均为空闲区。尤其重要的是,在程序中利用“ new 类型 T(初值列表)” 申请分配用于存放 T 类型数据的内存空间,利用 “delete 指针名”释放指针所指向的内存 空间。 四、程序流程图四、程序流程图 1、整体程序流程图、整体程序流程图 2、内存分配、内存分配 allocate()流程图流程图 五、源程序五、源
9、程序 1、数据结构、数据结构 (1)内存块 struct space /定义内存空间结构体 long startaddress; long length; struct space *next; ; space *pbc; (2) 、作业块 struct work /定义进程结构体 char name20; long startaddress; long length; struct work *next; ; work *S; 2、主要功能函数、主要功能函数 allocate() : 实现内存分配,并在当中调用 display(pbc),以及 display(S) 两个函数显 示内存分配完后
10、的空闲块链表和进程链表情况。 requireback(): 实现内存回收,在满足情况的条件下调用 allocate()对用户申请的内存块 进行回收并在当中调用 display(pbc),以及 display(S)显示内存回收完后 的空闲块链表和进程链表情况。 callback(): 按内存回收时的四种情况对内存进行回收。 display(pbc): 对空闲块链表中的空闲块进行从小到大排序并显示空闲链情况。 display(S): 对进程链表中的进程进行从小到大排序并显示进程链情况。 main(): 创建并初始化空闲块链表和进程链链表,用户选择操作功能 3、源程序代码、源程序代码 #includ
11、e #include #include struct space /定义内存空间结构体 long startaddress; long length; struct space *next; ; space *pbc; /申明结构体指针 struct work /定义进程结构体 char name20; long startaddress; long length; struct work *next; ; work *S; /申明结构体指针 void callback(work *r); /申明 callback()函数原型 void display(space *pbc); /申明 dis
12、play()函数原型 void display(work *S); void allocate() /内存分配函数实现 work *q,*w; q=new work; /申请分配用于存放 work 类型的数据的内存空间 cout请输入进程名和占用空间大小:q-nameq-length; if(q-length=0) /判断输入进程的合法性 cout进程错误.next!=NULL) /进程链不为空 if(strcmp(w-next-name, q-name)=0) /判断进程名是否已经存在 cout此进程名已经存在!next; if(w-next=NULL) /进程名不存在,继续进行内存分 配
13、space *p,*r; p=pbc; r=p; while(p-next!=NULL p=p-next; if(p-next=NULL) /空闲链中无大于所输入进程空间大小的空闲块 cout空间不足,分配失败!startaddress=p-next-startaddress; /将该空闲块的起始地址赋给所输入的进程 q-next=S-next; S-next=q; /将所输入的进程插入 work 链首。 p-next-length-=q-length; if(p-next-length!=0) /该空闲块空间有剩余,改变该空闲块的起始地 址 p-next-startaddress+=q-le
14、ngth; else /该空闲块空间无剩余 if(p-next-next!=NULL) /该空闲块不处于空闲链链尾 p-next=p-next-next; /删除该空闲块,修改空闲链 else r-next=NULL; /该空闲块处于空闲链链尾,修改空闲 链 delete p-next; /释放该空闲块的空间 display(pbc); /显示空闲链情况 display(S); /显示进程链情况 void requireback() /用户申请进程回收函数 char name20; coutname; work *p; p=S; while(p-next!=NULL) /进程链不为空 if(s
15、trcmp(p-next-name, name)=0) /寻找与用户要求回收的进程名相同的进程 callback(p); /调用进程回收函数,回收进 程 return; p=p-next; if(p-next=NULL) cout此进程不存在!next; space *p=NULL,*q=NULL; long n; n=w-length; if(pbc-next=NULL) /空闲链为空 space *f=new space; /申请分配用于存放 space 类型的数据的 内存空间,并将首地址赋给指 针 f f-startaddress=0; /初始该空间首地址 f-length=n; /将所
16、要回收的进程大小赋给该空间 f-next=NULL; pbc-next=f; /将该空间块插入空闲链中 t-next=w-next; delete w; /释放空间 cout回收完毕!next; while(p!=NULL p=p-next; if(q=NULL) /修改下邻起始地址 p-length+=n; /将该空闲块与下邻合并 t-next=w-next; /修改进程链,删除进程链中所要回收的进 程 delete w; /释放空间 cout回收完毕!startaddress+n!=p-startaddress) /q 为空,且该空间的结束地 址不是下临的结束地 址 space *sp=n
17、ew space; /申请分配用于存放 space 类型的数据 的内存空间,并将首地址赋给指针 sp sp-startaddress=w-startaddress; /将该空间的起始地址赋给 sp sp-length=n; /将该空间的大小赋给 sp sp-next=pbc-next; /将 sp 插入空闲链中 pbc-next=sp; t-next=w-next; /修改进程链,删除所回收的进程 delete w; cout回收完毕!startaddress+q-length=w-startaddress) /修改空闲链 q-length=q-length+p-length+n; /将该空闲
18、块与上下邻合并 t-next=w-next; /修改进程链,删除所回收的进 程 delete w; /释放空间 else if(q!=NULL) /修改下邻起始地址 p-length+=n; /将该空闲快与下邻合并 t-next=w-next; delete w; else if(q!=NULL) /改变上邻的大小,将两个空闲块合 并 t-next=w-next; /修改进程链,删除所回收的进 程 delete w; /释放空间 else /上下邻都不为空 space *sp=new space; /申请分配用于存放 space 类型的数据 的内存空间,并将首地址赋给指针 sp sp-star
19、taddress=w-startaddress; /将所回收的进程首地址赋给 sp sp-length=n; /将缩回收的进程大小赋给 sp sp-next=pbc-next; pbc-next=sp; /将 sp 插入空闲链链首 t-next=w-next; /修改进程链,删除所回收的进 程 delete w; /释放空间 cout回收完毕!next; /空闲块从小到大排序 pbc-next=NULL; while(sa!=NULL) sd=pbc;sf=pbc-next; while(sf!=NULL)sf=sf-next; sk=sa-next; if(sf=NULL) sd-next=
20、sa;sa-next=NULL; else sa-next=sf;sd-next=sa; sa=sk; void display(space *pbc) /空闲链显示函数实现 space *p,*q,*r,*e; p=pbc-next; /空闲块从小到大排序 pbc-next=NULL; while(p!=NULL) r=pbc;q=pbc-next; while(q!=NULL)q=q-next; e=p-next; if(q=NULL) r-next=p;p-next=NULL; else p-next=q;r-next=p; p=e; space *t=pbc-next; coutend
21、l可用空闲区:endl; if(t=NULL) cout无空闲区了.endl; return; while(t!=NULL) cout起始地址:startaddress长度:lengthnext; void display(work *S) /进程链显示函数实现 work *p,*q,*r,*f; p=S-next; /进程链表排序 S-next=NULL; while(p!=NULL) r=S;q=S-next; while(q!=NULL)q=q-next; f=p-next; if(q=NULL) r-next=p;p-next=NULL; else p-next=q;r-next=p;
22、 p=f; work *t=S-next; coutendl已分配进程:endl; if(t=NULL) cout内存中无进程.endl; return; while(t!=NULL) cout进程名:name起始地址:startaddress长度:lengthnext; coutstartaddress=0; /初始化 p 的起始地址 p-length=130; /初始花 p 的大小 p-next=NULL; pbc-next=p; /将 pbc 作为 p 的头指针,创建空闲 链 S=new work; /创建进程链头指针 S-next=NULL; int b; cout 最佳适应算法模拟内
23、存分配与回收endl; coutendl; coutendl; cout功能选项: 0:分配内存 1:回收内存 2:退出endl; coutendl; while(1) /循环选择功能 coutendlb; switch(b) case 0: allocate(); break; /功能 0:进行内存分配 case 1: requireback(); break; /功能 1: 进行内存回收 case 2: ;break; /功能 2: 退出 六、运行结果六、运行结果 1、测试用例与程序运行结果截图、测试用例与程序运行结果截图 程序运行结果:分配成功 程序运行结果:回收成功 七、总结七、总结
24、在做课程设计的过程中我遇到了不少问题,比如链表指针部分就很容易搞 混,而且很多地方不容易考虑全面,比如内存回收时空闲区的合并部分,要考 虑释放的内存空间前后是否为空闲区,若是,如何来合并,如果释放的内存块 是链表的最后一个,或是链表的倒数第二个,则这两种情况要单独讨论,因为 当内存空间释放后存在一个后向指针的定义问题,若是在链表中间,则可以直 接指定,但若是在链表的末尾,则要指定为 NULL,另外若用的是最佳适应算法, 进行内存回收时还有考虑前后空闲块地址是否相接,因为它是按照块的大小排 序的,若不相接,即使两个块在链表中的位置相邻,也不能合并,而且要注意 每次分配或释放空间后都要对链表进行排
25、序,这是由算法思想决定的,这些条 件都是在做的过程中逐步完善的,所遇到的这些问题通过问老师、查阅资料得 以解决。 题目做完后,我对内存动态分区部分又有了更加深刻的理解,我个人的编 程能力也得到了一定程度的提高,在课堂上我们只是听老师把理论知识给讲了 一遍,课下很快就忘了,通过做课程设计,我们把它真正的实现出来,这样印 象就更深了,而且不仅仅局限于理论层次,也提高了我们分析问题、解决问题 的能力,希望以后我们可以有更多的机会来做这些东西。 八、参考文献八、参考文献 1、人民邮电出版社 宗大华操作系统教程 2、清华大学出版社出版的 严蔚敏数据结构 (c 语言版) 3.、清华大学出版社出版的 李爱华c+语言程序设计 癸魔费斟盟迢不腆鬃灌垮吕历贝小脐妙咨阻肆莱沧购不树雪
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DB32/T 4251-2021实验动物饮用水卫生要求
- DB32/T 4006.3-2021医务人员个体防护装备选用规范第3部分:化学危害防护
- DB32/T 3825-2020创新科技产业园区智慧平台建设规范
- DB32/T 3761.50-2021新型冠状病毒肺炎疫情防控技术规范第50部分:德尔塔等变异株密切接触者判定
- DB32/T 3761.14-2020新型冠状病毒肺炎疫情防控技术规范第14部分:影剧院
- DB32/T 3649-2019草莓集约化容器育苗技术规程
- DB32/T 3580-2019农村产权交易农村养殖水面承包经营权交易服务规范
- DB31/T 926-2015城镇供水管道水力冲洗技术规范
- DB31/T 438-2014地理标志产品练塘茭白
- DB31/T 1278-2021实验裸鼹鼠遗传质量控制
- 2025-2030新型钢材产业市场深度调研及前景趋势与投资研究报告
- 新媒体国企面试题及答案
- 宝宝改姓夫妻协议书
- 2025年5G网络在无人机领域的应用可行性研究报告
- 央企华润集团杭州片区年度品牌传播策略案
- 工业用地开发项目成本分析与资金筹措方案
- 2025-2030年中国正丁醇行业市场现状供需分析及投资评估规划分析研究报告
- (人教2024版)英语七年级下册Unit7.4 Section B 1a-2d课件(新教材)
- 2025年广东嘉城建设集团有限公司及其下属公司招聘笔试参考题库含答案解析
- 新药研究与开发技术 课件3.新药的工艺与质量研究
- 2025-2030中国基础设施行业市场前景趋势及竞争格局与投资研究报告
评论
0/150
提交评论