首次适应算法实验报告

时间:2024.4.10

操作操作系统大作业

题目:首次适应算法分配内存

学    号:  

学生姓名:    

班    级:计科121    

首次适应算法分配内存

一、  问题描述

在内存分配中,动态分区是根据实际的进程需求,动态地为之分配空间。而首次适应算法分配时从表头指针开始查找可利用空间表,将找到的第一个大小不小于“请求”的空闲块的一部分分配给用户。可利用空间表本身既不按节点的初始地址有序,也不按节点的大小有序。用户释放内存,回收时只是将空闲块插入在链表的表头即可,此算法比较节省时间。

二、  运行环境  VC6.0

三、  算法思想

首次适应算法要求空闲分区链以地址递增的次序链接。在分配内存时,从链首开始查找,直到找到一个大小能满足要求的空闲分区为止;然后按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空闲区仍留在空闲链中。若从链首到链尾都不能找到一个能满足要求的分区,则此次分配失败。

四、  实验目的

在计算机系统中,为了提高内存区的利用率,必须给电脑内存区进行合理的分配。本实验通过对内存区分配方法首次适应算法的使用,来了解内存分配的模式。

五、  首次适应算法分配内存算法概要 

(1)   结构体

Typedef struct freearea//定义一个空闲区说明表结构

{     long size;   //分区大小

     long address; //分区地址

     int state;   //状态

}ElemType;  // 线性表的双向链表存储结构

Typedef struct DuLNode

{     ElemType data;     

     structDuLNode *prior; //前趋指针

     structDuLNode *next;  //后继指针

}  DuLNode,*DuLinkList;

Status Initblock(intMAX_length)//开创带头结点的内存空间链表

{    block_first=(DuLinkList)malloc(sizeof(DuLNode));

    block_last=(DuLinkList)malloc(sizeof(DuLNode));

    block_first->prior=NULL;                //头结点的前驱指针指向空

    block_first->next=block_last;             //头结点的后继指针指向尾结点

    block_last->prior=block_first;            //尾结点的前驱指针指向头结点

    block_last->next=NULL;                  //尾结点的后继指针指向空

    block_last->data.address=0;             //尾结点的地址是0

    block_last->data.size=MAX_length;       //分区大小是最大分区

    block_last->data.state=Free;            //状态是空

    return OK; }  

(2)主要函数说明:

void alloc();进行内存分配的功能函数。

Status free(int flag)将地址为flag的分区的内存回收。

Status First_fit(int request)创建进程空间的子函数;其中,参数request表示空闲分区链的链首指针;要配合函数alloc()使用。

void show()查看内存中的分区情况。

六、  流程图

首次适应算法实验报告

七、  代码实现

#include

#include

#include

#define Free 0 //空闲状态

#define Busy 1 //已用状态

#define OK 1    //完成

#define ERROR 0 //出错

//#define MAX_length 640 //最大内存空间为640KB

typedefint Status;

int flag; 

typedefstructfreearea//定义一个空闲区说明表结构

{    

         long size;   //分区大小

         long address; //分区地址

         int state;   //状态

}ElemType;  // 线性表的双向链表存储结构

typedefstructDuLNode

{    

         ElemType data;     

         structDuLNode *prior; //前趋指针

         structDuLNode *next;  //后继指针

}  DuLNode,*DuLinkList; 

DuLinkListblock_first; //头结点

DuLinkListblock_last;  //尾结点

Status alloc(int);//内存分配

Status free(int); //内存回收

Status First_fit(int);//首次适应算法

void show();//查看分配

Status Initblock();//开创空间表

Status Initblock(intMAX_length)//开创带头结点的内存空间链表

{    

         block_first=(DuLinkList)malloc(sizeof(DuLNode));

    block_last=(DuLinkList)malloc(sizeof(DuLNode));

    block_first->prior=NULL;                //头结点的前驱指针指向空

    block_first->next=block_last;             //头结点的后继指针指向尾结点

    block_last->prior=block_first;            //尾结点的前驱指针指向头结点

    block_last->next=NULL;                  //尾结点的后继指针指向空

    block_last->data.address=0;             //尾结点的地址是0

    block_last->data.size=MAX_length;       //分区大小是最大分区

    block_last->data.state=Free;            //状态是空

    return OK;

}  

