操作系统存储动态分区分配及回收算法附源码.docx
《操作系统存储动态分区分配及回收算法附源码.docx》由会员分享,可在线阅读,更多相关《操作系统存储动态分区分配及回收算法附源码.docx(18页珍藏版)》请在冰豆网上搜索。
操作系统存储动态分区分配及回收算法附源码
存储管理动态分区分配及回收算法
课程名称:
计算机操作系统 班级:
信1501-2
实验者姓名:
李琛 实验日期:
2018年5月20日
评分:
教师签名:
一、实验目的
分区管理是应用较广泛的一种存储管理技术。
本实验要求用一种结构化高级语言构造分区描述器,编制动态分区分配算法和回收算法模拟程序,并讨论不同分配算法的特点。
二、实验要求
1、编写:
FirstFit Algorithm
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 过程,实现FirstFit Algorithm
3、定义assignment2过程,实现BestFit Algorithm
4、定义 acceptment1过程,实现FirstFitAlgorithm的回收算法
5、定义acceptment2 过程,实现 Best FitAlgorithm的回收算法
6、定义print过程,打印空闲区队列
(三)执行
程序首先申请一整块空闲区,其首址为0,大小为32767;然后,提示用户使用哪种分
配算法,再提示是分配还是回收;分配时要求输入申请区的大小,回收时要求输入释放区的
首址和大小。
实验代码
Main。
cpp
#include〈stdio。
h>
#include〈stdlib。
h>
#includeh>
#include<iostream>
usingnamespacestd;
#defineMAX_SIZE32767
typedefstruct node
{
ﻩintid;
ﻩint adr;
ﻩ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(((add〈p->adr)&& (add+ siz>p—〉adr))||((add〉= p—>adr)&&(add〈p—〉adr+p->size)))
ﻩﻩcheck=0;
ﻩelse
ﻩﻩp =p—>next;
if(check==0)
ﻩﻩprintf(”\t输入释放区地址或大小有错误!
!
!
\n");
ﻩreturncheck;
}
void init()
{
ﻩ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<req)
ﻩ{
ﻩﻩ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;
}
void acceptment1(intaddress,int siz,int rd)
{
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(int address,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(after)
ﻩ{
ﻩﻩif(after-〉adr==back2—>adr+back2->size)
ﻩﻩ{//和后边空闲区合并
ﻩﻩbefore—〉next=after—>next;
ﻩﻩback2—〉size+=after—>size;
ﻩ}
ﻩelse
{
ﻩﻩbefore=before-〉next;
ﻩﻩﻩﻩafter=after—>next;
ﻩﻩﻩ}
ﻩ}
ﻩbefore=head2;
ﻩafter=head2-〉next;
ﻩﻩwhile(!
insert)
ﻩ{//将被回收的块插入到恰当的位置(按分区大小从小到大)
ﻩﻩif(after==NULL||((after->size〉back2-〉size)&&(before->size〈back2-〉size)))
ﻩ{
ﻩﻩﻩbefore—>next =back2;
ﻩﻩﻩﻩback2—>next =after;
ﻩinsert =1;
ﻩﻩbreak;
ﻩ}
ﻩﻩelse
ﻩﻩ{
ﻩﻩﻩbefore = before—>next;
ﻩﻩﻩafter= after->next;
ﻩﻩ}
}
}
ﻩif(insert)
ﻩprintf(”\t最佳适应算法回收内存成功!
\n");
ﻩelse
ﻩﻩprintf(”\t最佳适应算法回收内存失败!
!
\n");
}
void print(charchoice)//输出空闲区队列信息
{
ﻩNode*p;
if(choice=='f’||choice=='F')
ﻩﻩp= head1-〉next;
else
ﻩp=head2—>next;
if(p)
{
printf("\n空闲区队列的情况为:
\n");
ﻩprintf("\t编号\t首址\t终址\t大小\n”);
ﻩﻩwhile(p)
ﻩ{
ﻩﻩprintf(”\t%d\t%d\t%d\t%d\n”,p-〉id,p->adr,p—〉adr+p—〉size—1, p—>size);
ﻩp =p—〉next;
}
ﻩ}
}
void menu()//菜单及主要过程
{
charchose;
intch,num=0,r,add,rd;
while(1)
ﻩ{
ﻩsystem(”cls”);
ﻩprintf("—--—---存储管理动态分区分配及回收算法--—--—-\n");
ﻩprintf(" F最先适应算法\n");
ﻩprintf(" B最佳适应算法\n");
ﻩprintf(” E退出程序\n");
printf(”—-—-———-——---—-——----——-——-——-—-—---——----————\n");
printf("请选择算法:
”);
ﻩcin〉〉 chose;
ﻩ//scanf("%c”,&chose);
ﻩif(chose=='e’ ||chose==’E’)
ﻩﻩexit(0);
ﻩelse
ﻩﻩ{
ﻩsystem("cls”);
ﻩwhile (1)
ﻩ{
ﻩﻩﻩif(chose== 'f'||chose== ’F’)
printf(”最先适应算法:
\n”);
ﻩif(chose ==’b’||chose=='B’)
ﻩﻩﻩﻩprintf("最佳适应算法:
\n");
ﻩprintf(”-———-———------—--——--—-—-—-—--——--—--—--—-—-——\n");
ﻩﻩprintf(" 1分配内存\n”);
ﻩprintf(" 2回收内存\n”);
ﻩﻩprintf(" 3 查看内存\n”);
ﻩﻩprintf(” 4返回\n”);
ﻩprintf("---—-—-——--——-—-—--—----—-—-——————-—-————-----\n\n”);
printf("请选择:
");
ﻩﻩﻩscanf(”%d",&ch);
ﻩfflush(stdin);
ﻩswitch(ch)
ﻩ{
ﻩﻩﻩﻩcase1:
ﻩﻩprintf("输入申请的分区大小:
”);scanf(”%d",&r);
if(chose=='f’|| chose== ’F’)
ﻩﻩassign =assignment1(num,r);
ﻩﻩﻩﻩelse
ﻩﻩﻩﻩassign=assignment2(num,r);
ﻩif(assign->adr ==—1)
{
ﻩﻩprintf(”分配内存失败!
\n”);
ﻩﻩﻩ}
ﻩﻩﻩelse
ﻩﻩﻩprintf(”分配成功!
分配的内存的首址为:
%d\n",assign—〉adr);
ﻩﻩbreak;
ﻩcase 2:
ﻩprintf("输入释放的内存的首址:
");scanf("%d", &add);
ﻩﻩprintf(”输入释放的内存的大小:
");scanf(”%d",&r);
ﻩﻩﻩﻩﻩprintf("输入释放的内存的编号:
”);scanf("%d", &rd);
ﻩﻩﻩﻩif(check(add,r,chose))
ﻩﻩﻩﻩ{
ﻩﻩif(chose==’f’||chose == ’F')
ﻩﻩﻩﻩﻩacceptment1(add,r,rd);
ﻩﻩﻩelse
ﻩﻩﻩacceptment2(add,r,rd);
ﻩﻩﻩ}
ﻩﻩﻩbreak;
ﻩcase3:
print(chose); break;
ﻩﻩcase 4:
menu();ﻩbreak;
ﻩﻩﻩ}
}
ﻩ}
}
}
void main()//主函数
{
init();
ﻩmenu();
}
四、实验结果
五、实验总结
通过这次实验我练习了存储管理动态分区分配及回收算法,对操作系统中动态可变分区存储管理有了更深刻的了解。
刚开始编程时并没有什么思路,查阅相关书籍,浏览网上的论坛后,才对这次实验有了编程思路,在编程中总会遇到各种意想不到问题,这些问题一定要解决。
在解决问题的同时,自己的编程能力也在提高。