操作系统存储管理动态分区分配及回收算法附源码.docx
《操作系统存储管理动态分区分配及回收算法附源码.docx》由会员分享,可在线阅读,更多相关《操作系统存储管理动态分区分配及回收算法附源码.docx(15页珍藏版)》请在冰豆网上搜索。
![操作系统存储管理动态分区分配及回收算法附源码.docx](https://file1.bdocx.com/fileroot1/2022-10/12/d41c13d9-a8c6-4f09-9c68-a888e181e7ff/d41c13d9-a8c6-4f09-9c68-a888e181e7ff1.gif)
操作系统存储管理动态分区分配及回收算法附源码
存储管理动态分区分配及回收算法
课程名称:
计算机操作系统班级:
信1501-2
实验者姓名:
李琛实验日期:
2018年5月20日
评分:
教师签名:
一、实验目的
分区管理就是应用较广泛的一种存储管理技术。
本实验要求用一种结构化高级语言构造分区描述器,编制动态分区分配算法与回收算法模拟程序,并讨论不同分配算法的特点。
二、实验要求
1、编写:
FirstFitAlgorithm
2、编写:
BestFitAlgorithm
3、编写:
空闲区回收算法
三、实验过程
(一)主程序
1、定义分区描述器node,包括3个元素:
(1)adr——分区首地址
(2)size——分区大小
(3)next——指向下一个分区的指针
2、定义3个指向node结构的指针变量:
(1)head1——空闲区队列首指针
(2)back1——指向释放区node结构的指针
(3)assign——指向申请的内存分区node结构的指针
3、定义1个整形变量:
free——用户申请存储区的大小(由用户键入)
(二)过程
1、定义check过程,用于检查指定的释放块(由用户键入)的合法性
2、定义assignment1过程,实现FirstFitAlgorithm
3、定义assignment2过程,实现BestFitAlgorithm
4、定义acceptment1过程,实现FirstFitAlgorithm的回收算法
5、定义acceptment2过程,实现BestFitAlgorithm的回收算法
6、定义print过程,打印空闲区队列
(三)执行
程序首先申请一整块空闲区,其首址为0,大小为32767;然后,提示用户使用哪种分
配算法,再提示就是分配还就是回收;分配时要求输入申请区的大小,回收时要求输入释放区的
首址与大小。
实验代码
Main、cpp
#include
#include
#include
#include
usingnamespacestd;
#defineMAX_SIZE32767
typedefstructnode
{
intid;
intadr;
intsize;
structnode*next;
}Node;
Node*head1,*head2,*back1,*back2,*assign;
intrequest;
intcheck(intadd,intsiz,charc)
{
Node*p,*head;
intcheck=1;
if(add<0||siz<0)
check=0;/*地址与大小不能为负*/
if(c=='f'||c=='F')
head=head1;
else
head=head2;
p=head->next;
while((p!
=NULL)&&check)
if(((addadr)&&(add+siz>p->adr))||((add>=p->adr)&&(addadr+p->size)))
check=0;
else
p=p->next;
if(check==0)
printf("\t输入释放区地址或大小有错误!
!
!
\n");
returncheck;
}
voidinit()
{
Node*p;
head1=(Node*)malloc(sizeof(Node));
head2=(Node*)malloc(sizeof(Node));
p=(Node*)malloc(sizeof(Node));
head1->next=p;
head2->next=p;
p->size=MAX_SIZE;
p->adr=0;
p->next=NULL;
p->id=0;
}
Node*assignment1(intnum,intreq)
{
Node*before,*after,*ass;
ass=(Node*)malloc(sizeof(Node));
before=head1;
after=head1->next;
ass->id=num;
ass->size=req;
while(after->size{
before=before->next;
after=after->next;
}
if(after==NULL)
{
ass->adr=-1;
}
else
{
if(after->size==req)
{
before->next=after->next;
ass->adr=after->adr;
}
else
{
after->size-=req;
ass->adr=after->adr;
after->adr+=req;
}
}
returnass;
}
voidacceptment1(intaddress,intsiz,intrd)
{
Node*before,*after;
intinsert=0;
back1=(Node*)malloc(sizeof(Node));
before=head1;
after=head1->next;
back1->adr=address;
back1->size=siz;
back1->id=rd;
back1->next=NULL;
while(!
insert&&after)
{//将要被回收的分区插入空闲区(按首址大小从小到大插入)
if((after==NULL)||((back1->adr<=after->adr)&&(back1->adr>=before->adr)))
{
before->next=back1;
back1->next=after;
insert=1;
}
else
{
before=before->next;
after=after->next;
}
}
if(insert)
{
if(back1->adr==before->adr+before->size)
{//与前边分区合并
before->size+=back1->size;
before->next=back1->next;
free(back1);
}
elseif(after&&back1->adr+back1->size==after->adr)
{//与后边分区合并
back1->size+=after->size;
back1->next=after->next;
back1->id=after->id;
free(after);
after=back1;
}
printf("\t首先分配算法回收内存成功!
\n");
}
else
printf("\t首先分配算法回收内存失败!
\n");
}
Node*assignment2(intnum,intreq)
{
Node*before,*after,*ass,*q;
ass=(Node*)malloc(sizeof(Node));
q=(Node*)malloc(sizeof(Node));
before=head2;
after=head2->next;
ass->id=num;
ass->size=req;
while(after->size{
before=before->next;
after=after->next;
}
if(after==NULL)
{
ass->adr=-1;
}
else
{
if(after->size==req)
{
before->next=after->next;
ass->adr=after->adr;
}
else
{
q=after;
before->next=after->next;
ass->adr=q->adr;
q->size-=req;
q->adr+=req;
before=head2;
after=head2->next;
if(after==NULL)
{
before->next=q;
q->next=NULL;
}
else
{
while((after->size)<(q->size))
{
before=before->next;
after=after->next;
}
before->next=q;
q->next=after;
}
}
}
return(ass);
}
voidacceptment2(intaddress,intsiz,intrd)
{
Node*before,*after;
intinsert=0;
back2=(Node*)malloc(sizeof(Node));
before=head2;
after=head2->next;
back2->adr=address;
back2->size=siz;
back2->id=rd;
back2->next=NULL;
if(head2->next==NULL)
{//空闲队列为空
head2->next=back2;
head2->size=back2->size;
}
else
{//空闲队列不为空
while(after)
{
if(back2->adr==after->adr+after->size)
{//与前边空闲分区合并
before->next=after->next;
after->size+=back2->size;
back2=after;
}
else
{
before=before->next;
after=after->next;
}
}
before=head2;
after=head2->next;
while(af