//分配主存

Status alloc() {    

         int request = 0;

printf("请输入需要分配的主存大小(单位:KB):");

         scanf("%d",&request);    

         if(request<0 ||request==0)     

         {        

                   printf("配大小不合适,请重试!");        

                   return ERROR;    

         }         

         {        

                   if(First_fit(request)==OK)

                            printf("分配成功!");        

                   else

                            printf("内存不足,分配失败!");        

                   return OK;    

}

//首次适应算法

Status First_fit(int request)

{     //为申请作业开辟新空间且初始化

         DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode));

         temp->data.size=request;    

         temp->data.state=Busy;      

         DuLNode *p=block_first->next;    

         while(p)    

         {        

                   if(p->data.state==Free && p->data.size==request)        

                   {//有大小恰好合适的空闲块

                            p->data.state=Busy;            

                            return OK;            

                            break;        

                   }        

                   if(p->data.state==Free && p->data.size>request)        

                   {//有空闲块能满足需求且有剩余

                            temp->prior=p->prior;            

                            temp->next=p;            

                            temp->data.address=p->data.address;            

                            p->prior->next=temp;             

                            p->prior=temp;            

                            p->data.address=temp->data.address+temp->data.size;            

                            p->data.size-=request;            

                            return OK;            

                            break;        

}        

                   p=p->next;    

}    

         return ERROR;

}

  //主存回收

Status free(int flag) {    

         DuLNode *p=block_first;     

         for(inti= 0; i<= flag; i++)               

                   if(p!=NULL)                          

                            p=p->next;else                      

                            return ERROR; 

                   p->data.state=Free;    

                   if(p->prior!=block_first&& p->prior->data.state==Free)//与前面的空闲块相连

                   {        

                            p->prior->data.size+=p->data.size;        

                            p->prior->next=p->next;        

                            p->next->prior=p->prior;               

                            p=p->prior;    

                   }    

                   if(p->next!=block_last&& p->next->data.state==Free)//与后面的空闲块相连

                   {        

                            p->data.size+=p->next->data.size;        

                            p->next->next->prior=p;        

                            p->next=p->next->next;     

                   }      

                   if(p->next==block_last&& p->next->data.state==Free)//与最后的空闲块相连

                   {               

                            p->data.size+=p->next->data.size;        

                            p->next=NULL;     

}    

                   return OK;

}  

//显示主存分配情况

void show() {     

         int flag = 0;

         printf("主存分配情况:\n");   

         DuLNode *p=block_first->next;    

         printf("分区号\t起始地址\t分区大小\t状态\n\n");   

         while(p)    

         {        

                   printf("%d         ",flag);

                   flag++;

                   printf("%d         \t",p->data.address);

         printf("%dKB        \t",p->data.size);     

                   if(p->data.state==Free)

                            printf("空闲\n\n");        

                   else

                            printf("已分配\n\n");        

                   p=p->next;    

         }    

         printf("++++++++++++++++++++++++++++++++++++++++++++++\n\n");

         }  

//主函数

void main()

{   

         int c=1;

         intMAX_length;//算法选择标记

         printf("首次适应算法内存分配算法:\n");

         printf("input MAX_length:\n");

         scanf("%d",&MAX_length);

         Initblock(MAX_length); //开创空间表

         int choice;//操作选择标记

                            while(c=1)

                            {

                                     show();

                   printf("请输入您的操作:"); 

                            printf("\n1: 分配内存\n2: 回收内存\n0: 退出\n");                 

                   scanf("%d",&choice);

                   {

                   if(choice==1)

                   {

                            alloc(); // 分配内存

                            c=1;

                   }

                   else if(choice==2)  // 内存回收

                   {            

                            int flag;            

                            printf("请输入您要释放的分区号:\n");            

                            scanf("%d",&flag);            

                            free(flag);

                            c=1;

                   }        

                   else if(choice==0)

                   {break; //退出

        }

                   else //输入操作有误

                   {             

                            printf("输入有误,请重试!\n");            

                            c=1;        

                   }

                   }

                   printf("&&&&&&&\n");}

}

