操作系统存储动态分区分配及回收算法附源码文档格式.docx
- 文档编号:22308866
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:18
- 大小:144.96KB
操作系统存储动态分区分配及回收算法附源码文档格式.docx
《操作系统存储动态分区分配及回收算法附源码文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统存储动态分区分配及回收算法附源码文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
实验代码
Main。
cpp
#include〈stdio。
h>
#include〈stdlib。
h>
#include<
string。
#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;
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;
ﻩ}
ﻩ{
ﻩﻩ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首先分配算法回收内存失败!
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<
req)
ﻩbefore= before—〉next;
after =after—>
}
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—>
ﻩﻩﻩﻩ}
ﻩﻩ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->
ﻩﻩafter=after->
ﻩﻩﻩ}
ﻩﻩ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->
ﻩif(insert)
ﻩprintf(”\t最佳适应算法回收内存成功!
\n"
ﻩelse
ﻩﻩprintf(”\t最佳适应算法回收内存失败!
!
\n"
}
void print(charchoice)//输出空闲区队列信息
ﻩNode*p;
if(choice=='
f’||choice=='
F')
ﻩﻩp= head1-〉next;
ﻩp=head2—>
if(p)
printf("
\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("
最佳适应算法:
ﻩ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();
四、实验结果
五、实验总结
通过这次实验我练习了存储管理动态分区分配及回收算法,对操作系统中动态可变分区存储管理有了更深刻的了解。
刚开始编程时并没有什么思路,查阅相关书籍,浏览网上的论坛后,才对这次实验有了编程思路,在编程中总会遇到各种意想不到问题,这些问题一定要解决。
在解决问题的同时,自己的编程能力也在提高。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 存储 动态 分区 分配 回收 算法 源码