操作系统存储管理动态分区分配及回收算法附源码.docx

上传人:b****3 文档编号:1397607 上传时间:2022-10-22 格式:DOCX 页数:15 大小:141.58KB
下载 相关 举报
操作系统存储管理动态分区分配及回收算法附源码.docx_第1页
第1页 / 共15页
操作系统存储管理动态分区分配及回收算法附源码.docx_第2页
第2页 / 共15页
操作系统存储管理动态分区分配及回收算法附源码.docx_第3页
第3页 / 共15页
操作系统存储管理动态分区分配及回收算法附源码.docx_第4页
第4页 / 共15页
操作系统存储管理动态分区分配及回收算法附源码.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

操作系统存储管理动态分区分配及回收算法附源码.docx

《操作系统存储管理动态分区分配及回收算法附源码.docx》由会员分享,可在线阅读,更多相关《操作系统存储管理动态分区分配及回收算法附源码.docx(15页珍藏版)》请在冰豆网上搜索。

操作系统存储管理动态分区分配及回收算法附源码.docx

操作系统存储管理动态分区分配及回收算法附源码

存储管理动态分区分配及回收算法

课程名称:

计算机操作系统班级:

信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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1