动态分区分配的模拟.docx
- 文档编号:11880088
- 上传时间:2023-04-08
- 格式:DOCX
- 页数:13
- 大小:146.20KB
动态分区分配的模拟.docx
《动态分区分配的模拟.docx》由会员分享,可在线阅读,更多相关《动态分区分配的模拟.docx(13页珍藏版)》请在冰豆网上搜索。
动态分区分配的模拟
计算机科学专业课程设计任务书
学生姓名
专业班级
学号
题目
动态分区分配方式的模拟2
课题性质
其它
课题来源
自拟课题
指导教师
同组姓名
主要内容
1)用C语言实现采用循环首次适应算法的动态分区分配过程alloc()和回收过程free()。
其中,空闲分区通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲区低端的空间。
2)假设初始状态如下,可用的内存空间为640KB,并有下列的请求序列;
作业1申请130KB;作业2申请60KB;作业3申请100KB;作业2释放60KB;作业4申请200KB;作业3释放100KB;作业1释放130KB;作业5申请140KB;作业6申请60KB;作业7申请50KB;作业6释放60KB
请采用循环首次适应算法进行内存块的分配和回收,同时显示内存块分配和回收后空闲内存分区链的情况。
任务要求
了解动态分区分配中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。
参考文献
任满杰等《操作系统原理实用教程》电子工业出版社2006
汤子瀛《计算机操作系统》(修订版)西安电子科技大学出版社2001
张尧学史美林《计算机操作系统教程》实验指导清华大学出版社2000
罗宇等《操作系统课程设计》机械工业出版社2005
审查意见
指导教师签字:
教研室主任签字:
年月日
说明:
本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页
1需求分析
本题目要求实现采用循环首次适应算法的动态分区分配过程alloc()和回收过程free()。
其中,空闲分区通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲区低端的空间。
2概要设计
本程序主要有三大功能内存分配,内存回收,和查看内存分配情况。
1.内存分配。
循环首次适应算法是由首次适应算法演变而成的。
在为进程分配内存空间时,不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区,从中划出一块的请求大小相等的内存空间分配给作业。
为实现该算法,应设置一起始查找指针,用于指示下一次起始查询的空闲分区,并采用循环查找方式,即如果最后一个(链尾)空闲分区的大小仍不能满足要求,则返回到第一个空闲分区,比较大小是否满足,找到后,应调整起始查询指针。
2.内存回收。
将释放作业所在内存块的状态改为空闲状态,删除其作业名,设置为空。
并判断该空闲块是否与其他空闲块相连,若释放的内存空间与空闲块相连时,则合并为同一个空闲块,同时修改分区大小及起始地址。
3.查看内存分配情况。
通过访问链表查看输出内存分配情况。
各模块之间的关系:
3运行环境
1.软件环境:
WindowsXPsp3
2.硬件环境:
PC机
4开发工具和编程语言
开发工具:
MicrosoftVisualStudio
编程语言:
C/C++
5详细设计
1.链表结点的定义:
typedefstructfreearea//定义一个空闲区说明表结构
{
intID;//分区号
longsize;//分区大小
longaddress;//分区地址
intstate;//状态
}ElemType;
//----------线性表的双向链表存储结构------------
typedefstructDuLNode//双向链表
{
ElemTypedata;
structDuLNode*prior;//前趋指针
structDuLNode*next;//后继指针
}DuLNode,*DuLinkList;
2.内存分配算法:
//-----------------------分配内存-------------------------
Statusalloc()
{
intID,request;
cout<<"请输入作业号(分区号):
";
cin>>ID;
cout<<"请输入需要分配的内存大小(单位:
KB):
";
cin>>request;
if(request<0||request==0)
{
cout<<"分配大小不合适,请重试!
"< returnERROR; } if(Next_fit(ID,request)==OK) cout<<"分配成功! "< else cout<<"内存不足,分配失败! "< returnOK; } //--------------------循环首次适应算法------------------------ StatusNext_fit(intID,intrequest)//传入作业名及申请量 { //为申请作业开辟新空间且初始化 DuLinkListtemp=(DuLinkList)malloc(sizeof(DuLNode)); temp->data.ID=ID; temp->data.size=request; temp->data.state=Busy; inti=0; staticDuLNode*p=block_first->next;//定义静态指针变量 for(i=0;i>=0;i++) { if(p==block_last&&p->data.size { p=block_first->next; } while(p) { if(p->data.state==Free&&p->data.size==request) {//有大小恰好合适的空闲块 p->data.state=Busy; p->data.ID=ID; returnOK; } if(p->data.state==Free&&p->data.size>request) {//有空闲块能满足需求且有剩余" 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; p->data.size-=request; returnOK; } p=p->next; } if(i==1) break; } returnERROR; }3.内存回收算法: //-----------------------内存回收-------------------- Statusfree(intID) { DuLNode*p=block_first; while(p) { if(p->data.ID==ID) { p->data.state=Free; p->data.ID=Free; if(p->prior->data.state==Free)//与前面的空闲块相连 { p->prior->data.size+=p->data.size; p->prior->next=p->next; p->next->prior=p->prior; } if(p->next->data.state==Free)//与后面的空闲块相连 { p->data.size+=p->next->data.size; p->next->next->prior=p; p->next=p->next->next; } cout<<"回收成功"< returnOK; } p=p->next; } cout<<"输入有误"< returnERROR; }4.显示内存分配算法: //---------------显示内存分配情况------------------ voidshow() { cout<<"+++++++++++++++++++++++++++++++++++++++\n"; cout<<"+++内存分配情况+++\n"; cout<<"+++++++++++++++++++++++++++++++++++++++\n"; DuLNode*p=block_first->next; while(p) { cout<<"分区号: "; if(p->data.ID==Free)cout<<"Free"< elsecout< cout<<"起始地址: "< cout<<"分区大小: "< cout<<"状态: "; if(p->data.state==Free)cout<<"空闲"< elsecout<<"已分配"< cout<<"--------------\n"< p=p->next; } } 5.主函数算法: //-----------------------主函数--------------------------- voidmain() { Initblock();//开创空间表 intchoice;//操作选择标记 while (1) { system("cls"); cout<<"动态分区分配方式的模拟2\n\n"; cout<<"循环首次适应算法\n\n"; cout<<"1: 内存分配2: 内存回收\n\n"; cout<<"3: 查看分配0: 退出\n\n"; cout<<"请输入您的操作: "; cin>>choice; if(choice==1) { system("cls"); alloc(); system("pause"); }//调用分配内存 elseif(choice==2)//调用内存回收 { system("cls"); intID; cout<<"请输入您要释放的分区号: "; cin>>ID; free(ID); system("pause"); } elseif(choice==3) { system("cls"); show(); system("pause"); }//调用显示内存分配 elseif(choice==0) break; else//输入操作有误 { system("cls"); cout<<"输入有误,请重试! "< system("pause"); continue; } } } 6调试分析 在调试分析过程中遇到的主要问题是指针控制问题,比如,如何实现循环首次适应算法不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找? 解决办法是,使用静态指针变量。 再者,如何实现循环即当执行到链表尾且未找到合适分区如何跳回表头? 解决办法: 用if()语句控制 if(p==block_last&&p->data.size { p=block_first->next; },该语句的意思是如果查找到链尾,且未找到合适分区,则跳回表头开始查找。 同时用for()循环控制只循环一次。 当然,还有一些别的问题,比如如何实现内存分配和内存回收? 是用一个链表还是用多个链表? (分别记录空闲盘区和分配盘区)在内存回收过程中相邻空闲分区合并问题等。 解决办法是,采用一个双向链表链接盘区,用状态标志量表示分区所处状态,使用前驱和后继指针,便于空闲分区合并操作,实现内存回收。 7测试结果 测试数据: 作业1申请130KB;作业2申请60KB;作业3申请100KB;作业2释放60KB;作业4申请200KB;作业3释放100KB;作业1释放130KB;作业5申请140KB;作业6申请60KB;作业7申请50KB;作业6释放60KB 1.主界面: 2.作业1申请: 3.作业2申请: 4.作业2释放: 5.作业1释放: 6.作业7申请: 7.最终分配状态: 参考文献 [1]边肇祺,模式识别(第二版),北京: 清华大学出版社,1988,25~35 [2]任满杰等《操作系统原理实用教程》电子工业出版社2006 [3]汤子瀛《计算机操作系统》(修订版)西安电子科技大学出版社2001 [4]张尧学史美林《计算机操作系统教程》实验指导清华大学出版社2000 [5]罗宇等《操作系统课程设计》机械工业出版社2005 心得体会 通过本次设计我对循环首次适应算法有了更深的了解和认识。 循环首次适应算法的优点: 该算法能使内存中的空闲分区分布得更均匀,从而减少查找空闲分区时的开销。 缺点: 缺乏大的空闲分区。 该算法是由首次适应算法演变而成的。 在为进程分配内存空间时,不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区,从中划出一块的请求大小相等的内存空间分配给作业。 为实现该算法,应设置一起始查找指针,用于指示下一次起始查询的空闲分区,并采用循环查找方式,即如果最后一个(链尾)空闲分区的大小仍不能满足要求,则返回到第一个空闲分区,比较大小是否满足,找到后,应调整起始查询指针。 同时,我也对静态局部变量的特点和用法有了一定的理解和认识。 静态局部变量属于静态存储方式,它具有以下特点: (1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。 静态局部变量始终存在着,也就是说它的生存期为整个源程序。 (2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。 退出该函数后,尽管该变量还继续存在,但不能使用它。 (3)允许对构造类静态局部量赋初值。 若未赋以初值,则由系统自动赋以0值。 (4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。 且静态变量只初始化一次。 而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点,可以看出它是一种生存期为整个源文件的量。 虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。 虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动态 分区 分配 模拟
![提示](https://static.bdocx.com/images/bang_tan.gif)