ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:262.85KB ,
资源ID:27518913      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/27518913.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(动态分区存储管理系统分解.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

动态分区存储管理系统分解.docx

1、动态分区存储管理系统分解操作系统原理课程设计报告题目:动态分区分配存储管理系统所在学院: 计算机科学与技术学院 班 级: 11级计算机科学与技术(非师) 学 号: 20111202052 姓 名: 吴创连 指导教师: 黄侠剑 2014年3月18目 录1 引言 12 需求分析 13 概要设计 14 详细设计 14.1 问题描述和分析 14.2 程序流程图 24.3 数据结构体分析 34.4主要程序代码分析 45 调试与操作说明 115.1初始界面 115.2 模拟内存分配 125.3 回收内存界面 125.4 最佳适应算法的实现 135.5 最坏适应算法的实现 136总结与体会 131 引言操作

2、系统是最重要的系统软件,同时也是最活跃的学科之一。我们通过操作系统可以理解计算机系统的资源如何组织,操作系统如何有效地管理这些系统资源,用户如何通过操作系统与计算机系统打交道。存储器是计算机系统的重要组成部分,近年来,存储器容量虽然一直在不断扩大,但仍不能满足现代软件发展的需要,因此,存储器仍然是一种宝贵而又紧俏的资源。如何对它加以有效的管理,不仅直接影响到存储器的利用率,而且还对系统性能有重大影响。而动态分区分配属于连续分配的一种方式,它至今仍在内存分配方式中占有一席之地。2 需求分析动态分区分配是根据进程的实际需要,动态地为之分配内存空间。在实现动态分区分配时,将涉及到分区分配中所用的数据

3、结构、分区分配算法和分区的分配和回收操作这样三个问题。常用的数据结构有动态分区表和动态分区链。在对数据结构有一定掌握程度的情况下设计合理的数据结构来描述存储空间,实现分区存储管理的内存分配功能,应该选择最合适的适应算法(最佳适应算法,最坏适应算法),在动态分区存储管理方式中主要实现内存分配和内存回收算法,在这些存储管理中间必然会有碎片的产生,当碎片产生时,进行碎片的拼接等相关的内容。3 概要设计本程序采用机构化模块化的设计方法,共分为两大模块。1最佳适应算法实现它从全部空闲区中找出能满足作业要求的、且大小最小的空闲分区,这种方法能使碎片尽量小。为适应此算法,空闲分区表(空闲区链)中的空闲分区要

4、按从小到大进行排序,自表头开始查找到第一个满足要求的自由分区分配。2.最坏算法实现最坏适应分配算法要扫描整个空闲分区或链表,总是挑选一个最大的空闲分区分割给作业使用。该算法要求将所有的空闲分区按其容量从大到小的顺序形成一空闲分区链,查找时只要看第一个分区能否满足作业要求。4 详细设计4.1 问题描述和分析系统应利用某种分配算法,从空闲分区链表中找到所需大小的分区,如果空闲分区大小大于请求分区大小,则从该分区中按改请求的大小划分出一块内存空间大小划分出一块内存空间分配出去,余下的部分仍留在空闲链表中。然后,将分配区的首址返回给调用者。当进程运行完毕师范内存时,系统根据回收区的首址,从空闲区中找到

5、相应的插入点,此时可能出现以下四种情况之一:该空闲区的上下两相邻分区都是空闲区:将三个空闲区合并为一个空闲区。新空闲区的起始地址为上空闲区的起始地址,大小为三个空闲区之和。空闲区合并后,取消可用表或自由链中下空闲区的表目项或链指针,修改上空闲区的对应项。 该空闲区的上相邻区是空闲区:将释放区与上空闲区合并为一个空闲区,其起始地址为上空闲区的起始地址,大小为上空闲区与释放区之和。合并后,修改上空闲区对应的可用表的表目项或自由链指针。 该空闲区的下相邻区是空闲区:将释放区与下空闲区合并,并将释放区的起始地址作为合并区的起始地址。合并区的长度为释放区与下空闲区之和。同理,合并后修改可用表或自由链中相

6、应的表目项或链指针。两相邻区都不是空闲区:释放区作为一个新空闲可用区插入可用表或自由链。4.2 程序流程图内存分配流程图,如图4-1所示。内存回收流程图,如图4-2所示。4.3 数据结构体分析进程属性结构体typedef struct readyque char name10; int size;readyque,*readyqueue;空闲链表结构体typedef struct idlyspace int from; int size; idlyspace * next;idlyspace,*idly;已分配链表结构体typedef struct busyspace int from; re

7、adyque r; busyspace * next;busyspace,*busy 4.4主要程序代码分析#include#include#includeusing namespace std;typedef struct readyque/进程的属性结构体 char name10; int size;readyque,*readyqueue;typedef struct idlyspace/空闲表结构体 int from; int size; idlyspace * next;idlyspace,*idly;typedef struct busyspace/已分配链表结构体 int fro

8、m; readyque r; busyspace * next;busyspace,*busy;static idly Is;static idly Is2;static busy Bs;int bestfit();int worstfit();int recover();void Isprint();void Bsprint();int main() Is=(idly)malloc(sizeof(idlyspace); Is-from=0; Is-size=100; Is-next=NULL; Is2=Is; Bs=(busy)malloc(sizeof(busyspace); Bs-nex

9、t=NULL; int t,t1;l1: printf(|*欢迎来到动态分区存储管理系统*|n); printf(|请选择要执行的算法: |n); printf(| 1.最佳适应算法 |n); printf(| 2.最差适应算法 |n); printf(|*|n); printf(请输入您的选择:); scanf(%d,&t); system(cls);/ int i; while(i!=0) printf(|*|n); printf(| 操作菜单如下: |n); printf(| 1.分配空间 2.回收空间 |n); printf(| 3.返回上级 4.退出 |n); printf(|*|n

10、); scanf(%d,&i); system(cls); switch(i) case 1: switch(t) case 1: t1=bestfit(); break; case 2: t1=worstfit(); break; default: printf(选择算法错误n); return 1; if(t1) printf(分配空间成功n); else printf(分配空间失败n); Bsprint(); Isprint(); break; case 2: t1=recover(); if(t1) printf(回收成功n); else printf(回收失败n); Bsprint(

11、); Isprint(); break; case 3: goto l1; case 4: exit(0); default: printf(输入错误,重新输入n); return 0;int bestfit()/最佳适应算法 int t=0; readyque D; printf(请输入进程名:n); scanf(%s,D.name); printf(输入进程申请空间大小:n); scanf(%d,&D.size); idly l=Is; idly min=NULL; int mt=100; busy b=Bs; while(l) /在空闲链中寻找第一个大于所输入的进程大小的空闲块 if(D

12、.sizesize) if(D.sizesize; min=l; t=1; mt=mt-D.size; l=l-next; if(mt!=100)/找到第一个满足要求的空闲块 busy j; j=(busy)malloc(sizeof(busyspace);/申请分配用于存放进程的内存空间 j-from=min-from;/将第一个满足要求的空闲块(min)的首地址赋给j for(int i=0;ir.namei=D.namei; j-r.size=D.size;/将所申请的内存大小赋给j while(b-next)/按从小到大的顺序查找新进程在已分配区中的位置 if(b-next-fromf

13、rom) b=b-next; else break; j-next=b-next; b-next=j; /将所输入的进程插入进程链 min-from=min-from+D.size;/改变该空闲块的起始地址 min-size=min-size-D.size;/改变该空闲块的剩余大小 return t;int worstfit()/最坏适应算法 int t=0; readyque D; printf(请输入进程名:n); scanf(%s,D.name); printf(输入进程申请空间大小:n); scanf(%d,&D.size);/输入进程申请的空间大小 idly l=Is;/l指向空闲链

14、表ls头 idly min=NULL; int mt=0; busy b=Bs;/b指向已分配链表Bs头 /找到空闲分区中大小满足进程的请求且尺寸最大的结点 while(l) if(D.sizesize)/判断进程所申请的大小是否小于空闲区的各结点大小 if(l-sizemt) mt=l-size; min=l;/min指向空闲区中尺寸最大的结点 t=1; l=l-next;/l指向空闲链表下一个结点 if(mt!=0)/判断是否找到了空闲区的满足结点 busy j; j=(busy)malloc(sizeof(busyspace); j-from=min-from; for(int i=0;

15、ir.namei=D.namei; j-r.size=D.size; while(b-next)/寻找插入到已分配链表中的位置 if(b-next-fromfrom) b=b-next; else break; /把此进程结点j插入到已分配链表中 j-next=b-next; b-next=j; /修改空闲链表的相应结点的参数 min-from=min-from+D.size; min-size=min-size-D.size; return t;int recover() readyque D; printf(请输入想要回收的进程名n); scanf(%s,D.name); busy b=B

16、s; idly l=Is; while(b-next) /查找输入的进程名是否在已分配链表中 bool yo=1; for(int i=0;inext-r.namei=D.namei) yo=yo*1; else yo=0; /如果在已分配链表中则释放该结点所占空间 if(yo) int t=b-next-from; int ts=b-next-r.size; while(l) if(l-fromt+ts)/所回收进程与空闲结点上下都不邻接 idly tl; tl=(idly)malloc(sizeof(idlyspace); tl-from=t; tl-size=ts; tl-next=l;

17、 Is=tl; break; if(l-from=t+ts)/所回收进程与空闲结点下邻接 l-from=t; l-size=l-size+ts; busy tb=b-next; b-next=b-next-next; free(tb); return 1; if(l-from+l-sizefrom=t; tl-size=ts; tl-next=l-next; l-next=tl; break; else if(l-from+l-size=t)/所回收进程与空闲结点上邻接 l-size=l-size+ts; if(l-from+l-size=l-next-from)/所回收进程与空闲结点上下都邻

18、接 l-size=l-size+l-next-size; idly tm=l-next; l-next=l-next-next; free(tm); break; l=l-next; /从已分配链表中释放所回收进程 busy tb=b-next; b-next=b-next-next; free(tb); return 1; b=b-next; printf(没找到这个进程n); return 0;void Isprint()/输出空闲表中进程的属性值 idly t=Is; printf(-*空闲分区表*-n); printf(进程名tt起始地址t大小n); while(t) printf(%

19、stt%4dtt%4dn,0,t-from,t-size); t=t-next; void Bsprint()/输出已分配表中进程的属性值 busy t=Bs-next; printf(-*已分配分区表*-n); printf(进程名tt起始地址t大小n); while(t) printf(%stt%4dtt%4dn,t-r.name,t-from,t-r.size); t=t-next; 5 调试与操作说明5.1初始界面程序初始界面,有两个块选择,选择要执行的算法,调试以最佳算法为例,如图5-1和5-2所示。 图5-1 图 5-25.2 模拟内存分配给进程1分配内存10,如图5-3所示。 图

20、5-35.3 回收内存界面回收进程1所占内存,如图5-4所示。 图5-45.4 最佳适应算法的实现如图5-5所示。 图5-55.5 最坏适应算法的实现如图5-6所示。 图5-46总结与体会本次做的课题是动态分区分配算法实现,此次课程设计成功实现了内存分配和内存回收,内存分配中包含了两种算法,分别是最佳适应算法和最坏适应算法。经编码调试,表明该程序模块是有效可行的。在开始做的时候发现根本不知道该从什么地方下手,接着便开始上网查找,但是网络上的东西很多都是没有用的,于是自己开始去图书馆找资料,看了很多有关动态分区分配算法方面的知识以后,才对这两个算法有了新的理解,于是在掌握了这些基础知识之上,对课题进行分析,然后便一步步按照要求编写程序。此次的课程设计,学到了很多知识。因此首先要感谢周老师,为我提供了实践的机会,我才有这样一个学习知识的机会。其次,在本次课程设计的过程中,我要感谢我的同学,正是由于他们的帮助和支持,我才能比较顺利的完成这次课程设计任务。在此,我表示由衷地感谢。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1