版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验三 使用动态分区分配方式的模拟1、实验目的了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。2、实验内容(1) 用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc( )和回收过程free( )。其中,空闲分区通过空闲分区链来管理:在进行内存分配时,系统优先使用空闲区低端的空间。(2) 假设初始状态下,可用的内存空间为640KB,并有下列的请求序列:作业1申请130KB。作业2申请60KB。作业3申请100KB。作业2释放60KB。作业4申请200KB。作业3释放100KB。作业1释放130KB。作业5申请140KB
2、。作业6申请60KB。作业7申请50KB。作业6释放60KB。请分别采用首次适应算法和最佳适应算法,对内存块进行分配和回收,要求每次分配和回收后显示出空闲分区链的情况。程序代码C语言实现#include<stdio.h>#include<stdlib.h>struct node /空闲分区链结点的定义node *before;node *after;int size;int address;int state;node L;struct usenodeusenode *next;int num;int add;int size;U,*n;void Init() /空闲分
3、区链的初始化node *p;p=(node *)malloc(sizeof(node);p->before=&L;p->after=NULL;p->size=640;p->address=0;p->state=0;L.after=p;L.before=NULL;L.size=0;U.next=NULL;n=&U;node *search(int a)node *p=L.after;if(p=NULL)printf("没有空闲的区域!");p=NULL;return p;elsewhile(p!=NULL && a
4、>p->size)p=p->after;if(p=NULL)printf("没有找到合适的空闲空间!");p=NULL;return p;else return p;void recovery(int a,int b) /内存回收算法node *c,*s,*r=L.after;node *d=L.after,*e;usenode *k=U.next,*h=&U; while(k!=NULL && a!=k->num)h=k;k=k->next;if(k=NULL)printf("没有找到这样的作业!"
5、);elseh->next=k->next;if(h->next=NULL)n=h;while(r!=NULL) /若回收得到的空闲块的前方有空闲块合并此空闲块if(k->add=r->address+r->size)r->size=r->size+k->size;break;elser=r->after; if(r=NULL) /若回收得到的空闲块的后面有空闲块合并此空闲块 r=L.after; while(r!=NULL) if(k->add+k->size=r->address)r->address=k-
6、>add;r->size=r->size+k->size;break;else r=r->after; while(d!=NULL) /保证空闲链表中没有相邻的空闲空间if(d->after!=NULL)e=d->after;elsebreak;if(d->address+d->size=e->address)d->after=e->after;while(e->after!=NULL)e->after->before=d;d->size=d->size+e->size;free(e);
7、break;elsed=d->after; if(r=NULL) r=L.after; c=(node *)malloc(sizeof(node); c->size=b; c->address=k->add; if(L.after=NULL)c->after=L.after;c->before=&L;L.after=c; else r=L.after; while(r!=NULL) if(r->address>c->address) c->after=r; c->before=r->before; r->be
8、fore->after=c; r->before=c; free(k); return; else r=r->after;free(k);void alloc(int a ,int b) /分配内存算法node *p,*q=L.after;usenode *m;p=search(b); if(p=NULL)return;m=(usenode *)malloc(sizeof(usenode);/生成一个被占用链表的结点,并插入到该链表的尾部m->add=p->address;m->size=b;m->num=a;m->next=n->next
9、;n->next=m;n=m; /保证n始终指向被占用链表的尾部,方便以后新生成结点的插入 if(p->size>b) /如果申请空间的大小小于找到空闲空间的大小的处理p->size=p->size-b;p->address=p->address+b;else /如果申请空间的大小等于找到空闲空间的大小的处理 p->before->after=p->after;if(p->after!=NULL) p->after->before=p->before;free(p);void sort() /对空闲链表进行排序
10、int max; node *p,*q,*r,*s;node a;p=L.after;while(p!=NULL) /让指针q指向链表的最后一个结点q=p;p=p->after;if(L.after->after=NULL) return;else while(p!=q) s=r=p=L.after; max=r->size; while(s!=q->after) if(s->size>max) max=s->size; r=s; s=s->after; else s=s->after; a.size=q->size; a.addre
11、ss=q->address; q->size=r->size; q->address=r->address; r->size=a.size; r->address=a.address;if(q->before->before=&L)return;else q=q->before; void Print()node *p=L.after;usenode *q=U.next;int i=1;printf("n空闲区域列表:n");printf("FREEID address sizen");
12、while(p!=NULL)printf("%-10d",i);printf("%-10d",p->address);printf("%dn",p->size);p=p->after;i+;if(q=NULL)return;elseprintf("n已分配区域列表:n");printf("WORKID address sizen");while(q!=NULL)printf("%-10d",q->num);printf("%-10d"
13、;,q->add);printf("%dn",q->size);q=q->next;void firstfit() /首次适应算法int a,b,i;Init();Print();while(1)printf("n1、申请空间n"); printf("2、释放空间n"); printf("3、退出首次适应算法n"); printf("请输入你的选择:"); scanf("%d",&i); switch(i) case 1: printf("
14、请输入申请空间的作业号:"); scanf("%d",&a); printf("请输入申请空间的大小:"); scanf("%d",&b); alloc(a,b); Print(); break; case 2: printf("请输入释放空间的作业号:"); scanf("%d",&a); printf("请输入释放空间的大小:"); scanf("%d",&b); recovery(a,b); Print();
15、 break; case 3:printf("n");return; void bestfit()int a,b,i;Init();Print();while(1)printf("n1、申请空间n"); printf("2、释放空间n"); printf("3、退出最佳适应算法n"); printf("请输入你的选择:"); scanf("%d",&i); switch(i) case 1: printf("请输入申请空间的作业号:"); scan
16、f("%d",&a); printf("请输入申请空间的大小:"); scanf("%d",&b); alloc(a,b); sort(); Print(); break; case 2: printf("请输入释放空间的作业号:"); scanf("%d",&a); printf("请输入释放空间的大小:"); scanf("%d",&b); recovery(a,b); sort(); Print(); break; c
17、ase 3:printf("n");return; void main() int i; while(1) printf("1、首次适应算法n"); printf("2、最佳适应算法n"); printf("3、退出n"); printf("请输入你的选择:"); scanf("%d",&i); switch(i) case 1:firstfit();break; case 2:bestfit();break; case 3:return; 运行结果 开始界面 首次适
18、应算法 最佳适应算法程序代码C+语言实现/*/* 动态分区分配方式的模拟 */* #include<iostream.h>#include<stdlib.h> #define Free 0 /空闲状态#define Busy 1 /已用状态#define OK 1
19、0; /完成#define ERROR 0 /出错#define MAX_length 640 /最大内存空间为640KBtypedef int Status; typedef struct freearea/定义一个空闲区说明表结构 int ID; /分区号 long size; /分区大小 long address; /分区地址
20、160; int state; /状态ElemType; /- 线性表的双向链表存储结构 -typedef struct DuLNode /double linked list ElemType data; struct DuLNode *prior; /前趋指针 struct DuLNode *next; /后继指针DuLNode,*Du
21、LinkList; DuLinkList block_first; /头结点DuLinkList block_last; /尾结点 Status alloc(int);/内存分配Status free(int); /内存回收Status First_fit(int,int);/首次适应算法Status Best_fit(int,int); /最佳适应算法void show();/查看分配Status Initblock();/开创空间表 Status Initblock()/开创带头结点的内存空间链表
22、60;block_first=(DuLinkList)malloc(sizeof(DuLNode); block_last=(DuLinkList)malloc(sizeof(DuLNode); block_first->prior=NULL; block_first->next=block_last; block_last->prior=block_first;
23、0; block_last->next=NULL; block_last->data.address=0; block_last->data.size=MAX_length; block_last->data.ID=0; block_last->data.state=Free; return OK; /- 分
24、 配 主 存 -Status alloc(int ch) int ID,request; cout<<"请输入作业(分区号):" cin>>ID; cout<<"请输入需要分配的主存大小(单位:KB):" cin>>request;
25、160;if(request<0 |request=0) cout<<"分配大小不合适,请重试!"<<endl; return ERROR; if(ch=2) /选择最佳适应算法
26、60; if(Best_fit(ID,request)=OK) cout<<"分配成功!"<<endl; else cout<<"内存不足,分配失败!"<<endl; return OK;
27、60; else /默认首次适应算法 if(First_fit(ID,request)=OK) cout<<"分配成功!"<<endl; else cout<<"内存不足,分配失败!"<<endl;
28、0; return OK; /- 首次适应算法 -Status First_fit(int ID,int request)/传入作业名及申请量 /为申请作业开辟新空间且初始化 DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode); temp->data.ID=ID;
29、60; temp->data.size=request; temp->data.state=Busy; DuLNode *p=block_first->next; while(p) if(p->data.state=Free && p
30、->data.size=request) /有大小恰好合适的空闲块 p->data.state=Busy; p->data.ID=ID;
31、0; return OK; break; if(p->data.state=Free && p->data.size>request)
32、60; /有空闲块能满足需求且有剩余" temp->prior=p->prior; temp->next=p;
33、 temp->data.address=p->data.address; p->prior->next=temp; p->prior=temp;
34、 p->data.address=temp->data.address+temp->data.size; p->data.size-=request; return OK; &
35、#160; break; p=p->next; return ERROR;/- 最佳适应算法 -Status Best_fit(int ID,int request)
36、60; int ch; /记录最小剩余空间 DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode); temp->data.ID=ID; temp->data.size=request; temp->data.state=Busy; DuLNode *p=block_fi
37、rst->next; DuLNode *q=NULL; /记录最佳插入位置 while(p) /初始化最小空间和最佳位置 if(p->data.state=Free && (p->data.
38、size>request | p->data.size=request) ) q=p; ch=p->data.size-request;
39、60; break; p=p->next; while(p) if(p->data.stat
40、e=Free && p->data.size=request) /空闲块大小恰好合适 p->data.ID=ID; p->data.state=Busy;
41、; return OK; break; if(p->data.state=Free && p->data.size>reques
42、t) /空闲块大于分配需求 if(p->data.size-request<ch)/剩余空间比初值还小
43、; ch=p->data.size-request;/更新剩余最小值 q=p;/更新最佳位置指向
44、; p=p->next; if(q=NULL) return ERROR;/没有找到空闲块 else /找到了最佳位置并实现分配 temp->prior=q->prior;
45、 temp->next=q; temp->data.address=q->data.address; q->prior->next=temp; q->prior=temp;
46、160; q->data.address+=request; q->data.size=ch; return OK; /- 主 存 回 收 -Status free(int ID)
47、DuLNode *p=block_first; while(p) if(p->data.ID=ID) p->data.state=Free;
48、; p->data.ID=Free; if(p->prior->data.state=Free)/与前面的空闲块相连 &
49、#160; p->prior->data.size+=p->data.size; p->prior->next=p->next;
50、0; p->next->prior=p->prior; if(p->next->data.state=Free)/与后面的空闲块相连
51、; p->data.size+=p->next->data.size; p->next->next->prior=p;
52、60; p->next=p->next->next;
53、160; break; p=p->next; return OK; /- 显示主存分配情况 -void show()
54、; cout<<"+n" cout<<"+ 主 存 分 配 情 况 +n" cout<<"+n" DuLNode *p=block_first->ne
55、xt; while(p) cout<<"分 区 号:" if(p->data.ID=Free) cout<<"Free"<<endl; els
56、e cout<<p->data.ID<<endl; cout<<"起始地址:"<<p->data.address<<endl; cout<<"分区大小:"<<p->data.size<<" KB"<<endl;
57、160; cout<<"状 态:" if(p->data.state=Free) cout<<"空 闲"<<endl; else cout<<"已分配"<
58、<endl; cout<<""<<endl; p=p->next; /- 主 函 数-void main() int ch;/算法选择标记 cout&l
59、t;<" 动态分区分配方式的模拟 n" cout<<"*n" cout<<"* 1)首次适应算法 2)最佳适应算法 *n" cout<<"*n" cout<<"请选择分配算法:" cin>>ch; Initblock(); /开创空间表 int choice; /操作
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 物品转让协议书
- 数控加工合同(3篇)
- 钢材购销服合同(32篇)
- 四川省泸州市龙马潭区五校联考2024-2025学年七年级上学期11月期中生物学试题(含答案)
- 河南省南阳市2024-2025学年高三上学期期中考试历史试题(含答案)
- 高考语文复习五年高考语文知识点汇编:名篇名句默写
- 四川省高考语文五年试题汇编-古诗词赏析
- 电脑速记技能培训契约
- 2024年广西区公务员考试《行测》真题及答案解析
- 调研报告:政府投资项目招投标存在的问题及建议
- Intercultural Communication 跨文化传播-暨南大学中国大学mooc课后章节答案期末考试题库2023年
- 不稳定血红蛋白病
- 六年级上册数学教学设计-第五单元 数据处理∣北师大版
- 医院人事管理制度汇编
- GB/T 30030-2023自动导引车术语
- 婴幼儿如厕照料(婴幼儿回应性照护课件)
- 面相与手相课件
- 烟草局考试计算机专业考试题
- 2023年浙江省衢州市七年级上学期数学期中考试试卷附答案
- 2023年中国船级社人才招聘笔试参考题库附带答案详解
- 学生综合素质评价管理机制和保障制度精选范文
评论
0/150
提交评论