• 大小: 16.39 KB
    文件类型: .rar
    金币: 2
    下载: 0 次
    发布日期: 2024-08-18
  • 语言: 其他
  • 标签:

资源简介

本算法为循环首次适应算法。
算法:由用户进行初始化,即输入分区的总数及各分区的大小,然后在这个基础上再进行后面的操作。在分配函数中,在本实验中设置一个定位指针,当为作业分配内存空间时,不是从空间分区表的起点开始查找,而是从上次找到的空间分区的位置开始查找,直至找到第一个能满足要求的空闲分区,并进行相应处理,在回收函数中,由于是要求选择需要回收的分区号,要考虑该分区号前后的分区的状态,再进行相应处理,

资源截图

代码片段和文件信息

#include
#include
#include
#include
#define MINSIZE 10

struct map
{
    int numb;           /*分区编号*/
    char state;         /* Y(已分配) or N(未分配)*/
    int  m_size;        /*分区大小*/
    int  m_addr;        /*起始地址*/
    struct map *next;   /*后继*/
    struct map *prior;  /*前驱*/
}*mp=NULL*p*search*assign;  //mp为队首指针  search为设置的定位指针,下次查找从此指针开始
typedef struct map MAP;

assignment()    //分配空间函数
{
int applisize;
MAP *after=NULL*before=NULL*assign1=NULL;   //assign1存放申请空间
after=mp;
    assign1=(struct map*)malloc(sizeof(MAP));     //为assign1申请空间
printf(“请输入需申请的作业大小:“);
scanf(“%d“&applisize);
if(mp->next==NULL) search=mp;
for(after=search;after!=NULL;after=after->next)//从search位置开始查找合适的分区
{

   if(after->state==‘N‘&&after->m_size-applisize>=0)  //判断分区的状态是否为未分配,而且判断其大小是否不小于申请的空间
{
if(after->m_size-applisize<=MINSIZE)//该分区与申请空间大小的差值小于规定的最小剩余空间MINSIZE
{
after->state=‘Y‘; //分区的状态位置为已分配
search=after->next;//定位在该分区的下一个分区以便下次访问从处开始
return 0;
}
        else//该分区与申请空间大小的差值大于规定的最小剩余空间MINSIZE
{
before=after->prior;            //before为after的前驱
//将after划分出applisize大小的空间assign1表示该空间
assign1->numb=after->numb;      //after的分区号赋值给assign1
assign1->state=‘Y‘;             //assign1的状态位置为已分配
        assign1->m_addr=after->m_addr;  //assign1首地址为after的首地址
assign1->m_size=applisize;      //assign1的大小为申请的大小applisize
//将after后移,给after重新设置信息
        after->m_size=after->m_size-applisize;//大小为分割前的大小减去申请空间的大小
        after->m_addr=after->m_addr+applisize;//首地址为原地址加上申请空间的大小
after->state=‘N‘;                     //状态位置为未分配
after->numb=after->numb+1;            //分区号加1
assign1->next=after;                  //after赋值给assign1的后继
after->next->numb++;                  //after的后继的分区号+1
//在before和after之间插入assign1
before->next=assign1;           //assign1为before的后继
assign1->prior=before;
assign1->next=after;            //after赋值给assign1的后继
                    assign1=after->prior;

search=after;//定位于after处
break;
}
   }
        //从search开始查找未找到合适的分区,据循环首次算法从首部开始查找 
        for(after=mp;after!=search&&after->next!=NULL;after=after->next)
{
if(after->state==‘N‘&&after->m_size-applisize>=0)  //判断分区的状态是否为未分配,而且判断其大小是否不小于申请的空间
{
     if(after->m_size-applisizestate==‘N‘)//该分区与申请空间大小的差值小于规定的最小剩余空间MINSIZE
{
after->state=‘Y‘; //分区的状态位置为已分配
search=after->next;//定位在该分区的下一个分区以便下次访问从处开始
return 0;
}
        else//该分区与申请空间大小的差值大于规定的最小剩余空间MINSIZE
{
before=after->prior;      //before为after的前驱
//将after划分出applisize大小的空间assign1表示该空间
assign1->numb=after->numb; //after的分区号赋值给assign1
assign1->state=‘Y‘;        //assign1的状态位置为已分配
        assign1->m_addr=after->m_addr; //assign1首地址为after的首地址
assign1->m_size=applisize;     //assign1的大小为申请的大小applisize

//将afte

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      11259  2007-01-05 21:56  循环首次适应算法\循环首次适应算法.o

     文件       3557  2008-06-26 17:14  循环首次适应算法\循环首次适应算法111.dsp

     文件      50176  2008-07-04 12:09  循环首次适应算法\循环首次适应算法111.ncb

     文件        803  2008-07-04 12:09  循环首次适应算法\循环首次适应算法111.plg

     文件        546  2008-06-28 19:31  循环首次适应算法\循环首次适应算法111.dsw

     文件       9081  2008-07-04 12:09  循环首次适应算法\循环首次适应算法111.c

     文件      48640  2008-07-04 12:09  循环首次适应算法\循环首次适应算法111.opt

     目录          0  2008-07-04 12:06  循环首次适应算法

----------- ---------  ---------- -----  ----

               124062                    8


评论

共有 条评论