模拟设计动态分区存储管理的分配与回收.docx
- 文档编号:4415822
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:21
- 大小:281.38KB
模拟设计动态分区存储管理的分配与回收.docx
《模拟设计动态分区存储管理的分配与回收.docx》由会员分享,可在线阅读,更多相关《模拟设计动态分区存储管理的分配与回收.docx(21页珍藏版)》请在冰豆网上搜索。
模拟设计动态分区存储管理的分配与回收
学号:
0121010340518
课程设计
题目
模拟设计动态分区存储管理的分配与回收
学院
计算机科学与技术学院
专业
班级
姓名
指导教师
吴利军
2013
年
01
月
16
日
课程设计任务书
学生姓名:
专业班级:
指导教师:
吴利军工作单位:
计算机科学与技术学院
题目:
模拟设计动态分区存储管理的分配与回收
初始条件:
1.预备内容:
阅读操作系统的内存管理章节内容,理解动态分区存储管理,掌握动态分区管理内存的分配和回收过程。
2.实践准备:
掌握一种计算机高级语言的使用。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1.采用动态分区管理方案实施内存分配和回收。
能够处理以下的情形
⑴能够输入给定的内存大小,进程的个数,每个进程所需内存空间的大小;
⑵当某进程提出申请空间的大小后,显示能否满足申请,以及为该进程分配资源后有关内存空间使用的情况;
⑶当某进程撤消时,显示内存回收后内存空间的使用情况(注意回收后的合并)。
2.设计报告内容应说明:
⑴需求分析;
⑵功能设计(数据结构及模块说明);
⑶开发平台及源程序的主要部分;
⑷测试用例,运行结果与运行情况分析;
⑸自我评价与总结:
)你认为你完成的设计哪些地方做得比较好或比较出色;
)什么地方做得不太好,以后如何改正;
)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);
)完成本题是否有其他方法(如果有,简要说明该方法);
时间安排:
设计安排一周:
周1、周2:
完成程序分析及设计。
周2、周3:
完成程序调试及测试。
周4、周5:
验收、撰写课程设计报告。
(注意事项:
严禁抄袭,一旦发现,一律按0分记)
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
模拟设计动态分区存储管理的分配与回收
1.需求分析
1.1动态分区
动态分区分配又称为可变式分区分配,是一种动态划分存储器的分区方法。
不事先将内存划分成一块块的分区,而是在作业进入内存时,根据作业的大小动态地建立分区,并使分区的大小正好适应作业的需要。
因此系统中分区的大小是可变的,分区的数目也是可变的。
这种分配方法管理简单,只需小量的软件和硬件支持,便于用户了解和使用。
进程的大小与某个分区大小相等,从而主存的利用率有所提高。
动态分区虽然解决了固定分区所造成的内存浪费问题,但随着进程的动态变化,系统也将进行一系列的内存空间的分配和回收活动,每个进程所释放的内存空间就作为一个空闲区加以再分配。
由于再分配时只能分给不大于当前空闲区的进程,所以每个空闲区再分配时多数情况下会变成两个区:
一个区分给当前请求内存空间的进程,剩下的空间依然作为空闲区等待分配。
这样,分配后剩余的空闲区将会越分越少,从而导致内存中存在大量分散的小空闲区,这种小得不能再利用的空闲区称之为“碎片”。
1.2分配内存
系统利用某种分配算法,从空闲分区表/链中找到所需大小的分区。
分区的切割:
设请求的分区大小为u.size,空闲分区的大小为m.size,若m.size-u.sizesize(size是事先规定的不再切割的剩余分区的大小),说明多余部分大小,可不再切割,将整个分区分配给请求者;否则,从该分区中按请求的大小划分出一块内存空间分配出去,余下的部分仍留在空闲分区表/链中,然后,将分配区的首址返回给调用者。
1.3回收内存
当作业执行结束时,应回收已使用完毕的分区。
系统根据回收分区的大小及首地址,在空闲分区表中检查是否有邻接的空闲分区,如有,则合成为一个大的空闲分区,然后修改有关的分区状态信息。
回收分区与已有空闲分区的相邻情况有以下四种:
①回收分区上邻接一个空闲分区,合并后首地址为空闲分区的首地址,大小为二者之和。
②回收分区下邻接一个空闲分区,合并后首地址为回收分区的首地址,大小为二者之和。
③回收分区上下邻接空闲分区,合并后首地址为上空闲分区的首地址,大小为三者之和。
④回收分区不邻接空闲分区,这时在空闲分区表中新建一表项,并填写分区大小等信息。
2.功能设计
2.1数据结构
2.1.1空闲分区表
用来登记系统中的空闲分区(分区号,分区起始地址,分区大小及状态).
分区号
大小KB
起始地址KB
状态
1
32
352
空闲
2
…
…
空表目
3
520
504
空闲
4
…
…
空表目
5
…
…
…
2.1.2空闲分区链
用链头指针将系统中的空闲分区链接起来,构成空闲分区链。
每个空闲分区的起始部分存放相应的控制信息(如大小,指向下一空闲分区的指针等).
2.2模块说明
2.12.1分区说明表
structPST
{//partitionspecificationtable
intid;//分区号
intaddr;//起始地址
intsize;//分区长度
Statusstate;//状态
};
2.2.2双向链表
structNode
{//双向链表结点
PSTdata;
Node*back;//前驱
Node*next;//后继
Node()
{
back=NULL;
next=NULL;
}
Node(intid,intsize)
{
data.ID=id;
data.size=size;
back=NULL;
next=NULL;
}
};
2.2.3最先适应算法
空闲分区(链)按地址递增的次序排列。
在进行内存分配时,从空闲分区表/链首开始顺序查找,直到找到第一个满足其大小要求的空闲分区为止。
然后再按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲分区表(链)中。
算法特点:
优先利用内存低地址部分的空闲分区,从而保留了高地址部分的大空闲区。
但由于低地址部分不断被划分,致使低地址端留下许多难以利用的很小的空闲分区(碎片或零头),而每次查找又都是从低地址部分开始,这无疑增加了查找可用空闲分区的开销。
StatusFFA(intid,intsize)
{//headfitalgorithm
Node*temp=newNode(id,size);
temp->data.state=BUSY;
Node*cur=head->next;
while(cur)
{
if(cur->data.state==FREE&&cur->data.size==size)
{//如果空闲块大小刚好与请求大小相等,直接分配
cur->data.ID=id;
cur->data.state=BUSY;
returnOK;
break;
}
if(cur->data.state==FREE&&cur->data.size>size)
{//如果大于
temp->back=cur->back;
temp->next=cur;
cur->back->next=temp;
temp->data.addr=cur->data.addr;
cur->back=temp;
cur->data.addr=cur->data.addr+size;
cur->data.size=cur->data.size-size;
returnOK;
break;
}
cur=cur->next;
}
returnERROR;
}
2.2.4最佳适应算法
空闲分区表/链按容量大小递增的次序排列。
在进行内存分配时,从空闲分区表/链的首开始顺序查找,直到找到第一个满足其大小要求的空闲分区为止。
按这种方式为作业分配内存,就能把既满足作业要求又与作业大小最接近的空闲分区分配给作业。
如果该空闲分区大于作业的大小,则与首次适应算法相同,将剩余空闲分区仍留在空闲分区表/链中。
算法特点:
若存在与作业大小一致的空闲分区,则它必然被选中,若不存在与作业大小一致的空闲分区,则只划分比作业稍大的空闲分区,,从而保留了大的空闲分区,但空闲区一般不可能正好和它申请的内存空间大小一样,因而将其分割成两部分时,往往使剩下的空闲区非常小,从而在存储器中留下许多难以利用的小空闲区(碎片或零头)。
StatusBFA(intid,intsize)
{//bestfitalgorithm
Node*temp=newNode(id,size);
temp->data.state=BUSY;
intmin;//记录符合满足请求的最小空闲块大小
Node*fit;//指向采用最佳适应算法的插入位置
Node*cur=head->next;
while(cur)
{//取得第一个可以分配的位置(不一定是最佳位置)
if(cur->data.state==FREE&&cur->data.size>=size)
{
fit=cur;
min=cur->data.size-size;
break;
}
cur=cur->next;
}
while(cur)
{
if(cur->data.state==FREE&&cur->data.size==size)
{//如果相等直接分配
cur->data.state=BUSY;
cur->data.ID=id;
returnOK;
break;
}
if(cur->data.state==FREE&&cur->data.size>size)
{//获取最佳位置
if(cur->data.size-size { min=cur->data.size-size; fit=cur; } } cur=cur->next; } if(fit) {//若最佳,插入 temp->back=fit->back; temp->next=fit; fit->back->next=temp; temp->data.addr=fit->data.addr; fit->back=temp; fit->data.addr=fit->data.addr+size; fit->data.size=fit->data.size-size; returnOK; } else returnERROR; } 2.2.5最坏适应算法 空闲分区表/链按容量大小递减的次序排列。 在进行内存分配时,从空闲分区表的首开始顺序查找,直到找到第一个比之大的空闲分区为止。 剩下的空闲仍留在空闲分区表/链中。 算法特点: 总是挑选满足作业要求的最大的分区分配给作业。 这样使分给作业后剩下的空闲分区也较大,可装下其它作业。 但由于最大的空闲分区总是因首先分配而划分,当有大作业到来时,其存储空间的申请往往会得不到满足。 StatusWFA(intid,intsize) {//worstfitalgorithm Node*temp=newNode(id,size); temp->data.state=BUSY; intmax;//记录符合满足请求的最小空闲块大小 Node*fit;//指向采用最坏适应算法的插入位置 Node*cur=head->next; while(cur) {//取得第一个可以分配的位置(不一定是最佳位置) if(cur->data.state==FREE&&cur->data.size>=size) { fit=cur; max=cur->data.size-size; break; } cur=cur->next; } while(cur) {/* if(cur->data.state==FREE&&cur->data.size==size) {//如果相等直接分配 cur->data.state=BUSY; cur->data.ID=id; returnOK; break; } */ if(cur->data.state==FREE&&cur->data.size>size) {//获取最佳位置 if(cur->data.size-size>max) { max=cur->data.size-size; fit=cur; } } cur=cur->next; } if(fit) {//若最佳,插入 temp->back=fit->back; temp->next=fit; fit->back->next=temp; temp->data.addr=fit->data.addr; fit->back=temp; fit->data.addr=fit->data.addr+size; fit->data.size=fit->data.size-size; returnOK; } else returnERROR; } 3.开发平台及源程序的主要部分 3.1开发平台 本次课程设计开发平台MicrosoftVisualC++6.0 3.2源程序的主要部分 //#defineMAX_LEN1024//定义内存大小,1024字节 enumStatus{FREE,BUSY,OK,ERROR}; structPST structNode intarea;//输入内存空间 Node*head,*last; voidInit(intarea) { head=newNode(); last=newNode(); head->next=last; last->back=head; last->data.addr=0; last->data.ID=0; last->data.size=area; last->data.state=FREE; } StatusFFA(intid,intsize) StatusBFA(intid,intsize) StatusWFA(intid,intsize) voidFree(intid) { Node*cur=head; while(cur) { if(cur->data.ID==id) { cur->data.state=FREE; cur->data.ID=FREE; if(cur->back->data.state==FREE)//与前面的空闲块相连 { cur->back->data.size+=cur->data.size; cur->back->next=cur->next; cur->next->back=cur->back; } if(cur->next->data.state==FREE)//与后面的空闲块相连 { cur->data.size+=cur->next->data.size; cur->next->next->back=cur->back; cur->back->next=cur->next; } break; } cur=cur->next; } } StatusAssign(intchoice) { intid,size; cout<<"请输入区号: "; cin>>id; cout< "; cin>>size; if(size<=0) { cout<<"输入错误! "< returnERROR; } if(choice==1) { if(FFA(id,size)==OK) cout<<"分配成功! "< else cout<<"分配失败! "< } elseif(choice==2) { if(BFA(id,size)==OK) cout<<"分配成功! "< else cout<<"分配失败! "< } elseif(choice==3) { if(WFA(id,size)==OK) cout<<"分配成功! "< else cout<<"分配失败! "< } else returnERROR; } voidShow() { Node*cur=head->next; while(cur) { cout<<"***********************************"< cout<<"区号: "; if(cur->data.ID==FREE) cout<<"无"< else cout< cout<<"起始地址: "< cout<<"分区长度: "< cout<<"状态: "; if(cur->data .state==BUSY) cout<<"已分配"< else cout<<"未分配"< cur=cur->next; } } intmain() { cout<<"动态分区分配方式的模拟"< cout<<"********************************************"< cout<<"请输入内存大小(KB): "; cin>>area; while(area<=0) { cout<<"输入错误,请重新输入内存大小(KB)"; cin>>area; } while (1) { cout<<"********************************************"< cout<<"**1.FFA2.BFA3.WFA0.EXIT**"< cout<<"********************************************"< cout<<"请选择: "; intch; cin>>ch; if(ch==0) { break; } Init(area); intchoice; while (1) { cout<<"********************************************"< cout<<"**1.ASSIGN2.FREE3.SHOW0.QUIT**"< cout<<"********************************************"< cout<<"请输入您的操作: "; cin>>choice; if(choice==1) { cout<<"请输入进程个数"; intnum; cin>>num; for(;num>0;num--) { Assign(ch); } } elseif(choice==2) { intID; cout<<"请输入您要释放的分区号: "; cin>>ID; Free(ID); } elseif(choice==3)Show(); elseif(choice==0)break; else { cout<<"输入有误,请重试! "< continue; } } } return0; } 4.程序的调试与运行结果 4.1内存大小设置 4.2分配算法的选择界面 4.3操作的选择 4.3.1分配 4.3.2内存分配情况 4.3.4内存释放 4.3.5内存释放后内存分配情况 4.3.6重新分配内存 4.3.7使用BFA分配后内存情况 5.自我评价与总结 本次的课程设计花费了将近一周的时间,通过一周的努力,顺利的完成了本次的课程设计,取得了预期的目标。 本次的课程设计的程序有很多亮点,首先是在编写程序的初期,能够很好的设计好了程序的结构,这样对在编写程序阶段有很大的帮助,有很明确的目标,减少了很多不必要的过程,其次是课程设计采用了分层的设计模型,先设计总体功能,然后再详细设计各部分功能。 同时,本次的课程设计有很多的不足之处,程序的运行界面设计的不太人性化,还有就是由于基础知识不牢固,在编写链表程序的时候耽误了很多的时间。 通过本次的课程设计,我学到了很多的东西,首先是在编写程序的时候,由于对高级语言的基础知识掌握的不牢固,让我认识到其重要性,以后要不断的努力。 其次是通过本次课程设计,让我对操作系统的知识有更深的了解,让自己对课堂上学到的知识有更深的了解。 最后,本次的课程设计对我提出了更高的要求,只有不断的学习,才能满足以后的需求。 本科生课程设计成绩评定表 序号 评分项目 满分 实得分 1 学习态度认真、遵守纪律 10 2 设计分析合理性 10 3 设计方案正确性、可行性、创造性 20 4 设计结果正确性 40 5 设计报告的规范性 10 6 设计验收 10 总得分/等级 评语: 注: 最终成绩以五级分制记。 优(90-100分)、良(80-89分)、中(70-79分)、 及格(60-69分)、60分以下为不及格 指导教师签名: 20年 月 日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模拟 设计 动态 分区 存储 管理 分配 回收