资源简介
本算法为循环首次适应算法。
算法:由用户进行初始化,即输入分区的总数及各分区的大小,然后在这个基础上再进行后面的操作。在分配函数中,在本实验中设置一个定位指针,当为作业分配内存空间时,不是从空间分区表的起点开始查找,而是从上次找到的空间分区的位置开始查找,直至找到第一个能满足要求的空闲分区,并进行相应处理,在回收函数中,由于是要求选择需要回收的分区号,要考虑该分区号前后的分区的状态,再进行相应处理,
算法:由用户进行初始化,即输入分区的总数及各分区的大小,然后在这个基础上再进行后面的操作。在分配函数中,在本实验中设置一个定位指针,当为作业分配内存空间时,不是从空间分区表的起点开始查找,而是从上次找到的空间分区的位置开始查找,直至找到第一个能满足要求的空闲分区,并进行相应处理,在回收函数中,由于是要求选择需要回收的分区号,要考虑该分区号前后的分区的状态,再进行相应处理,
代码片段和文件信息
#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
- 上一篇:Python版的A*寻路算法
- 下一篇:通过webservice上传和下载文件
评论
共有 条评论