操作系统实验二存储管理动态分区分配及回收算法(1).doc
Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-date操作系统实验二存储管理动态分区分配及回收算法(1)操作系统实验二存储管理动态分区分配及回收算法(1)课程名称 操作系统 计算机科学与技术 分院 信10012 班 组 学号 实验者姓名 实验日期 2013 年 4 月 11 日评分 教师签名 实验二 存储管理动态分区分配及回收算法一、 实验目的通过分区管理实验,了解操作系统的基本概念,理解计算机系统的资源如何组织,操作系统如何有效地管理这些系统资源,用户如何通过操作系统与计算机系统打交道。通过课程设计,我们可以进一步理解在计算机系统上运行的其它各类操作系统,并懂得在操作系统的支持下建立自己的应用系统。二、 实验要求本实验要求用一种结构化高级语言构造分区描述器,编制动态分区分配算法和回收算法模拟程序,并掌握分配算法的特点,提高编程技巧和对算法的理解和掌握。三、 实验过程1 准备 (一)主程序 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过程,实现First Fit Algorithm 3、定义assignment2过程,实现Best Fit Algorithm 4、定义acceptment1过程,实现First Fit Algorithm的回收算法 5、定义acceptment2过程,实现Best Fit Algorithm的回收算法 6、定义print过程,打印空闲区队列 (三)执行 程序首先申请一整块空闲区,其首址为0,大小为32767;然后,提示用户使用哪种分配算法,再提示是分配还是回收;分配时要求输入申请区的大小,回收时要求输入释放区的首址和大小。 (四)输出 要求每执行一次,输出一次空闲区队列情况,内容包括: 编号 首址 终址 大小 2.主要流程和源代码实验二源代码#include<stdio.h>#include<stdlib.h>#include<string.h>#define 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=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"); return check; 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(int num,int req) 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; 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(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<=after->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 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 *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->next;if(after=NULL)ass->adr=-1; elseif(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;elsewhile(after->size)<(q->size)before=before->next;after=after->next;before->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)/空闲队列为空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;elsebefore=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;elsebefore=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");elseprintf("t最佳适应算法回收内存失败!n");void print(char choice)/输出空闲区队列信息Node *p;if(choice='f'|choice='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("cls");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(chose='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",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);elseacceptment2(add,r,rd);break;case 3:print(chose);break;case 4:menu();break; void main()/主函数 init();menu(); 四、 实验结果五、 实验总结通过这次课程设计我练习了用C语言写系统软件,对操作系统中可变分区存储管理有了更深刻的了解。在写程序的时候也遇到了一些困难。比如在设计数据结构时特别犹豫,总想找一个很合适的。但是,后来才知道,关键要多尝试,而空想是没有用的。最后我证实了自己的设计的合理性。还有为了使程序更健壮,在网上下载了几个代码,进行调试,运行、查看结果。看懂代码和结果后,这次实验也算是成功的一大半了。总之这次实验还是让我收获很大,让我在书本上的知识能够运用到实际当中。这种学以致用的感觉才是最好的。-