操作系统存储动态分区分配及回收算法附源码文档格式.docx

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

操作系统存储动态分区分配及回收算法附源码文档格式.docx

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

操作系统存储动态分区分配及回收算法附源码文档格式.docx

实验代码

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模板 > 可爱清新

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

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