最佳适应算法
① 【高分悬赏】用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
