操作系统实验最佳适应算法最坏适应算法.docx

上传人:b****2 文档编号:17780377 上传时间:2023-08-03 格式:DOCX 页数:20 大小:387.50KB
下载 相关 举报
操作系统实验最佳适应算法最坏适应算法.docx_第1页
第1页 / 共20页
操作系统实验最佳适应算法最坏适应算法.docx_第2页
第2页 / 共20页
操作系统实验最佳适应算法最坏适应算法.docx_第3页
第3页 / 共20页
操作系统实验最佳适应算法最坏适应算法.docx_第4页
第4页 / 共20页
操作系统实验最佳适应算法最坏适应算法.docx_第5页
第5页 / 共20页
操作系统实验最佳适应算法最坏适应算法.docx_第6页
第6页 / 共20页
操作系统实验最佳适应算法最坏适应算法.docx_第7页
第7页 / 共20页
操作系统实验最佳适应算法最坏适应算法.docx_第8页
第8页 / 共20页
操作系统实验最佳适应算法最坏适应算法.docx_第9页
第9页 / 共20页
操作系统实验最佳适应算法最坏适应算法.docx_第10页
第10页 / 共20页
操作系统实验最佳适应算法最坏适应算法.docx_第11页
第11页 / 共20页
操作系统实验最佳适应算法最坏适应算法.docx_第12页
第12页 / 共20页
操作系统实验最佳适应算法最坏适应算法.docx_第13页
第13页 / 共20页
操作系统实验最佳适应算法最坏适应算法.docx_第14页
第14页 / 共20页
操作系统实验最佳适应算法最坏适应算法.docx_第15页
第15页 / 共20页
操作系统实验最佳适应算法最坏适应算法.docx_第16页
第16页 / 共20页
操作系统实验最佳适应算法最坏适应算法.docx_第17页
第17页 / 共20页
操作系统实验最佳适应算法最坏适应算法.docx_第18页
第18页 / 共20页
操作系统实验最佳适应算法最坏适应算法.docx_第19页
第19页 / 共20页
操作系统实验最佳适应算法最坏适应算法.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

操作系统实验最佳适应算法最坏适应算法.docx

《操作系统实验最佳适应算法最坏适应算法.docx》由会员分享,可在线阅读,更多相关《操作系统实验最佳适应算法最坏适应算法.docx(20页珍藏版)》请在冰点文库上搜索。

操作系统实验最佳适应算法最坏适应算法.docx

操作系统实验最佳适应算法最坏适应算法

操作系统实验-最佳适应算法最坏适应算法

学号P7*******专业计算机科学与技术姓名

实验日期2017/11/23教师签字成绩

实验报告

【实验名称】基于顺序搜索的动态分区分配算法

(二)

【实验目的】

理解在连续分区动态的存储管理方式下,如何实现贮存空间的分配与回收。

采用可变式分区管理,使用最佳适应算法实现主存空间的分配与回收。

采用可变式分区管理,使用最坏适应算法实现主存空间的分配与回收。

【实验原理】

C++语言程序设计

最坏适应算法:

#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、通过本次实验,我对于主存空间的动态分配与回收有了进步的理解。

掌握了最佳适应算法和最坏适应算法的中心思想。

最佳适应算法是首先将主存空闲空间大小进行排序,找到最适合的一个空间分配。

但看似充分利用了空闲空间,但导致剩余的空间过于小而导致无法使用。

而最坏适应算法与其恰恰相反。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2