存储管理分区分配算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/*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->size=MAX;

head->address=0;

head->next=p;

maxblocknum=1;

p->size=MAX;

p->address=0;

p->next=NULL;

print(head); /*输出可利用表初始状态*/

printf("Enter the way(best or first(b/f)\n");/*选择适应策略*/ scanf("%c",&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",&application1);/*输入申请空间大小*/

assign1=assignment(head,application1);/*调用分配函数*/

if(assign1->address==-1)/*分配不成功*/

printf("Too large application!,assign fails!!\n\n");

else

printf("Success!!ADDRESS=%5d\n",assign1->address); /*分配成功*/

print(head); /*输出*/

}

else

if(strcmp(choose,"ac")==0) /*回收*/

{

back=malloc(sizeof(RECT));

printf("Input Adress and Size!!\n");

scanf("%d%d",&back->address,&back->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->size=application;

assign->next=NULL;

if(application>head->size||application<=0)

assign->address=-1; /*申请无效*/

else

{

before=head;

after=head->next;

while(after->size

{

before=before->next;

after=after->next;

}

if(after->size==application) /*结点大小等于申请大小则完全分配*/ {

if(after->size==head->size)

maxblocknum--;

before->next=after->next;

assign->address=after->address;

free(after);

}

else

{

if(after->size==head->size) maxblocknum--;

after->size=after->size-application; /*大于申请空间则截取相应大小分配*/

assign->address=after->address+after->size;

if(tolower(way)=='b')/*如果是最佳适应,将截取后剩余结点重新回收到合适位置*/

{

before->next=after->next;

back=after;

acceptment2(head,back);

}

}

if(maxblocknum==0) /*修改最大数和头结点值*/

{

before=head;

head->size=0;

maxblocknum=1;

while(before!=NULL)

{

if(before->size>head->size)

{

head->size=before->size;

maxblocknum=1;

}

else

if(before->size==head->size)

maxblocknum++;

before=before->next;

}

}

}

assign1=assign;

相关文档
最新文档