标签:
#include<stdio.h>
#include <stdlib.h>
#include <conio.h>
#define nil -1
#define NULL 0
#define maxisize 600 //用户的空闲区空间最大值
#define minisize 4
#define getspace(type) (type*)malloc(sizeof(type)) //分配空间
struct table{
char job; //作业标号
float address; //分区起始地址
float length; //分区长度,单位为字节
int flag; //分区表的状态位
struct table *FRlink; //前向指针
struct table *RElink; //后向指针
}*free_table=NULL,*place; //已分配分区表,空闲分区表
typedef struct table FRtable;
//空间分区链表初始化
FRtable *init(FRtable *tb)
{
tb->FRlink=NULL;
tb->job=nil;
tb->address=1064;
tb->length=1664;
tb->flag=0;
tb->RElink=NULL;
return tb;
}
//主存分配函数,为作业job分配大小为xk的分区空间
void allocate(char job,float xk,int choice)
{
FRtable *tb,*link;
int k=0;float temp=600;
if (free_table->FRlink==NULL&&free_table->RElink==NULL)
{//给首个作业分配空间,改写分区链表
free_table->job=job;
free_table->length=xk;
free_table->flag=1;
if (xk<maxisize)
{
tb=getspace(FRtable);
free_table->RElink=tb;
tb->FRlink=free_table;
tb->job=nil;
tb->address=1064+xk;
tb->length=maxisize-xk;
tb->flag=0;
}
if (choice==2)
{//链接成循环链表
free_table->FRlink=tb;
tb->RElink=free_table;
place=tb;
}
else
{
free_table->FRlink=NULL;
if (xk<maxisize) tb->RElink=NULL;
}
k=1;
}
else
{
if (2==choice) tb=place;//采用CFF时将ta定位到上次找到的合适空间分区的下个空间分区
else tb=free_table;
while(tb!=NULL)
{
if (3==choice)
{
while(tb!=NULL)
{
if (tb->length>=xk&&tb->flag==0)
if (tb->length<temp)
{place=tb;temp=tb->length;} //选择最适合空间
tb=tb->RElink;
}
tb=place;
}
if (tb->length>=xk&&tb->flag==0)
if (tb->length-xk<=minisize)
{//当搜索到的空间大小<=xk+minisize时,将空间全部分配给作业
tb->job=job;
tb->flag=1;
place=tb->RElink;
k=1;
break;
}
else
{//当搜索到的空间大小>xk+minisize时,将空间划分,再分配给作业
link=getspace(FRtable);
link->length=tb->length-xk;
tb->job=job;
tb->length=xk;
tb->flag=1;
link->RElink=tb->RElink;
if (NULL!=tb->RElink) tb->RElink->FRlink=link;
tb->RElink=link;
link->FRlink=tb;
link->job=nil;
link->address=tb->address+xk;
link->flag=0;
place=link;
k=1;
break;
}
tb=tb->RElink;
}
}
标签:
原文地址:http://www.cnblogs.com/xkb07/p/4550946.html