最佳适应算法
① 【高分悬赏】用C/C++语言设计一个适应算法(最先、最佳或最坏适应算法)
考的是内存的动态划分区域内容,很好写啊
1.可以用数字来模拟内存区域划分情况,比如建一个100大小的数组(结构为struc (区号,值),值为0表示空闲,值为1表示占用,初始化几个已确定占有的分区,分区一,1-5 占有,6-12 空闲,。。。。。。。,并建立空闲区域表,很简单,从头到尾对数组扫描下就知道了
2.最先适应:从内存开始地址找到第一个大于请求大小的连续空闲区域,如请求5个空间,那就在刚开始6-12空闲处建立分区二 ,6-11 ,占用
3.最佳适应:指所有空闲块最适应请求大小的那块,min(空闲块大小-请求大小)
4.最坏:指适应请求大小,且最大的那块空闲区域
② 首次适应算法,最佳适应算法和最坏适应算法怎么分配资源
首次适应算法要求空闲分区链以空闲分区开始地址递增的次序链接,从链首开始顺序查找,直至找到一个能满足程序大小要求的空闲分区为止
最佳适应算法技能满足要求,又是最小的空闲分区
最差适应算法总是找到一个满足程序长度要求的最大空闲分区
③ 什么是最优适应分配算法
分区分配算法(Partitioning Placement Algorithm) ,共有3种。分别为最佳适应算法、首次适应算法、循环首次适应算法。
1、最佳适应算法(Best Fit):
它从全部空闲区中找出能满足作业要求的、且大小最小的空闲分区,这种方法能使碎片尽量小。为适应此算法,空闲分区表(空闲区链)中的空闲分区要按大小从小到大进行排序,自表头开始查找到第一个满足要求的自由分区分配。该算法保留大的空闲区,但造成许多小的空闲区。
2、首次适应算法(First Fit):
从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法目的在于减少查找时间。为适应这种算法,空闲分区表(空闲区链)中的空闲分区要按地址由低到高进行排序。该算法优先使用低址部分空闲区,在低址空间造成许多小的空闲区,在高地址空间保留大的空闲区。
3、循环首次适应算法(Next Fit):
该算法是首次适应算法的变种。在分配内存空间时,不再每次从表头(链首)开始查找,而是从上次找到空闲区的下一个空闲开始查找,直到找到第一个能满足要求的的空闲区为止,并从中划出一块与请求大小相等的内存空间分配给作业。该算法能使内存中的空闲区分布得较均匀。
④ 设计一个实现适应算法的程序(操作系统)
/**------------------------------------------------------
进入程序后可以根据菜单选项进入不同的模块
1.使用首次适应算法分配空间
2.使用最佳适应算法分配空间
3.释放一块空间
4.显示内存分配情况
5.退出系统
----------------------------------------------------------**/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define MEMSIZE 100 /*定义内存大小为100*/
#define MINSIZE 2 /*如果小于此值 将不再分割内存*/
typedef struct _MemoryInfomation{/* 内存空间分区表 结构*/
int start; /*起始地址*/
int size; /*大小*/
char info; /*状态 F:空闲(Free) U:占用(Used) E 结束(end)*/
}MEMINFO;
MEMINFO MemList[MEMSIZE]; //内存空间信息表
void Display();
/*--------------------------------------------------------
函数名:InitALL()
功 能:初始化所有变量
--------------------------------------------------------*/
void InitAll(){
int i;
MEMINFO temp={0,0,'e'};
for(i=0;i<MEMSIZE;i++) //初始化空间信息表
MemList[i]=temp;
MemList[0].start=0; //起始地址为0
MemList[0].size=MEMSIZE;//空间初始为最大的
MemList[0].info='f'; //状态为空闲
}
/*--------------------------------------------------------
函数名:FirstFit_new()
功 能:首次适应算法分配内存
--------------------------------------------------------*/
void FirstFit_new(){
int i,j,size;
char temp[10];
printf("FirstFit_new:How many MEMORY requir?");
gets(temp);
size=atoi(temp); //将字符串转化为整数
for(i=0; i < MEMSIZE-1 && MemList[i].info != 'e';i++) //到了空间尾且没有空间分配
{
if(MemList[i].size >= size && MemList[i].info=='f') //满足所需要的大小,且是空闲空间
{
if(MemList[i].size - size <= MINSIZE) //如果小于规定的最小差则将整个空间分配出去
MemList[i].info='u'; //标志为使用
else
{
for(j = MEMSIZE-2; j > i; j--) //将i后的信息表元素后移
{
MemList[j+1]=MemList[j];
}
//将i分成两部分,使用低地址部分
MemList[i+1].start= MemList[i].start+size;
MemList[i+1].size = MemList[i].size-size;
MemList[i+1].info='f';
MemList[i].size=size;
MemList[i].info='u';
}
break;
}
}
if(i == MEMSIZE-1 || MemList[i].info=='e') //没有找到符合分配的空间
{
printf("Not Enough Memory!!\n");
getchar();
}
Display();
}
/*--------------------------------------------------------
函数名:BestFit_new()
功 能:最佳适应算法分配内存
--------------------------------------------------------*/
void BestFit_new()
{
int i,j,k,flag,size;
char temp[10];
printf("BestFit_new How many MEMORY requir?");
gets(temp);
size=atoi(temp); //将字符串转化为整数
j=0;
flag=0; //标志是否有合适的空间分配,0无,1有
k=MEMSIZE; //用来保存满足要求的最小空间
for(i=0;i<MEMSIZE-1 && MemList[i].info!='e';i++)
{
if(MemList[i].size >= size && MemList[i].info == 'f') //符合要求
{
flag=1;
if(MemList[i].size < k) //比符合要求的最小空间小,则交换
{
k=MemList[i].size;
j=i;
}
}
}
i=j;
if(flag == 0) //没找到
{
printf("Not Enough Memory!\n");
getch();
j=i;
}
else if(MemList[i].size - size <= MINSIZE) //小于规定的最小差,将整个空间分配
MemList[i].info='u';
else
{
for(j = MEMSIZE-2; j > i; j--) //后移
MemList[j+1]=MemList[j];
MemList[i+1].start=MemList[i].start+size;
MemList[i+1].size=MemList[i].size-size;
MemList[i+1].info='f';
MemList[i].size=size;
MemList[i].info='u';
}
Display();
}
/*--------------------------------------------------------
最坏适应算法
*/
void BadFit_new()
{
int i,j,k,flag,size;
char temp[10];
printf("BadFit_new How many MEMORY requir?");
gets(temp);
size=atoi(temp);
j=0;
flag=0;
k=0; //保存满足要求的最大空间
for(i=0;i<MEMSIZE-1&&MemList[i].info!='e';i++)
{
if(MemList[i].size>=size&&MemList[i].info=='f')
{
flag=1;
if(MemList[i].size>k)
{
k=MemList[i].size;
j=i;
}
}
}
i=j;
if(flag=0)
{
printf("Not Enough Memory!\n");
getch();
j=i;
}
else if(MemList[i].size-size<=MINSIZE)
MemList[i].info='u';
else
{
for(j=MEMSIZE-2;j>i;j--)
MemList[j+1]=MemList[j];
MemList[i+1].start=MemList[i].start+size;
MemList[i+1].size=MemList[i].size-size;
MemList[i+1].info='f';
MemList[i].size=size;
MemList[i].info='u';
}
Display();
}
/*--------------------------------------------------------
函数名:del()
功 能:释放一块内存
--------------------------------------------------------*/
void del()
{
int i,number;
char temp[10];
printf("\nplease input the NUMBER you want stop:");
gets(temp);
number=atoi(temp);
if(MemList[number].info == 'u') //输入的空间是使用的
{
MemList[number].info = 'f'; //标志为空闲
if(MemList[number+1].info == 'f') //右空间为空则合并
{
MemList[number].size+=MemList[number+1].size; //大小合并
for(i=number+1;i < MEMSIZE-1 && MemList[i].info !='e';i++)/* i后的空间信息表元素前移 */
if(i>0)
MemList[i]=MemList[i+1];
}
if(number > 0 && MemList[number-1].info=='f') //左空间空闲则合并
{
MemList[number-1].size+=MemList[number].size;
for(i=number;i<MEMSIZE-1&&MemList[i].info!='e';i++)
MemList[i]=MemList[i+1];
}
}
else
{
printf("Thist Number is Not exist or is Not used!\n ");
getchar();
}
Display();
}
/*--------------------------------------------------------
函数名:Display()
功 能:显示内存状态
--------------------------------------------------------*/
void Display(){
int i,
used=0; //记录可以使用的总空间量
/* clrscr();*/
printf("\n----------------------------------------------\n");
printf("%5s%15s%15s","Number","start","size","Info");
printf("\n----------------------------------------------\n");
for(i=0;i < MEMSIZE && MemList[i].info != 'e';i++)
{
if(MemList[i].info == 'u')
used+=MemList[i].size;
printf("%5d%15d%15d%15s\n",i,MemList[i].start,MemList[i].size,MemList[i].info=='u'?"USED":"FREE");
}
printf("\n----------------------------------------------\n");
printf("Totalsize:%-10d Used:%-10d Free:%-10d\n",MEMSIZE,used,MEMSIZE-used);
printf("\n\n Press Any Key to return...");
getch();
}
/*--------------------------------------------------------
函数名:main()
功 能:主函数
--------------------------------------------------------*/
void main(){
char ch;
InitAll();
while(1){
printf("========================================================\n");
printf(" 1.Get a block use the FISTFIT method\n");
printf(" 2.Get a block use the BESTFIT method\n");
printf(" 3.Get a block use the BadFIT method\n");
printf(" 4.Free a block\n");
printf(" 5.Display Mem info \n");
printf(" 6.Exit \n");
printf("========================================================\n");
ch=getch();
switch(ch){
case '1':FirstFit_new();break; //首次适应算法
case '2':BestFit_new();break; //最佳适应算法
case '3':BadFit_new();break; //最坏适应算法
case '4':del();break; //删除已经使用完毕的空间
case '5':Display();break; //显示内存分配情况
case '6':exit(0);
}
}
}
求采纳!!!
⑤ 采用首次适应算法和最优置换算法,对内存的分配和回收速度会造成什么不同的影响
首次适应分配算法(FF):
对空闲分区表记录的要求是按地址递增的顺序排列的,每次分配时,总是从第1条记录开始顺序查找空闲分区表,找到第一个能满足作业长度要求的空闲区,分割这个空闲区,一部分分配给作业,另一部分仍为空闲区。
最佳置换算法(OPT):
选择以后永不使用或在最长时间内不再被访问的内存页面予以淘汰。
⑥ 最先适应,下次适应,最佳和私营,最坏适应四种分配算法中,哪一种更适合固定分区存储管理系统为什么
固定分区存储管理系统适合采用最佳适应算法。因为,此算法所产生的内碎片最少。
这里还要介绍一下下次适应算法。下次适应(next fit)算法也称“临近适应”算法,其工作方式和最先适应算法相同(最先适应也称首次适应算法。它总是最先找到的、满足存储要求的那个空闲分区作为分配对象。),不同的是每次找到合适的空闲的分区时就记住它的位置,以便下次就从该位置开始往下查找,而不是每次都像最先适应算法那样从头开始查找。但是这种算法的总体结果通常要比最先适应算法差。由于它经常会在内存的末尾分配存储分区,使位于存储空间末尾的最大分区被撕裂成小的外部碎片,因此必须经常不断地进行存储紧凑。在该算法中应采取循环查找方式,即最后上个空闲区的大小仍不能满足要求时,应再从第一个空闲区开始查找,故又称为循环造就算法
⑦ 最佳适应算法的空白区一般是按照 ( )排列。
按大小递增顺序排列。
最佳适应算法是从全部空闲区中找出能满足作业要求的、且大小最小的空闲分区的一种计算方法,这种方法能使碎片尽量小。
最佳适应算法(Best Fit):
它从全部空闲区中找出能满足作业要求的、且大小最小的空闲分区,这种方法能使碎片尽量小。为适应此算法,空闲分区表(空闲区链)中的空闲分区要按从小到大进行排序,自表头开始查找到第一个满足要求的自由分区分配。该算法保留大的空闲区,但造成许多小的空闲区。
⑧ 内存状态分区管理中最佳适应算法的空白区是
实验五 内存分区管理实验
一、单项选择题(共5题,每题10分,共50分)
1、最佳适应算法的空白区是__B__.
A.按大小递减顺序连在一起 B.按大小递增顺序连在一起
C.按地址由小到大排列 D.按地址由大到小排序
2、在固定分区分配中,每个分区的大小是__C__.
A.相同 B.随作业长度变化
C.可以不同但预先固定 D.可以不同但根据作业长度固定
3、采用__B__不会产生内部碎片.
A.分页式存储管理 B.分段式存储管理
C.固定分区式存储管理 D.段页式存储管理
4、在可变式分区存储管理中的拼接技术可以_A___.A.集中空闲区 B.增加内存容量
C.缩短访问周期 D.加速地址转换
5、采用分段存储管理的系统中,若地址用24位表示,其中8位表示段号,则允许每段的最大长度是_B___.
二、填空题(共4题,每题5分,共20分)
1、在分区分配算法中,首次适应算法倾向于优先利用内存中的_低地址___部分的空闲分区,从而保留了__高地址__部分的大空闲区.
2、在可变分区存储管理中,分区的保护通常采用_地址越界___和__非法操作__两种方法.
3、3、采用交换技术获得的好处是以牺牲_增大系统开销___为代价的.
4、在采用请求分页式存储管理的系统中,地址变换过程可能会因为_缺页___、_越界___和_访问权限错误___等原因而产生中断.
三、 简答题(共2题,每题15分,共30分) 1、可采用哪几种方式将程序装入内存?它们分别适用于何种场合?
a.首先由编译程序将用户源代码编译成若干目标模块,再由链接程序将编译后形成的目标模块和所需的
---库函数链接在一起,组成一个装入模块,再由装入程序将装入模块装入内存;
b.装入模块的方式有:绝对装入方式,可重定位方式和动态运行时装入方式;
c.绝对装入方式适用于单道程序环境下;
d.可重定位方式适用于多道程序环境下;
e.动态运行时装入方式也适用于多道程序环境下.
2、何谓静态链接?何谓装入时动态链接和运行时的动态链接?
a.静态链接是指事先进行链接形成一个完整的装入模块,以后不再拆开的链接方---式;
b.装入时动态链接是指目标模块在装入内存时,边装入边链接的链接方式;
c.运行时的动态链接是将某些目标模块的链接推迟到执行时才进行.
⑨ 设内存的分配情况如表所示。若要申请一块40KB字节的内存空间,采用最佳适应算法,则所得到的分区首址
最佳适应算法(Best Fit):
它从全部空闲区中找出能满足作业要求的、且大小最小的空闲分区,这种方法能使碎片尽量小
所以正确答案显然应该是 C 330KB