操作系统实验二存储管理动态分区分配及回收算法_第1页
操作系统实验二存储管理动态分区分配及回收算法_第2页
操作系统实验二存储管理动态分区分配及回收算法_第3页
操作系统实验二存储管理动态分区分配及回收算法_第4页
操作系统实验二存储管理动态分区分配及回收算法_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验二 存储管理动态分区分配及回收算法一、 实验目的通过分区管理实验,了解操作系统的基本概念,理解计算机系统的资源如何组织,操作系统如何有效地管理这些系统资源,用户如何通过操作系统与计算机系统打交道。通过课程设计,我们可以进一步理解在计算机系统上运行的其它各类操作系统,并懂得在操作系统的支持下建立自己的应用系统。二、 实验要求本实验要求用一种结构化高级语言构造分区描述器,编制动态分区分配算法和回收算法模拟程序,并掌握分配算法的特点,提高编程技巧和对算法的理解和掌握。三、 实验过程1 准备 (一)主程序 1、定义分区描述器node,包括 3个元素: (1)adr分区首地址 (2)size分区大小

2、 (3)next指向下一个分区的指针 2、定义 3个指向node结构的指针变量: (1)head1空闲区队列首指针 (2)back1指向释放区node结构的指针 (3)assign指向申请的内存分区node结构的指针 3、定义 1个整形变量: free用户申请存储区的大小(由用户键入) (二)过程 1、定义check过程,用于检查指定的释放块(由用户键入)的合法性 2、定义assignment1过程,实现First Fit Algorithm 3、定义assignment2过程,实现Best Fit Algorithm 4、定义acceptment1过程,实现First Fit Algorit

3、hm的回收算法 5、定义acceptment2过程,实现Best Fit Algorithm的回收算法 6、定义print过程,打印空闲区队列 (三)执行 程序首先申请一整块空闲区,其首址为0,大小为32767;然后,提示用户使用哪种分配算法,再提示是分配还是回收;分配时要求输入申请区的大小,回收时要求输入释放区的首址和大小。 (四)输出 要求每执行一次,输出一次空闲区队列情况,内容包括: 编号 首址 终址 大小 2.主要流程和源代码实验二源代码#include<stdio.h>#include<stdlib.h>#include<string.h>#def

4、ine MAX_SIZE 32767typedef struct node int id; int adr; int size; struct node *next; Node;Node *head1,*head2,*back1,*back2,*assign;int request; int check(int add,int siz,char c) Node *p,*head;int check=1;if(add<0|siz<0)check=0;/*地址和大小不能为负*/if(c='f'|c='F')head=head1;elsehead=head

5、2;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"); return check; void init() Node *p;head1=(Node*)malloc(sizeof(N

6、ode);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(int num,int req) Node *before,*after,*ass;ass=(Node*)malloc(sizeof(Node);before=head1;after=head1->next;ass->id=num;

7、ass->size=req;while(after->size<req)before=before->next;after=after->next;if(after=NULL)ass->adr=-1; elseif(after->size=req) before->next=after->next;ass->adr=after->adr;else after->size-=req;ass->adr=after->adr;after->adr+=req;return ass;void acceptment1

8、(int address,int siz,int rd) Node *before,*after;int insert=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<=afte

9、r->adr)&&(back1->adr>=before->adr)before->next=back1;back1->next=after;insert=1;elsebefore=before->next;after=after->next;if(insert)if(back1->adr=before->adr+before->size)/和前边分区合并before->size+=back1->size;before->next=back1->next;free(back1);else

10、if(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");elseprintf("t首先分配算法回收内存失败!n");Node* assignment2(int num,int req) Node *bef

11、ore,*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->next;if(after=NULL)ass->adr=-1; elseif(after->size=req) before->next=after->

12、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;elsewhile(after->size)<(q->size)before=before->next;after=after->next;befor

13、e->next=q;q->next=after;return (ass);void acceptment2(int address,int siz,int rd) Node *before,*after;int insert=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)/空闲队列为空head

14、2->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;elsebefore=before->next;after=after->next;before=head2;after=head2->next;while(after)if(af

15、ter->adr=back2->adr+back2->size)/和后边空闲区合并before->next=after->next;back2->size+=after->size;elsebefore=before->next;after=after->next;before=head2;after=head2->next;while(!insert)/将被回收的块插入到恰当的位置(按分区大小从小到大)if(after=NULL|(after->size>back2->size)&&(before-

16、>size<back2->size) before->next=back2; back2->next=after; insert=1;break; else before=before->next; after=after->next; if(insert)printf("t最佳适应算法回收内存成功!n");elseprintf("t最佳适应算法回收内存失败!n");void print(char choice)/输出空闲区队列信息Node *p;if(choice='f'|choice='

17、;F')p=head1->next;elsep=head2->next;if(p)printf("n空闲区队列的情况为:n");printf("t编号t首址t终址t大小n");while(p)printf("t%dt%dt%dt%dn",p->id,p->adr,p->adr+p->size-1,p->size);p=p->next; void menu()/菜单及主要过程char chose;int ch,num,r,add,rd; while(1)system("c

18、ls");printf("选择最先适应算法请输入F,选择最佳适应算法请输入B,退出程序请输入Enn");printf("请输入你的选择:");scanf("%c",&chose);if(chose='e'|chose='E')exit(0);elsesystem("cls");while(1)if(chose='f'|chose='F')printf("最先适应算法(First-Fit)模拟:n");if(chos

19、e='b'|chose='B')printf("最佳适应算法(Best-Fit)模拟:n");printf("1.分配内存,2.回收内存,3.查看内存,4.返回nn");printf("请输入你的选择:");scanf("%d",&ch);fflush(stdin);switch(ch)case 1:printf("输入申请的分区大小:");scanf("%d",&r);if(chose='f'|chose='F')assign=assignment1(num,r);elseassign=assignment2(num,r);if(assign->adr=-1)printf("分配内存失败!n");else printf("分配成功!分配的内存的首址为:%dn",assig

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论