动态分区管理的主存分配模拟设计最优适应法最差适应法.docx
- 文档编号:29857409
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:23
- 大小:207.91KB
动态分区管理的主存分配模拟设计最优适应法最差适应法.docx
《动态分区管理的主存分配模拟设计最优适应法最差适应法.docx》由会员分享,可在线阅读,更多相关《动态分区管理的主存分配模拟设计最优适应法最差适应法.docx(23页珍藏版)》请在冰豆网上搜索。
动态分区管理的主存分配模拟设计最优适应法最差适应法
学号:
0121010340808
课程设计
题目
动态分区管理的主存分配模拟设计--最优适应法、最差适应法
学院
计算机科学与技术学院
专业
计算机科学与技术专业
班级
计算机1002班
姓名
刘浪浪
指导教师
杨克俭
2013
年
1
月
20
日
课程设计任务书
学生姓名:
刘浪浪专业班级:
计科1002班
指导教师:
杨克俭工作单位:
计算机科学与技术学院
题目:
动态分区管理的主存分配模拟设计--最优适应法、最差适应法
初始条件:
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.设计报告内容应说明:
⑴课程设计目的与功能;
⑵需求分析,数据结构或模块说明(功能与框图);
⑶源程序的主要部分;
⑷运行结果与运行情况分析;
⑸自我评价与总结:
)你认为你完成的设计哪些地方做得比较好或比较出色;
)什么地方做得不太好,以后如何改正;
)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);
)完成本题是否有其他的其他方法(如果有,简要说明该方法);
)对实验题的评价和改进意见,请你推荐设计题目。
三、原理
1.最佳适应算法:
它从全部空闲区中找出能满足作业要求的、且大小最小的空闲分区,这种方法能使碎片尽量小。
为适应此算法,空闲分区表(空闲区链)中的空闲分区要按从小到大进行排序,自表头开始查找到第一个满足要求的自由分区分配。
该算法保留大的空闲区,但造成许多小的空闲区。
2.最坏适应算法:
最坏适应分配算法要扫描整个空闲分区或链表,总是挑选一个最大的空闲分区分割给作业使用。
该算法要求将所有的空闲分区按其容量从大到小的顺序形成一空闲区链,查找时只要看第一个分区能否满足作业要求。
四、实验分析
分区管理是把内存划分为若干大小不等的区域,除操作系统占用一个区域外,其余由多道环境下的各并发进程共享。
动态分区法在作业执行前并不建立分区,分区的建立是在作业的处理过程中进行的,且大小可随作业或进程对内存的要求而改变。
采用动态分区法,在系统初启时,除了操作系统中常驻的内存部分外,只有一个空闲区。
随后,分配的程序将该区依次划给调度选中的作业或进程。
下图给出了FIFO调度方式时内存的初始分配情况:
进程A
1K
进程B
2K
进程C
4K
进程D
8K
........
OS
进程A
进程B
进程C
进程D
OS
进程A
进程B
进程C
OS
进程A
进程B
OS
进程A
五、实验功能设计
1.数据结构说明
本实验用到了结构体和类两种数据结构:
结构体定义如下:
structarea{
intstart;
intlength;
intstate;
structarea*next;
}
其中定义了四个数据成员,其中start是内存块开始地址,length是内存块长度,state是内存块使用状态,next是指向下一个内存块的指针。
2程序函数模块说明
主函数:
intmain()
{
intChoice;
//开始循环
while
(1)
{
system("cls");
init();
PrintMemoryState(head);
printf("1.最优适应法\n");
printf("2.最差适应法\n");
printf("3.退出程序\n");
printf("选择分区管理方式:
");
scanf("%d",&Choice);//输入你所要的选项。
为choice的值
switch(Choice)
{
case1:
BestFit(head);
PrintMemoryState(head);//最优适应法
break;
case2:
WorstFit(head);
PrintMemoryState(head);//最差适应法
break;
case3:
printf("正在退出程序...\n");
exit(0);
break;
default:
printf("Pleaseinputarightnumber!
\n");
break;
}
system("pause");
}
return0;
}
最佳适应算法:
voidBestFit(Area*head)//装入作业,最优适应法
{
intflag=0;
intlengthtemp;
inta[3];
Area*last=NULL;
Area*newFree=NULL;
Area*H=NULL;
inti;
printf("请分别输入需要分配内存的3个作业内存长度\n");
for(i=1;i<=3;i++)
{
printf("进程:
%d",i);
scanf("%d",&a[i-1]);
}
for(i=0;i<3;i++)
{
intsum;intn=0;intb[10]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
intd=0;
Area*Task=NULL;
Area*p=NULL;
last=head->next;
p=head->next;
H=head->next;
while(H!
=NULL)
{
if(H->state>0)
{
H=H->next;
}
else
{
b[n]=H->length;
H=H->next;
n++;
}
}
sum=b[0];
for(intj=1;j { if(sum sum=b[j]; }//sum取B[n]中的最大值 if(a[i]>sum) { printf("a[%d]作业过长,无法装入\n",i); } else { while(last! =NULL) { if(last->state>0) last=last->next; else { if(a[i]>last->length) last=last->next; elseif(a[i]==last->length) { Task=last; Task->state=i; break; } elseif(a[i] { if(Task==NULL) { Task=last; } elseif(Task->length>last->length) { Task=last; } last=last->next; } } } if(Task->length>a[i]) { lengthtemp=Task->length; Task->length=a[i]; Task->state=i+1; newFree=(Area*)malloc(sizeof(Area)); newFree->next=Task->next; newFree->start=Task->start+Task->length; newFree->length=lengthtemp-Task->length; newFree->state=0; Task->next=newFree;//成功插入newFree节点 } } } } 最差适应算法: voidWorstFit(Area*head)//装入作业,最差适应法 { intlengthtemp; inta[3]; Area*last=NULL; Area*newFree=NULL; inti; intname=0; printf("请分别输入需要分配内存的3个作业内存长度\n"); for(i=1;i<=3;i++) { printf("进程: %d",i); scanf("%d",&a[i-1]); } for(i=0;i<3;i++) { Area*Task=NULL; last=head->next; Task=NULL; while(last! =NULL) { if(last->state>0) last=last->next; else { if(Task==NULL) Task=last; if(last->length>Task->length) Task=last; last=last->next; }//task指向length最大的那块 } if(a[i]>Task->length) { printf("a[%d]作业过长,无法装入\n",i); } else { if(Task->length==a[i]) { Task->state=i+1; }//等于的话直接装入 if(Task->length>a[i]) { lengthtemp=Task->length; Task->length=a[i]; Task->state=i+1; newFree=(Area*)malloc(sizeof(Area)); newFree->next=Task->next; newFree->start=Task->start+Task->length; newFree->length=lengthtemp-Task->length; newFree->state=0; Task->next=newFree;//成功插入newFree节点 } } } } 3.程序的流程图 最优适应法和最差适应法的流程图一样,如下: 请求SIZE大小的分区 是 否 否 是 否 是 六、开发平台 开发平台: windows7 开发软件: visualstudio2010 开发语言: C++ 七、运行结果与运行情况分析 运行源程序得到以下运行结果: 输入1,选择最优程序法,并输入作业需要的内存块大小,运行结果如下: 输入2之后,选择最差适应法,并输入相应作业需要的内存块的大小,运行结果如下: 当输入作业内存块大于最大内存块时,得到以下结果: 八、自我评价与总结 本次的课程设计我做的题目是动态分区式管理的模拟设计中,采用的是最佳适应算法和最差适应算法,其实最差适应法和最优适应法的原理很相近,一个是先把内存块按照从小到大的顺序进行排列,另一个正好相反,在理解上没什么障碍。 因此在进行课程设计的时候少了更多的困难,在原理上有个正确的认识,在做程序设计的时候就得心应手了。 在程序设计的过程中遇到了一些问题,比如内存块的数据结构使用链表还是数组,在进行斟酌之后考虑到链表的插入的灵活性,以及程序开销不是很大,所以采用了链表;再就是对输入作业的内存块的大小大于系统最大内存块的大小时,怎么进行处理等等。 还有些小的逻辑问题以及语法问题,在进行过简单的调试之后,都一一解决了。 通过此次的操作系统课程设计,我更加深刻的理解了操作系统对内存的分配的一种方法,即动态分区式管理。 并且结合课堂上的理论知识,慢慢地去理解,然后使用程序设计语言,模拟了操作系统的工作过程。 虽然在此次的课程设计中遇到了很多困难,也有些内容不理解,比如程序语言里的一些知识,但是在经过同学的帮助和查阅的资料,都解决了,最后写出来的程序能够成功地运行,得到预期的结果,心里表示很开心。 在解决困难的过程中我学到了很多东西,也锻炼了自己的毅力,收获颇丰。 九、参考文献 《计算机操作系统教程(第3版)》清华大学出版社张尧学主编 《C++程序设计教程》武汉理工大学出版社闵联营何克右主编 本科生课程设计成绩评定表 班级: 计科1002班 姓名: 刘浪浪 学号: 0121010340808 序号 评分项目 满分 实得分 1 学习态度认真、遵守纪律 10 2 设计分析合理性 10 3 设计方案正确性、可行性、创造性 20 4 设计结果正确性 40 5 设计报告的规范性 10 6 设计验收 10 总得分/等级 评语: 注: 最终成绩以五级分制记。 优(90-100分)、良(80-89分)、中(70-79分)、 及格(60-69分)、60分以下为不及格 指导教师签名: 201年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动态 分区 管理 主存 分配 模拟 设计 最优 适应 最差