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

上传人:b****7 文档编号:9172771 上传时间: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

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

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

课程名称:

计算机操作系统        班级:

信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>

#include

h>

#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();

}

四、实验结果

五、实验总结

通过这次实验我练习了存储管理动态分区分配及回收算法,对操作系统中动态可变分区存储管理有了更深刻的了解。

刚开始编程时并没有什么思路,查阅相关书籍,浏览网上的论坛后,才对这次实验有了编程思路,在编程中总会遇到各种意想不到问题,这些问题一定要解决。

在解决问题的同时,自己的编程能力也在提高。

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

当前位置:首页 > 求职职场 > 简历

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

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