首次适应算法.docx
- 文档编号:7253078
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:15
- 大小:140.73KB
首次适应算法.docx
《首次适应算法.docx》由会员分享,可在线阅读,更多相关《首次适应算法.docx(15页珍藏版)》请在冰豆网上搜索。
首次适应算法
计算机操作系统实验
一、实验名称:
首次适应算法
二、实验目的:
熟悉并利用首次适应算法进行分配内存资源和回收资源。
三、设计思想:
从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法目的在于减少查找时间。
为适应这种算法,空闲分区表(空闲区链)中的空闲分区要按地址由低到高进行排序。
该算法优先使用低址部分空闲区,在低址空间造成许多小的空闲区,在高地址空间保留大的空闲区。
流程图
(1)分配内存流程图
(2)释放内存
1当前作业为内存中最后一个作业
2当前作业为倒数第二个作业
3当前作业在链表中间
四、主要数据结构:
typedefstructmemory
{
structmemory*former;//前向指针
intwaddress;//地址
intwnum;//作业号
intsize;//分配内存大小
inttype;//状态0表示空闲1表示已分配
structmemory*next;//后向指针
}MEMORY;
MEMORY*mem;
五、运行结果截图
分配内存
释放内存
附录1
#include
#include
#include
typedefstructmemory
{
structmemory*former;//前向指针
intwaddress;//地址
intwnum;//作业号
intsize;//分配内存大小
inttype;//状态0表示空闲1表示已分配
structmemory*next;//后向指针
}MEMORY;
MEMORY*mem;
voidprfmem(MEMORY*ptr)//打印显示内存情况
{
MEMORY*temp;
temp=ptr->next;
printf("内存链的状态为:
\n");
while(temp!
=NULL)
{
if(temp->type==0)
{
printf("内存空闲\n起始地址为:
%d空闲空间大小为:
%d\n",temp->waddress,temp->size);
}
else
{
printf("内存已分配\n起始地址为%d分配空间大小为%d运行的作业号%d\n",temp->waddress,temp->size,temp->wnum);
}
temp=temp->next;
}
}
voidallocwork(MEMORY*ptr,MEMORY*assign)//根据算法分配内存
{
intsizemin;
if(ptr->next==NULL)//内存没有作业运行
{
if(ptr->size>=assign->size)
{
ptr->size=ptr->size-assign->size;
assign->type=1;
ptr->next=assign;
assign->former=ptr;
printf("作业%d申请%d的内存空间\n",assign->wnum,assign->size);
}
else
{
printf("没有足够的内存空间为作业%d分配\n",assign->wnum);
deleteassign;
}
}
else//内存中如果已经分配了空间
{
MEMORY*previous,*current;
previous=ptr;
current=previous->next;
while(current!
=NULL)
{
if(current->size>=assign->size&¤t->type==0)
{
break;
}
previous=current;
current=current->next;
}
if(current==NULL)//空闲链中没有为作业分配所需的空间,即释放的空闲区间小于要分配的作业空间
{
if(ptr->size>=assign->size)
{
assign->waddress=640-(ptr->size);
ptr->size=ptr->size-assign->size;
assign->type=1;
assign->former=previous;
previous->next=assign;
printf("作业%d申请%d的内存空间\n",assign->wnum,assign->size);
}
else
printf("没有足够的内存空间为作业%d分配\n",assign->wnum);
}
else//释放的空闲链中有可为此作业分配的空间
{
if((current->size-assign->size)<=sizemin)//空闲链所具备的空间与作业所需空间大小差不多时
{
current->wnum=assign->wnum;
current->type=1;
deleteassign;
printf("作业%d申请%d的内存空间\n",assign->wnum,assign->size);
}
else
{
current->size=current->size-assign->size;
assign->type=1;
assign->waddress=current->waddress+current->size;
if(current->next==NULL)//分配的空间是空闲链的最后一个元素
{
assign->former=current;
current->next=assign;
}
else
{
assign->next=current->next;
(current->next)->former=assign;
assign->former=current;
current->next=assign;
}
printf("作业%d申请%d的内存空间\n",assign->wnum,assign->size);
}
}
}
}
voidFF(inti)//依次初始化作业,对作业分配内存
{
intwork[6];
MEMORY*running;
running=(MEMORY*)malloc(sizeof(MEMORY));
printf("输入作业大小:
\n");
scanf("%d",&work[i]);
if(running!
=NULL)
{running->former=NULL;
running->waddress=0;
running->wnum=i;
running->size=work[i];
running->type=0;
running->next=NULL;
allocwork(mem,running);prfmem(mem);
}
else
printf("没有足够的内存空间\n");
}
voidreleasemem(MEMORY*ptr,inti)//释放内存
{
MEMORY*previous,*current;
previous=ptr;current=previous->next;
while(current!
=NULL)//找到需要释放的作业位置
{
if(current->type==1&¤t->wnum==i)
{break;}
previous=current;
current=current->next;
}
if(current==NULL)
{printf("内存中没有找到需要释放的作业!
\n");return;}
elseif(current->next==NULL)//当前作业为内存中最后一个作业
{
if(previous->type==0)//与前一个相邻空闲区合并
{
previous->size=previous->size+current->size;
previous->next=NULL;
printf("作业%d释放%d的空间\n",current->wnum,current->size);
prfmem(mem);
}
else
{
current->type=0;
printf("作业%d释放%d的空间\n",current->wnum,current->size);
prfmem(mem);
}
}
elseif((current->next)->next==NULL)//当前作业为倒数第二个作业
{
if(previous->type==0&&(current->next)->type==0)//释放的地址空间前后均为空闲区
{
previous->size=previous->size+current->size+(current->next)->size;
previous->next=NULL;
printf("作业%d释放%d的空间\n",current->wnum,current->size);
prfmem(mem);
}
elseif(previous->type==0)//前面有空闲块
{
previous->size=previous->size+current->size;
(current->next)->former=previous;
previous->next=current->next;
printf("作业%d释放%d的空间\n",current->wnum,current->size);
prfmem(mem);
}
elseif((current->next)->type==0)//后面有空闲块
{
current->size=current->size+(current->next)->size;
current->type=0;
current->next=NULL;
printf("作业%d释放%d的空间\n",current->wnum,current->size);
prfmem(mem);
}
else//前后都没有空闲块
{
current->type=0;
printf("作业%d释放%d的空间\n",current->wnum,current->size);
prfmem(mem);
}
}
else//当前作业在链表中间
{
if(previous->type==0&&(current->next)->type==0)//前后均为空闲区
{
previous->size=previous->size+current->size+(current->next)->size;
((current->next)->next)->former=previous;
previous->next=(current->next)->next;
printf("作业%d释放%d的空间\n",current->wnum,current->size);
prfmem(mem);
}
elseif(previous->type==0)//前面有空闲块则把它和前面的合并
{
previous->size=previous->size+current->size;
(current->next)->former=previous;
previous->next=current->next;
printf("作业%d释放%d的空间\n",current->wnum,current->size);
prfmem(mem);
}
elseif((current->next)->type==0)//释放的地址空间后面有空闲块
{
current->size=current->size+(current->next)->size;
current->type=0;
((current->next)->next)->former=current;
current->next=(current->next)->next;
printf("作业%d释放%d的空间\n",current->wnum,current->size);
prfmem(mem);
}
else//前后都没有空闲块
{
current->type=0;
printf("作业%d释放%d的空间\n",current->wnum,current->size);
prfmem(mem);
}
}
}
voidinitmem()//初始化
{
inta,i,j;
mem=newMEMORY;
mem->size=640;
mem->former=0;
mem->next=0;
printf("申请内存请输入1\n");printf("释放内存请输入2\n");
scanf("%d",&a);
while(a==1||a==2){
if(a==1){
printf("输入申请内存的作业编号1-5\n");
scanf("%d",&i);
FF(i);}
if(a==2){
printf("输入释放内存的作业编号1-5\n");
scanf("%d",&j);
releasemem(mem,j);}
printf("申请内存请输入1\n");printf("释放内存请输入2\n");printf("退出输入其他键\n");
scanf("%d",&a);
}
}
voidmain()
{
initmem();
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 首次 适应 算法
![提示](https://static.bdocx.com/images/bang_tan.gif)