发 帖  
原厂入驻New

C语言源程序代码-存储管理分区分配算法

2009-1-7 22:40:41  2753
分享
<p><font face="Verdana">C语言源程序代码-存储管理分区分配算法<br/></font></p><font face="Verdana"><pre>/*9.3.2 源程序*/
/***PCB.c***/
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define MAX 32767
typedef struct node   /*设置分区描述器*/
{
   int address,size;
   struct node *next;
}RECT;
/*函数原型*/
RECT *assignment(RECT *head,int application);
void acceptment1(RECT *head,RECT *back1);
void acceptment2(RECT *head,RECT *back1) ;
int backcheck(RECT *head,RECT *back1);
void print(RECT *head);
/*变量声明*/
RECT *head,*back,*assign1,*p;
int application1,maxblocknum;
char way;
/*主函数*/
main()
{
   char choose[10];
   int check;
   head=malloc(sizeof(RECT)); /*建立可利用区表的初始状态*/
   p=malloc(sizeof(RECT));
   head-&gt;size=MAX;
   head-&gt;address=0;
   head-&gt;next=p;
   maxblocknum=1;
   p-&gt;size=MAX;
   p-&gt;address=0;
   p-&gt;next=NULL;
   print(head);  /*输出可利用表初始状态*/
   printf("Enter the way(best or first(b/f)\n");/*选择适应策略*/
   scanf("%c",&amp;way);
   do{
      printf("Enter the assign or accept(as/ac)\n");
      scanf("%s",choose); /*选择分配或回收*/
      IF(strcmp(choose,"as")==0) /*as为分配*/
      {
         printf("Input application:\n");
         scanf("%d",&amp;application1);/*输入申请空间大小*/
         assign1=assignment(head,application1);/*调用分配函数*/
         if(assign1-&gt;address==-1)/*分配不成功*/
            printf("Too large application!,assign fails!!\n\n");
         else
            printf("Success!!ADDRESS=%5d\n",assign1-&gt;address); /*分配成功*/
         print(head); /*输出*/
      }
      else
         if(strcmp(choose,"ac")==0) /*回收*/
         {
            back=malloc(sizeof(RECT));
            printf("Input Adress and Size!!\n");
            scanf("%d%d",&amp;back-&gt;address,&amp;back-&gt;size);/*输入回收地址和大小*/
            check=backcheck(head,back); /*检查*/
            if(check==1)
            {
               if(tolower(way)=='f')/*首先适应算法*/
                  acceptment1(head,back); /*首先适应*/
               else
                  acceptment2(head,back);/*最佳适应*/
               print(head);
            }
         }
   }while(!strcmp(choose,"as")||!strcmp(choose,"ac"));
}
/*分配函数*/
RECT *assignment(RECT *head,int application)
{
   RECT *after,*before,*assign;
   assign=malloc(sizeof(RECT)); /*分配申请空间*/
   assign-&gt;size=application;
   assign-&gt;next=NULL;
   if(application&gt;head-&gt;size||application&lt;=0)
      assign-&gt;address=-1; /*申请无效*/
   else
   {
      before=head;
      after=head-&gt;next;
      while(after-&gt;size&lt;application)/*查找适应的结点*/
      {
         before=before-&gt;next;
         after=after-&gt;next;
      }
      if(after-&gt;size==application) /*结点大小等于申请大小则完全分配*/
      {
         if(after-&gt;size==head-&gt;size)
            maxblocknum--;
         before-&gt;next=after-&gt;next;
         assign-&gt;address=after-&gt;address;
         free(after);
      }
      else
      {
         if(after-&gt;size==head-&gt;size) maxblocknum--;
         after-&gt;size=after-&gt;size-application; /*大于申请空间则截取相应大小分配*/
         assign-&gt;address=after-&gt;address+after-&gt;size;
         if(tolower(way)=='b')/*如果是最佳适应,将截取后剩余结点重新回收到合适位置*/
         {
            before-&gt;next=after-&gt;next;
            back=after;
            acceptment2(head,back);
         }
      }
      if(maxblocknum==0) /*修改最大数和头结点值*/
      {
         before=head;
         head-&gt;size=0;
         maxblocknum=1;
         while(before!=NULL)
         {
            if(before-&gt;size&gt;head-&gt;size)
            {
               head-&gt;size=before-&gt;size;
               maxblocknum=1;
            }
            else
               if(before-&gt;size==head-&gt;size)
                  maxblocknum++;
            before=before-&gt;next;
         }
      }
   }
   assign1=assign;
   return assign1; /*返回分配给用户的地址*/
}
void acceptment1(RECT *head,RECT *back1)/*首先适应*/
{
   RECT *before,*after;
   int insert;
   before=head;
   after=head-&gt;next;
   insert=0;
   while(!insert) /*将回收区插入空闲区表*/
   {
      if((after==NULL)||
         ((back1-&gt;address&lt;=after-&gt;address)&amp;&amp;
           (back1-&gt;address&gt;=before-&gt;address)))
      {
         before-&gt;next=back1;
         back1-&gt;next=after;
         insert=1;
      }
      else
      {
         before=before-&gt;next;
         after=after-&gt;next;
      }
   }
   if(back1-&gt;address==before-&gt;address+before-&gt;size)/*与上一块合并*/
   {
      before-&gt;size=before-&gt;size+back1-&gt;size;
      before-&gt;next=back1-&gt;next;
      free(back1);
      back1=before;
   }
   if(after!=NULL&amp;&amp;(after-&gt;address==back1-&gt;address+back1-&gt;size))
   {  /*与下一块合并*/
      back1-&gt;size=back1-&gt;size+after-&gt;size;
      back1-&gt;next=after-&gt;next;
      free(after);
   }
   if(head-&gt;size&lt;back1-&gt;size) /*修改最大块值和最大块个数*/
   {
      head-&gt;size=back1-&gt;size;
      maxblocknum=1;
   }
   else
      if(head-&gt;size==back1-&gt;size)
         maxblocknum++;
}
/*最佳适应,back1为回收结点的地址*/
void acceptment2(RECT *head,RECT *back1)
{
   RECT *before,*after;
   int insert ;
   insert=0;
   before=head;
   after=head-&gt;next;
   if(head-&gt;next==NULL) /*如果可利用区表为空*/
   {
      head-&gt;size=back1-&gt;size;
      head-&gt;next=back1;
      maxblocknum++;
      back1-&gt;next=NULL;
   }
   else
   {
      while(after!=NULL) /*与上一块合并*/
      if(back1-&gt;address==after-&gt;size+after-&gt;address)
      {
         before-&gt;next=after-&gt;next;
         back-&gt;size=after-&gt;size+back1-&gt;size;
         free(after);
         after=NULL;
      }
      else
      {
         after=after-&gt;next;
         before=before-&gt;next;
      }
      before=head;
      after=head-&gt;next;
      while(after!=NULL)
      if(after-&gt;address==back1-&gt;size+back1-&gt;address) /*与下一块合并*/
      {
         back1-&gt;size=back1-&gt;size+after-&gt;size;
         before-&gt;next=after-&gt;next;
         free(after);
         after=NULL;
      }
      else
      {
         before=before-&gt;next;
         after=after-&gt;next;
      }
      before=head;/*将回收结点插入到合适的位置*/
      after=head-&gt;next;
      do{
         if(after==NULL||(after-&gt;size&gt;back1-&gt;size))
         {
            before-&gt;next=back1;
            back1-&gt;next=after;
            insert=1;
         }
         else
         {
            before=before-&gt;next;
            after=after-&gt;next;
         }
      }while(!insert);
      if(head-&gt;size&lt;back1-&gt;size) /*修改最大块值和最大块数*/
      {
         head-&gt;size=back1-&gt;size;
         maxblocknum++;
      }
      else
         if(head-&gt;size==back1-&gt;size)
            maxblocknum++;
   }
}

