操作系统实验最佳适应算法最坏适应算法.docx
- 文档编号:10663189
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:19
- 大小:373.81KB
操作系统实验最佳适应算法最坏适应算法.docx
《操作系统实验最佳适应算法最坏适应算法.docx》由会员分享,可在线阅读,更多相关《操作系统实验最佳适应算法最坏适应算法.docx(19页珍藏版)》请在冰豆网上搜索。
操作系统实验最佳适应算法最坏适应算法
学号P7*******专业计算机科学与技术姓名
实验日期2017/11/23教师签字成绩
实验报告
【实验名称】基于顺序搜索的动态分区分配算法
(二)
【实验目的】
理解在连续分区动态的存储管理方式下,如何实现贮存空间的分配与回收。
采用可变式分区管理,使用最佳适应算法实现主存空间的分配与回收。
采用可变式分区管理,使用最坏适应算法实现主存空间的分配与回收。
【实验原理】
C++语言程序设计
数据结构
最佳适应算法
最坏适应算法
数据结构和符号说明
1、boolROM[N];//定义主存信息,如果内存被占用,则标记为1,否则标记为0,设置内存单元为1024
2、pcbnum[20];//定义作业数组,最大支持20个作业
3、typedefstructPcb//定义作业结构体,包括名称,开始时间,大小,是否执行状态
{
charname[10];
intstart;
intsize;
intstate=0;
}pcb;
主要函数:
voidfind_free_rom();//寻找空闲区
voidsort1();//对空闲区进行排序从小到大
voidsort1();//对空闲区进行排序从大到小
voidshow();//显示函数
voidinsert_pcb1(pcb&a);//最佳适应算法
voidinsert_pcb2(pcb&a);//最坏适应算法
voidinit();//初始化函数
算法流程图:
最佳适应算法:
最坏适应算法:
#include
#include
#defineN1024
boolROM[N];
intp=0;
intcount=0;
intfree_rom_counter=0;//空闲区数目
typedefstructPcb//进程结构体
{
charname[10];
intstart;
intsize;//大小
intstate=0;//状态
}pcb;
pcbnum[20];//进程数组
typedefstructFree_rom//空闲区结构体
{
intnum;
intstart;
intend;
intspace;//空闲区大小
}Free_room;
Free_romfree_rom[100];//空闲区数组
voidshow()//显示空闲区信息
{
printf("****************************************************************\n\n");
printf("空闲区名\t开始地址\t\t大小\t\t结束地址\t\t\n");
for(inti=1;i<=free_rom_counter;i++)
printf("%d\t\t%d\t\t\t%d\t\t%d\t\t\n",free_rom[i].num,free_rom[i].start,free_rom[i].space,free_rom[i].end);
printf("\n");
printf("****************************************************************\n\n");
}
voidfind_free_rom()//寻找空闲区,更新空闲区数组
{
free_rom_counter=0;
inti,j,p;
for(i=0;i if(ROM[i]==0) { p=i; for(j=i;j { if(ROM[j]==0) { i=j; continue; } if(ROM[j]==1)//找到就更新信息 { free_rom_counter++; free_rom[free_rom_counter].num=free_rom_counter; free_rom[free_rom_counter].start=p; free_rom[free_rom_counter].end=j-1; free_rom[free_rom_counter].space=j-p; i=j+1; break; } } if(j==N&&ROM[j-1]==0)//对最后一个内存进行特殊处理 { free_rom_counter++; free_rom[free_rom_counter].num=free_rom_counter; free_rom[free_rom_counter].start=p; free_rom[free_rom_counter].end=j-1; free_rom[free_rom_counter].space=j-p; } } } voidsort1()//最佳适应算法对空闲区从小到大排序 { find_free_rom(); Free_roma; for(inti=1;i for(intj=1;j if(free_rom[j].space>free_rom[j+1].space) { a=free_rom[j]; free_rom[j]=free_rom[j+1]; free_rom[j+1]=a; } } voidsort2()//最坏适应算法对空闲区从大到小排序 { find_free_rom(); Free_roma; for(inti=1;i for(intj=1;j if(free_rom[j].space { a=free_rom[j]; free_rom[j]=free_rom[j+1]; free_rom[j+1]=a; } } voidinit()//初始化 { for(inti=0;i ROM[i]=0; } voidinput(pcb&a)//输入 { charname[10]; printf("输入进程名\n"); scanf("%s",&a.name); printf("输入进程大小\n"); scanf("%d",&a.size); } voidinsert_pcb1(pcb&a)//最佳适应算法插入进程 { find_free_rom(); sort1(); inti,j,k; for(i=1;i<=free_rom_counter;i++)//判断插入 if(a.size<=free_rom[i].space) { for(j=free_rom[i].start;j ROM[j]=1; a.state=1; a.start=free_rom[i].start; num[count++]=a; break; } if(i==free_rom_counter+1)//插入失败 printf("可用空间不足! \n"); } voidinsert_pcb2(pcb&a)//最坏适应算法插入{ find_free_rom(); sort2(); inti,j,k; for(i=1;i<=free_rom_counter;i++) if(a.size<=free_rom[i].space) { for(j=free_rom[i].start;j ROM[j]=1; a.state=1; a.start=free_rom[i].start; num[count++]=a; break; } if(i==free_rom_counter+1)//插入失败 printf("可用空间不足! \n"); } voidDelete(pcb&a)//内存中释放进程 { inti; for(i=a.start;i ROM[i]=0;//更新内存信息,更新进程状态数组 a.state=0; printf("删除成功\n"); find_free_rom(); } intmain()//主函数 { init(); find_free_rom(); intchoose1; intchoose; charname[10]; printf("1、最佳适应算法\n");//主界面 printf("2、最坏首次适应算法\n"); scanf("%d",&choose1); pcba; do { printf("\n\n1、插入进程\n"); printf("2、删除进程\n"); printf("3、显示进程信息\n"); printf("4、显示空余内存信息\n"); scanf("%d",&choose); if(choose==1)//选择 { input(a); if(choose1==1) insert_pcb1(a); elseinsert_pcb2(a); } elseif(choose==2) { printf("输入删除进程的名字\n"); scanf("%s",&name); for(inti=0;i if(! strcmp(num[i].name,name)) Delete(num[i]); } elseif(choose==3) { printf("****************************************************************\n\n"); printf("进程名\t\t开始地址\t\t大小\t\t结束地址\t\t\n");//输出内存信息 for(inti=0;i if(num[i].state! =0) printf("%s\t\t%d\t\t\t%d\t\t%d\t\t\n",num[i].name,num[i].start,num[i].size,num[i].size+num[i].start-1); printf("\n****************************************************************\n\n"); } elseif(choose=4) { find_free_rom(); show(); } elsebreak; } while (1); return0; } 截图: 构造如下空闲区: 此时插入一个进程G,大小为80H,应插入到第二块空闲区 再插入一个大小为30的进程H,应插入到第三块中 再插入一个小进程,大小为5,插入到第二块空闲区,查看进程信息和空闲区信息: 最佳适应算法成立。 最坏适应算法: 构造如下空闲区: 插入一个大小为80的进程G,插入到第一块空闲区。 在插入一个大小为20的进程H,插入到第三块空闲区。 再插入一个大小为20的进程,插入到第三块空闲区。 最坏适应算法成立。 【小结或讨论】 1、本次实验涉及到两个表,空闲区登记表和进程分配表,分配空间需要进程所需空间的大小,给出过分配后进程的起始地址;回收空间除了需要进程所需空间的大小以外,还需要知道进程的起始地址,再进行一系列判断然后回收。 2、本次实验的两个算法是在首次适应算法的基础上进行的改进,最佳适应算法是将所有区按照区的大小进行升序排列,再从第一个区即最小的区开始检索分配内存;最坏适应算法是将所有区按照区的大小进行降序排列,再直接将第一个区即最大的区给进程分配空间。 3、最坏适应算法较最佳适应算法简单一些,只需要一层for循环,只跟第一个区大小进行比较即可。 4、通过本次实验,我对于主存空间的动态分配与回收有了进步的理解。 掌握了最佳适应算法和最坏适应算法的中心思想。 最佳适应算法是首先将主存空闲空间大小进行排序,找到最适合的一个空间分配。 但看似充分利用了空闲空间,但导致剩余的空间过于小而导致无法使用。 而最坏适应算法与其恰恰相反。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 最佳 适应 算法 最坏