八、  运行截图

九、  思考

这次试验模拟内存分配,模拟了操作系统是如何通过作业调度选择作业进入内存以及系统是如何为进入内存的作业分配内存空间,实现多道作业同时驻留内存,就绪进程队列中的多个进程是如何以分式方式共享CPU,作业运行完成离开系统时,系统如何进行内存回收,采用的是首次适应算法,应用的数据结构是双向链表。实际上整个程序是比较简单的,但是由于自己对链表的应用不熟悉,查阅课本文库才实现内存分配这简单的功能,这个程序的缺陷就是在进行操作选择时没有进行分配空间的情况下回收空间会出现错误。本次试验使我对链表有了一定的了解但是还需继续学习。

更多相关推荐:
算法实验报告

算法设计与分析实验报告班级姓名学号年月日目录实验一二分查找程序实现03页实验二棋盘覆盖问题分治法08页实验三01背包问题的动态规划算法设计11页实验四背包问题的贪心算法14页实验五最小重量机器设计问题回溯法17...

算法设计实验报告

算法设计课程报告课题名称算法设计与实现课题负责人名学号张樱紫0743111317同组成员名单角色无指导教师左劼评阅成绩评阅意见提交报告时间20xx年12月23日课程名称算法设计学生姓名张樱紫学生学号074311...

中南大学--算法实验报告

中南大学--算法实验报告,内容附图。

遗传算法实验报告

遗传算法实验报告姓名:**学号:**一、实验目的:熟悉和掌握遗传算法的运行机制和求解的基本方法。遗传算法是一种基于空间搜索的算法,它通过自然选择、遗传、变异等操作以及达尔文的适者生存的理论,模拟自然进化过程来寻…

算法设计实验报告

1hanoi塔packagesyyimportjavautilpublicclassHanoipublicstaticvoidmoveintnintaintbSystemoutprintlnquot把第quot...

算法实验报告

算法导论实验报告实验一快速排序1问题描述实现对数组的普通快速排序与随机快速排序2算法原理设要排序的数组是A0AN1首先选取一个数据普通快排选择的是最后一个元素随记快排是随机选择一个元素作为关键数据然后将所有比它...

算法分析与设计实验报告

排序问题求解实验日志实验题目排序问题求解实验目的1以排序分类问题为例掌握分治法的基本设计策略2熟练掌握一般插入排序算法的实现3熟练掌握快速排序算法的实现4理解常见的算法经验分析方法实验要求1生成实验数据要求编写...

算法设计与分析实验报告三

贵州师范大学数学与计算机科学学院实验报告课程名称算法设计与分析班级13计本实验日期学号115703020xx2姓名吴道镁指导教师熊祥光成绩一实验名称贪心算法最优装载问题二实验目的及要求1掌握贪心算法的基本思想2...

粒子群算法实验报告

专业班号组别指导老师姓名同组者实验日期第十四周第3次实验四实验内容1首先编写通用代码粒子群测试各个函数的主代码写出来对于不同的测试函数只需要调用相应的测试函数即可将各个函数做成m的文件matlab源代码程序如下...

算法实验报告(完美版)

实验报告实验一一实验名称二分搜索法二实验目的编写程序实现用二分法在一有序序列中查找一个数三实验内容1程序源代码includeltstdiohgtintResearchintaintxintnintleft0ri...

分治算法实验报告

本科学生综合性实验报告姓名刘春云学号0103918专业软件工程班级103实验项目名称二分搜索问题的分治算法实验指导教师及职称赵晓平开课学期20xx至20xx学年3学期上课时间20xx年2月18日学生实验报告1一...

算法实验报告一

算法设计与分析课程实验报告专业计算机科学与技术班级学号姓名日期20xx年10月18日23

算法实验报告(32篇)