版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上动态分区分配算法一实验内容与要求 内容:动态分区分配是根据进程的实际需要,动态地为之分配内存空间,而在分配时,须按照一定的分配算法,从空闲分区表或空闲分区链中选出一分区分配给该作业。在本实验中运用了三种分配算法,分别是1.首次适应算法,2.循环首次适应算法,3.最佳适应算法。 要求:动态分区算法也称为可变分区分配算法,常见的空闲区查找算法有首次适应算法,循环首次适应算法,最佳适应算法。特别注意分区回收时,相邻空闲分区需要合并。(1) 参考操作系统教材理解这3种分配算法以及回收算法。(2) 实现3种分配算法以及回收算法。(3) 已知作业申请内存和释放内存的序列,给出内存
2、的使用情况。(4) 作业申请内存和释放内存的序列可以存放在文本文件中。(5) 设计简单的交互界面,演示所设计的功能。(可以使用MFC进行界面的设计)(6) 可根据自己能力,在完成以上基本要求后,对程序功能进行适当扩充。二、需求分析 本次实验通过用C语言进行编程并调试、运行,形象地表现出动态分区的分配方式,直观地展现了首次适应算法和最佳适应算法对内存的释放和回收方式之间的区别。加深了我们对两种算法优缺点的理解,帮助我们了解一些数据结构和分配算法,进一步加深我们对动态分区存储器管理方式及其实现过程的理解。主要的问题在于,如何解决两种算法对内存的释放和回收空间的表示。 动态分区分配:又称为可变分区分
3、配,这种分配方式并不事先先将主存划分成一块块的分区,而是在作业进入主存时,根据作业的大小动态地建立分区。并使分区的大小正好适应作业的需要。因此系统中分区的大小是可变的,分区的数目也是可变的。 分区分配算法:1.首次适应法: 为作业选择分区时总是按地址从高到低搜索,只要找到可以容纳该作业的空白块,就把该空白块分配给该作业。特点:优先利用内存中底地址部分的空闲分区 (将所有空闲区,按其地址递增的顺序链接)2.循环首次适应算法该算法是由首次适应算法演变而成,在为进程分配内存空间时,不再是每次都从第一个空间开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到第一个能满足要求的空闲分区,
4、从中划出一块与请求大小相等的内存空间分配给作业,为实现本算法,设置一个全局变量f,来控制循环查找,当f%N=0时,f=0;若查找结束都不能找到一个满足要求的分区,则此次内存分配失败。3.最佳适应算法: 接到内存申请时,在空闲块表中找到一个不小于请求的最小空块进行分配;为作业选择分区时总是寻找其大小最接近于作业所要求的存储区域。三、概要设计 动态分区常用的数据结构有空闲分区表和空闲分区链,用来记录内存的使用情况,此题中我采用的是空闲分区链的结构,用链指针将所有的分区链接成一条链,每个分区的结构如下所示:typedef struct freearea/定义一个空闲区说明表结构int ID; /分区
5、号long size; /分区大小long address; /分区地址int state; /状态ElemType;typedef struct DuLNode /double linked listElemType data; struct DuLNode *prior; /前趋指针struct DuLNode *next; /后继指针DuLNode,*DuLinkList;前向指针和后向指针分别用于与当前分区的前后分区相链接,address用于说明当前分区的起始地址,状态字为0时表示当前分区空闲,为1时表示已分配,id为分配的作业号,size表示分配的内存大小。流程图:开始读入文件选择算
6、法首次循环最佳选择操作根据选择算法做出相应操作显示结果到达文件尾部显示结果选择根据要求,请求释放内存空进显示结果结束四、详细设计 #include <iostream>#include<stdio.h>#include <fstream>#include<stdlib.h>using namespace std; #define Free 0 /空闲状态#define Busy 1 /已用状态#define OK 1 /完成#define ERROR 0 /出错#define MAX_length 640 /最大内存空间为640KBtypedef
7、 int Status; typedef struct freearea/定义一个空闲区说明表结构int ID; /分区号long size; /分区大小long address; /分区地址int state; /状态ElemType; /- 线性表的双向链表存储结构 -typedef struct DuLNode /double linked listElemType data; struct DuLNode *prior; /前趋指针struct DuLNode *next; /后继指针DuLNode,*DuLinkList; DuLinkList block_first; /头结点Du
8、LinkList block_mid;DuLinkList block_last; /尾结点 Status alloc(int);/内存分配Status alloc2(int);/内存分配2Status free(int); /内存回收Status First_fit(int,int); /首次适应算法Status CycleFirst_fit(int,int);/循环首次适应算法Status Best_fit(int,int); /最佳适应算法void show();/查看分配Status Initblock();/开创空间表int ID,request;long adds=0; Statu
9、s Initblock()/开创带头结点的内存空间链表block_first=(DuLinkList)malloc(sizeof(DuLNode);block_last=(DuLinkList)malloc(sizeof(DuLNode);block_mid=(DuLinkList)malloc(sizeof(DuLNode);block_first->prior=NULL;block_first->next=block_mid;block_mid->next=block_last;block_mid->prior=block_first;block_last->
10、prior=block_mid;block_last->next=NULL;block_mid->data.address=0;block_mid->data.size=MAX_length;block_mid->data.ID=0;block_mid->data.state=Free;return OK; /- 分 配 主 存 -Status alloc(int ch)if(request<0 |request=0) cout<<"分配大小不合适,请重试!"<<endl;return ERROR; switch(
11、ch) case 1:if(First_fit(ID,request)=OK) cout<<"分配成功!"<<endl;else cout<<"内存不足,分配失败!"<<endl;ID=0;request=0;return OK;break;case 2:if(CycleFirst_fit(ID,request)=OK) cout<<"分配成功!"<<endl;else cout<<"内存不足,分配失败!"<<endl;
12、ID=0;request=0;return OK;break;case 3:if(Best_fit(ID,request)=OK) cout<<"分配成功!"<<endl;else cout<<"内存不足,分配失败!"<<endl;ID=0;request=0;return OK;break;default:cout<<"*ERROR!*"Status alloc2(int ch)int ID,request;cout<<"请输入作业(分区号):&quo
13、t; cin>>ID;cout<<"请输入需要分配的主存大小(单位:KB):" cin>>request;if(request<0 |request=0) cout<<"分配大小不合适,请重试!"<<endl;return ERROR; switch(ch) case 1:if(First_fit(ID,request)=OK) cout<<"分配成功!"<<endl;else cout<<"内存不足,分配失败!"
14、<<endl;return OK;break;case 2:if(CycleFirst_fit(ID,request)=OK) cout<<"分配成功!"<<endl;else cout<<"内存不足,分配失败!"<<endl;return OK;break;case 3:if(Best_fit(ID,request)=OK) cout<<"分配成功!"<<endl;else cout<<"内存不足,分配失败!"<
15、<endl;return OK;break;default:cout<<"*ERROR!*"/- 首次适应算法 -Status First_fit(int ID,int request)/传入作业名及申请量/为申请作业开辟新空间且初始化DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode); temp->data.ID=ID; temp->data.size=request;temp->data.state=Busy; DuLNode *p=block_first->next;while
16、(p)if(p->data.state=Free && p->data.size=request)/有大小恰好合适的空闲块p->data.state=Busy;p->data.ID=ID;return OK;break;if(p->data.state=Free && p->data.size>request)/有空闲块能满足需求且有剩余"temp->prior=p->prior;temp->next=p; temp->data.address=p->data.address;p-
17、>prior->next=temp; p->prior=temp;p->data.address=temp->data.address+temp->data.size;p->data.size-=request;return OK;break;p=p->next;return ERROR;/- 循环首次适应算法 -Status CycleFirst_fit(int ID,int request)/传入作业名及申请量/为申请作业开辟新空间且初始化DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode);
18、temp->data.ID=ID; temp->data.size=request;temp->data.state=Busy; DuLNode *p=block_first->next;while(p)if(p->data.state=Free && p->data.size=request)/有大小恰好合适的空闲块p->data.state=Busy;p->data.ID=ID;return OK;break;if(p->data.state=Free && p->data.size>requ
19、est&&p->data.address=adds)/有空闲块能满足需求且有剩余"temp->prior=p->prior;temp->next=p; temp->data.address=p->data.address;p->prior->next=temp; p->prior=temp;p->data.address=temp->data.address+temp->data.size;adds=p->data.address;p->data.size-=request;cout&
20、lt;<adds<<endl;return OK;break;if(request>p->next->data.size&&p->next->data.state=Free)if(First_fit(ID,request)=OK)return OK;p=p->next;return ERROR;/- 最佳适应算法 -Status Best_fit(int ID,int request)int ch; /记录最小剩余空间DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode); te
21、mp->data.ID=ID; temp->data.size=request;temp->data.state=Busy;DuLNode *p=block_first->next;DuLNode *q=NULL; /记录最佳插入位置while(p) /初始化最小空间和最佳位置if(p->data.state=Free &&(p->data.size>request | p->data.size=request) )q=p;ch=p->data.size-request;break;p=p->next;while(p)
22、if(p->data.state=Free && p->data.size=request)/空闲块大小恰好合适p->data.ID=ID;p->data.state=Busy;return OK;break;if(p->data.state=Free && p->data.size>request)/空闲块大于分配需求if(p->data.size-request<ch)/剩余空间比初值还小ch=p->data.size-request;/更新剩余最小值q=p;/更新最佳位置指向p=p->nex
23、t;if(q=NULL) return ERROR;/没有找到空闲块else/找到了最佳位置并实现分配temp->prior=q->prior;temp->next=q;temp->data.address=q->data.address;q->prior->next=temp;q->prior=temp;q->data.address+=request;q->data.size=ch;return OK; /- 主 存 回 收 -Status free(int ID)DuLNode *p=block_first;while(p)if
24、(p->data.ID=ID)p->data.state=Free;p->data.ID=Free;if(p->prior->data.state=Free&&p->next->data.state=Free)/前后都有空闲块p->prior->data.size+=p->data.size;p->prior->data.size+=p->next->data.size;p->prior->next=p->next->next;p->next->next-&g
25、t;prior=p->prior;adds=p->prior->data.address;cout<<"回收成功n"break;if(p->prior->data.state=Free)/与前面的空闲块相连p->prior->data.size+=p->data.size;p->prior->next=p->next;p->next->prior=p->prior;adds=p->prior->data.address;if(p->next->data.s
26、tate=Free)/与后面的空闲块相连 p->data.size+=p->next->data.size;p->next->next->prior=p;p->next=p->next->next;adds=p->prior->data.address;cout<<"回收成功n"break;p=p->next;return OK; /- 显示主存分配情况 -void show()cout<<"+n"cout<<"+ 主 存 分 配 情 况
27、 +n"cout<<"+n"DuLNode *p=block_first->next;while(p)cout<<"分 区 号:"if(p->data.ID=Free) cout<<"Free"<<endl;else cout<<p->data.ID<<endl;cout<<"起始地址:"<<p->data.address<<endl;cout<<"分区
28、大小:"<<p->data.size<<" KB"<<endl;cout<<"状 态:"if(p->data.state=Free) cout<<"空 闲"<<endl;else cout<<"已分配"<<endl;cout<<""<<endl;p=p->next;if(p=block_last)break; /- 主 函 数-void main()
29、int OpNum;int Sqe100100;FILE *fp;fp=fopen("input.txt","r");if(!fp)cout<<"无法打开文件input.txt"exit(1);fscanf(fp,"%d",&OpNum);for(int ii=0;ii<OpNum;ii+)for(int jj=0;jj<3;jj+)fscanf(fp,"%d",&Sqeiijj);int ch;/算法选择标记cout<<" 动态分区
30、分配方式的模拟 n"cout<<"*n"cout<<"* 1.首次适应算法 *n"cout<<"* 2.循环首次适应算法 *n"cout<<"* 3.最佳适应算法 *n"cout<<"* 0.退出程序 *n"cout<<"*n"cout<<"请选择分配算法:"cin>>ch;if(ch=0)exit(0);Initblock(); /开创空间表int
31、choice; /操作选择标记for(int nn=0;nn<OpNum;nn+) cout<<"*n"cout<<"* 1.下一操作 *n"cout<<"* 2.查看分配 *n"cout<<"* 0.退出程序 *n" cout<<"*n" cout<<"请输入您的操作 :" cin>>choice;if(choice=1) ID=Sqenn0;request=Sqenn2;if(Sqe
32、nn1=0)cout<<"作业"<<ID<<"申请"<<request<<"KB内存"<<endl;alloc(ch);/操作符为0,则开始分配内存if(Sqenn1=1)cout<<"作业"<<ID<<"释放"<<request<<"KB内存"<<endl;free(ID);/操作符为1,则释放内存else if(choice=2)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030中国智慧农业技术推广障碍与规模化应用策略研究报告
- 2026年遂宁市船山区中医医院招聘备考题库及一套答案详解
- 2026年珠海市金湾区广安幼儿园公开招聘代产假顶岗教师备考题库及一套参考答案详解
- 2026年月湖区卫健委公开招聘工作人员备考题库及参考答案详解一套
- 2026年长兴县定向培养基层社区医生招生5人(招聘)备考题库完整答案详解
- 2026年西藏琼结县藏医院卫生专技人员招聘备考题库有答案详解
- 2025至2030中国垃圾分类处理产业政策分析及技术路线与运营模式研究报告
- 2026年舟山市青少年活动中心招聘备考题库及1套完整答案详解
- 伊金霍洛旗公立医院2026年公开招聘90名专业技术人员备考题库及答案详解参考
- 2025至2030短途出行工具电动化趋势与换电模式可行性研究报告
- 静脉用药调配中心建设与管理指南(2021试行版)解读
- 癌症患者生活质量量表EORTC-QLQ-C30
- 六年级上册数学教案-总复习 专题一 数与代数|北师大版
- 工业互联网标准体系(版本3.0)
- 培养小学生的实验操作能力
- 气动回路图与气动元件课件
- 《念奴娇 赤壁怀古》《永遇乐 京口北固亭怀古》《声声慢》默写练习 统编版高中语文必修上册
- 妇产科病史采集临床思维
- 众辰变频器z2400t-15gy-1说明书
- DB63T 393-2002草地鼠虫害、毒草调查技术规程
- 船体振动的衡准及减振方法
评论
0/150
提交评论