动态分区管理的主存分配模拟设计最先适应法最优适应法.docx
- 文档编号:30226668
- 上传时间:2023-08-07
- 格式:DOCX
- 页数:28
- 大小:279.09KB
动态分区管理的主存分配模拟设计最先适应法最优适应法.docx
《动态分区管理的主存分配模拟设计最先适应法最优适应法.docx》由会员分享,可在线阅读,更多相关《动态分区管理的主存分配模拟设计最先适应法最优适应法.docx(28页珍藏版)》请在冰豆网上搜索。
动态分区管理的主存分配模拟设计最先适应法最优适应法
学号:
012
课程设计
题目
动态分区管理的主存分配模拟设计--最先适应法、最优适应法
学院
计算机科学与技术学院
专业
计算机科学与技术专业
班级
姓名
指导教师
2011
年
01
月
18
日
课程设计任务书
学生姓名:
专业班级:
计算机
指导教师:
工作单位:
计算机科学与技术学院
题目:
动态分区管理的主存分配模拟设计--最先适应法、最优适应法
初始条件:
1.预备内容:
阅读操作系统的内存管理章节内容,理解动态分区的思想,并体会各分配算法的具体实施方法。
2.实践准备:
掌握一种计算机高级语言的使用。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1.采用指定算法模拟动态分区管理方式的主存分配。
能够处理以下的情形:
⑴随机出现的进程i申请jKB内存,程序能判断是否能分配,如果能分配,要求输出分配的首地址Faddress,并要求输出内存使用情况和空闲情况。
内存情况输出的格式为:
Faddress该分区的首地址;Eaddress该分区的尾地址
Len分区长度;Process如果使用,使用的进程号,否则为0
⑵主存分配函数实现寻找空闲区、空闲区表的修改、已分配区表的修改功能;
2.设计报告内容应说明:
⑴课程设计目的与功能;
⑵需求分析,数据结构或模块说明(功能与框图);
⑶源程序的主要部分;
⑷运行结果与运行情况分析;
⑸自我评价与总结:
)你认为你完成的设计哪些地方做得比较好或比较出色;
)什么地方做得不太好,以后如何改正;
)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);
)完成本题是否有其他的其他方法(如果有,简要说明该方法);
)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:
设计安排一周:
周1、周2:
完成程序分析及设计。
周2、周3:
完成程序调试及测试。
周4、周5:
验收、撰写课程设计报告。
(注意事项:
严禁抄袭,一旦发现,抄与被抄的一律按0分记)
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
动态分区管理的主存分配模拟设计--最先适应法、最优适应法
1.目的与功能
采用指定算法模拟动态分区管理方式的主存分配。
能够处理以下的情形:
⑴随机出现的进程i申请jKB内存,程序能判断是否能分配,如果能分配,要求输出分配的首地址Faddress,并要求输出内存使用情况和空闲情况。
内存情况输出的格式为:
Faddress该分区的首地址;Eaddress该分区的尾地址
Len分区长度;Process如果使用,使用的进程号,否则为0
⑵主存分配函数实现寻找空闲区、空闲区表的修改、已分配区表的修改功能。
2.需求分析,数据结构或模块说明
2.1需求分析
对于一台完全无软件的计算机系统,即使功能再强,也必定是难于使用的。
所以在计算机上覆盖了OS后,便可获的一台功能显著使用极为方便的计算机。
因此操作系统是最重要的计算机系统软件,而进程调度是操作系统中最核心的内容。
存储器是计算机的重要组成部分,存储空间是操作系统管理的宝贵资源,虽然其容量在不断扩大,但仍然远远不能满足软件发展的需要。
对存储资源进行有效的管理,不仅关系到存储器的利用率,而且还对操作系统的性能和效率有很大的影响。
操作系统的存储管理的基本功能有:
存储分配、地址转换和存储保护、存储共享、存储扩充。
存储分配指为选中的多道运行的作业分配主存空间;地址转换是把逻辑地址空间中的用户程序通过静态重定位或动态重定位转换和映射到分给的物理地址空间中,以便用户程序的执行;存储保护指各道程序只能访问自己的存储区域,而不能互相干扰,以免其他程序受到有意或无意的破坏;存储共享指主存中的某些程序和数据可供不同用户进程共享。
最简单的单道系统中,一旦一个程序能装入主存,它将一直运行直到结束。
如果程序长度超出了主存的实际容量,可以通过覆盖和交换的技术获得解决。
更多的操作系统支持多个用户进程在主存同时执行,能满足多道程序设计需要的最简单的存储管理技术是分区方式,有分固定分区和可变分区。
可变分区的分配(如图
(1)所示)算法包括:
最先适应、下次适应、最佳适应、最坏适应和快速适应等分配算法。
图
(1)动态内存分配
采用分区方式管理存储器,每道程序总是要求占用主存的一个或几个连续的存储区域,主存中会产生许多碎片。
因此,有时为了接纳一个新的作业而往往要移动已在主存的信息,这不仅不方便,而且开销不小。
现代计算机都有某种虚存硬设备支持,简单也是常用的虚存是请求分页式虚存管理,于是允许把一个进程的页面存放到若干不相邻的主存页框中。
从搜索速度上看,最先适应算法具有最佳性能。
并且从回收过程来看,最先适应法也是最佳的。
它的另一个优点就是尽可能地利用了低地址空间。
从而保证高地址有较大的空闲区来放置要求内存过多的进程或作业。
最坏适应法是基于不留下碎片空闲区这一出发点的。
它选择最大的空闲区来满足用户要求,以期分配后的剩余部分仍能再分配。
本课程设计就是分析动态分区法,与固定分区法相比,动态分区法在作业执行前并不建立分区,分区的建立是在作业的处理过程中进行的。
且其大小可随作业或进程对内存的要求而改变分区的建立是在作业的处理过程中进行的。
且其大小可随作业或进程对内存的要求而改变。
这就改变了固定分区法中那种即使是小作业也要占据大分区的浪费现象,从而提高了内存的利用率。
2.2模块说明
2.2.1数据结构
结构体定义进程
structarea{
intstart;
intend;
intlen;
intsign;
structarea*next;
};
5个数据成员,分别为:
start(分区的首地址)、end、(分区尾地址)len(分区的长度)、sign(标志进程状态)、next(指针用来指向下一个进程)。
内存分配表的图类似与图(3)所示:
2.2.2最先适应法(first-fit)
按分区起始地址的递增次序,从头查找,找到符合要求的第一个分区。
该算法的分配和释放的时间性能较好,一旦找到大于或等于所要求内存长度的分区,则结束探索。
最先适应法的程序段:
voidlistID(){
intn=0;
area*p9=freehead->next,*p0=freehead,*p11,*p12,*p13;
while(p0!
=NULL){
p0=p0->next;
n++;
}
p0=freehead;
if(n==1)
return;
else
while(p9!
=NULL){
p12=p0;
p13=p9;
p0=p0->next;
p9=p9->next;
while(p13!
=NULL)
{
if((p12->start)>(p13->start)){
p11=newarea;
p11->end=p13->end;
p11->len=p13->len;
p11->sign=p13->sign;
p11->start=p13->start;
p11->next=NULL;
swap(p13,p12);
swap(p12,p11);
}
p13=p13->next;
}
}
}
该模块完成的功能如下图
进程进入内存
最先适应法流程如下图所示:
2.2.3最优适应法(best-fit)
按分区大小的递增次序,组成空闲区可用表或自由链。
申请分区时从头开始查找,当找到第一个满足要求的空闲区时,停止查找。
如果该空闲区大于请求表中请求长度,则与最先适应法时相同,将减去请求长度后的剩余空闲区部分留在可用表中。
最优适应法代码段为:
voidlistlen(){
intn=0;
area*p9=freehead->next,*p0=freehead,*p11,*p12,*p13;
while(p0!
=NULL){
p0=p0->next;
n++;
}
p0=freehead;
if(n==1)
return;
else
while(p9!
=NULL){
p12=p0;
p13=p9;
p0=p0->next;
p9=p9->next;
while(p13!
=NULL)
{
if((p12->len)>(p13->len)){
p11=newarea;
p11->end=p13->end;
p11->len=p13->len;
p11->sign=p13->sign;
p11->start=p13->start;
p11->next=NULL;
swap(p13,p12);
swap(p12,p11);
}
p13=p13->next;
}
}
}
3.源程序
本程序的源代码为:
#include
usingnamespacestd;
#include
structarea{
intstart;
intend;
intlen;
intsign;
structarea*next;
};
structarea*freehead=NULL;
structarea*usedhead=NULL;
voidcreate();
voidprint(area*);
voidask(area*);
voidask1(area*);
voidcorrect(area*,int);
area*delempty();
voidinserused(area*,int,int);
voidinserfree(area*);
voidsetfree();
voidlistID();
voidlistlen();
voidswap(area*,area*);
//初始化
area*delempty(){
area*p1=freehead;
if(p1->len==0){
if(p1->next==NULL)
returnNULL;
else{
p1=p1->next;
}
}
}
//最优适应法
voidlistlen(){
intn=0;
area*p9=freehead->next,*p0=freehead,*p11,*p12,*p13;
while(p0!
=NULL){
p0=p0->next;
n++;
}
p0=freehead;
if(n==1)
return;
else
while(p9!
=NULL){
p12=p0;
p13=p9;
p0=p0->next;
p9=p9->next;
while(p13!
=NULL)
{
if((p12->len)>(p13->len)){
p11=newarea;
p11->end=p13->end;
p11->len=p13->len;
p11->sign=p13->sign;
p11->start=p13->start;
p11->next=NULL;
swap(p13,p12);
swap(p12,p11);
}
p13=p13->next;
}
}
}
voidswap(area*p13,area*p14)
{
p13->len=p14->len;
p13->sign=p14->sign;
p13->end=p14->end;
p13->start=p14->start;
}
//最先适应法
voidlistID(){
intn=0;
area*p9=freehead->next,*p0=freehead,*p11,*p12,*p13;
while(p0!
=NULL){
p0=p0->next;
n++;
}
p0=freehead;
if(n==1)
return;
else
while(p9!
=NULL){
p12=p0;
p13=p9;
p0=p0->next;
p9=p9->next;
while(p13!
=NULL)
{
if((p12->start)>(p13->start)){
p11=newarea;
p11->end=p13->end;
p11->len=p13->len;
p11->sign=p13->sign;
p11->start=p13->start;
p11->next=NULL;
swap(p13,p12);
swap(p12,p11);
}
p13=p13->next;
}
}
}
voidinserfree(area*p3){
intflag=0;
area*pf=freehead,*pe=freehead,*pe1;
while(pf!
=NULL){
if(pf->end!
=p3->start)//判断是否有前继空闲块
pf=pf->next;
elsebreak;
}
if(pf!
=NULL){
flag=5;
}//flag=5有前置空闲块
elseflag=1;//没有置1
while(pe!
=NULL)//判断是否有后继空闲块
{
if(pe->start!
=p3->end)
{
pe1=pe;
pe=pe->next;
}
elsebreak;
}
if(pe!
=NULL){
if(flag==5)
flag=6;
elseflag=4;
}//有前置且有后置FLAG=6,只有后置=4
else{
if(flag==1)
flag=2;
}//前后都没有置2
switch(flag){
case5:
pf->end=pf->end+p3->len;
pf->len=pf->len+p3->len;
break;
case4:
pe->start=pe->start-p3->len;
pe->len=pe->len+p3->len;
break;
case2:
area*p8;
p8=newarea;
p8->start=p3->start;
p8->len=p3->len;
p8->sign=0;
p8->end=p3->end;
p8->next=freehead;
freehead=p8;
break;
case6:
pf->end=pe->end;
pf->len=pf->len+pe->len+p3->len;
if(pe->next==NULL){
pe1->next=NULL;
deletepe;
}
else{
if(pe==freehead){
freehead=pe->next;
deletepe;
}
else{
pe1->next=pe->next;
deletepe;
}
}
break;
default:
break;
}
}
voidsetfree(){
intchose;
cout<<"选择一个要释放的任务:
";
cin>>chose;
area*p7=usedhead,*p2;
while(p7!
=NULL){//寻找有无此进程
if(p7->sign!
=chose){
p2=p7;
p7=p7->next;
}
elsebreak;
}
if(p7==NULL){
cout<<"没有此进程,释放内存失败,返回修改!
"< return; } inserfree(p7);//将其释放的内存插入空闲块中 if(p7==usedhead&&p7->next==NULL) usedhead=NULL; else{ if(p7->next==NULL){ p2->next=NULL; deletep7; }//将次进城从已分配表中删除 else{ if(p7==usedhead){ usedhead=p7->next; deletep7; } else{ p2->next=p7->next; deletep7; } } } cout<<"成功释放所选任务的内存! 当前内存状况为: "< print(freehead); print(usedhead); cout< } voidinserused(area*p3,intnum,intneed){//将新项插入已分配表中 area*p5; if(usedhead==NULL){ p5=newarea; p5->start=p3->start; p5->len=need; p5->sign=num; p5->end=p3->start+need; p5->next=NULL; usedhead=p5;} else{ p5=newarea; p5->start=p3->start; p5->len=need; p5->sign=num; p5->end=p3->start+need; p5->next=usedhead; usedhead=p5; } } voidcorrect(area*p3,intneed1){ p3->len=p3->len-need1; p3->start=p3->start+need1; } voidcreate(){ area*p1; p1=newarea; p1->start=0; p1->end=999; p1->len=999; p1->sign=0; p1->next=NULL; freehead=p1; } voidask1(area*freehead){//读文件初始化,只用一次 intnum,need; area*p3=freehead; ifstreaminfile("123.TXT"); while(infile>>num){ infile>>need; if(p3->len cout<<"内存不足,分配失败! "< return; } else inserused(p3,num,need); correct(p3,need); } } voidask(area*freehead){ intnum,need; area*p3=freehead,*p31=freehead; cout<<"inputnumandneed! "< cin>>num; cin>>need; while(p3! =NULL){ if(p3->len p31=p3; p3=p3->next; } elsebreak; } if(p3==NULL){ cout<<"内存不足,分配失败! "< return; } inserused(p3,num,need); correct(p3,need); freehead=delempty(); cout<<"成功分配申请,当前内存状况为: "< print(freehead); print(usedhead); cout< } voidprint(area*pp){ area*p; p=pp; cout<<"────────────────────────────\n"; if(p==NULL) {cout<<"emptylist! "< cout<<"────────────────────────────\n";return;} else do{ cout<<"start: "< "< "< "< p=p->next; }while(p! =NULL); cout<<"────────────────────────────\n"; } intmain() {intyourchose,flag1=0,flag2=0; intwhat; cout<<">>>>现在初始化内存>>>>>>>\n"; cout<<"请选择: 1.手动初始化2.读取文件初始化: "; cin>>flag2; create(); if(flag2==2)ask1(freehead); cout<<"内存初始状态为: \n"; print(freehead); print(usedhead); cout< cout<<"-------------菜单选项------------------\n"; cout<<"1.申请内存2.释放作业的内存\n"; cout<<"3.查看空闲块链4.查看已分配块链\n"; cout<<"5.查看内存状态0.退出\n"; cout<<"---------------------------------------"< while(flag1==0) {cout<<"-----请选择操作----: "; cin>>yourchose; switch(yourchose) {case1: cout<<"选择哪种方式? 1.最先适应2.最优适应: "; cin>>what; if(what==1)listID(); elselistlen(); ask
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动态 分区 管理 主存 分配 模拟 设计 最先 适应 最优