void print(RECT *head) /*输出链表*/
{
   RECT *before,*after;
   int index,k;
   before=head-&gt;next;
   index=1;
   if(head-&gt;next==NULL)
      printf("NO part for assignment!!\n");
   else
   {
      printf("*****index*******address********end*********size*****\n");
      while(before!=NULL)
      {
         printf("----------------------------------------------------\n");
         printf("     %-13d%-13d%-13d%-13d\n",index,before-&gt;address,before-&gt;address+before-&gt;size-1,before-&gt;size);
         printf("----------------------------------------------------\n");
         index++;
         before=before-&gt;next;
      }
   }
}
/*检查回收块的合法性,back1为要回收的结点地址*/
int backcheck(RECT *head,RECT *back1)
{
   RECT *before,*after;
   int check=1;
   if(back1-&gt;address&lt;0||back1-&gt;size&lt;0)
      check=0;/*地址和大小不能为负*/
   before=head-&gt;next;
   while((before!=NULL)&amp;&amp;check)/*地址不能和空闲区表中结点出现重叠*/
      if(((back1-&gt;address&lt;before-&gt;address)
         &amp;&amp;(back1-&gt;address+back1-&gt;size&gt;before-&gt;address))
         ||((back1-&gt;address&gt;=before-&gt;address)
        &amp;&amp;(back1-&gt;address&lt;before-&gt;address+before-&gt;size)))
         check=0;
      else
         before=before-&gt;next;
   if(check==0)
      printf("Error input!!\n");
   return check;  /*返回检查结果*/
}
</pre></font>
yFidshKk.rar (58.04 KB, 下载次数: 36)
<br/>
0
2009-1-7 22:40:41   评论 分享淘帖

只有小组成员才能发言,加入小组>>

135个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表