《计算机操作系统动态分区存储管理方式下的内存空间的分配及回收实验报告.doc》由会员分享,可在线阅读,更多相关《计算机操作系统动态分区存储管理方式下的内存空间的分配及回收实验报告.doc(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、. .计算机操作系统实验报告实验二实验题目:存储器管理 系别:计算机科学与技术系 班级:XX: 学号:2一、实验目的深入理解动态分区存储管理式下的存空间的分配与回收。二、实验容编写程序完成动态分区存储管理式下的存分配和回收的实现。具体容包括:确定用来管理存当前使用情况的数据构造;采用首次适应算法完成存空间的分配;分情况对作业进展回收;编写主函数对所做工作进展测试。三、实验原理分配:动态分区存储管理式把存除OS占用区域外的空间看作一个大的空闲区。当作业要求装入存时,根据作业需要存空间的大小查询存中各个空闲区,当从存中找到一个大于或等于该作业大小的存空闲区时,选择其中一个空闲区,按作业要求划出一个
2、分区装入该作业。回收:作业执行完后,它所占用的存空间被收回,成为一个空闲区。如果该空闲区的相邻分区也是空闲区,那么需要将相邻空闲区合并成一个空闲区。四、实验法实现动态分区的分配与回收,主要考虑三个问题:第一、设计记录存使用情况的数据表格,用来记录空闲区和作业占用的区域(利用构造体类型数组来保存数据);第二、在设计的数据表格根底上设计存分配算法采用首次适应算法找适宜的分区对空闲分区表进展排序,分配时要考虑碎片问题;第三、在设计的数据表格根底上设计存回收算法分四种情况进展回收上邻、下邻、上下邻和无相邻分区。五、实验步骤第一,设计记录存使用情况的数据表格l 已分配分区表:起始地址、长度、标志0表示“
3、空表项,1表示“已分配l 空闲分区表: 起始地址、长度、标志0表示“空表项,1表示“未分配struct used_table float address; /已分分区起始地址float length; /已分分区长度,单位为字节int flag; /已分配表区登记栏标志,用0表示空栏目,char zuoyename; /已分配区表Struct free_table float address; /空闲分区起始地址float length; /空闲分区长度,单位为字节int flag; /空闲分区表登记栏目用0表示空栏目,1表示未配; /空闲分区表第二,在设计的表格上进展存分配l 首次适应算法:
4、为作业分配存,要求每次找到一个起始地址最小的适合作业的分区按起始地址递增排序。l 最大碎片size:要求当找到的空闲分区作业的大小的值小于或等于size时,将该分区全局部配给作业数组后面元素向前移;l 否那么,给作业分割出一局部空间时,其余局部仍作为新的空闲分区登记空闲分区长度=空闲分区长度-作业长度,l 空闲分区起始地址=空闲分区起始地址+作业长度第三,在设计的表格上进展存回收。1、上邻:条件:回收作业的始址=某个空闲区的始址+长度 操作:空闲区的长度=空闲区的长度+作业的大小2、下邻:条件:回收作业的始址+作业的长度=某个空闲区的始址 操作: 空闲区的始址=回收作业的始址空闲区的长度=空闲
5、区的长度+作业的长度3、上下邻:条件:1,2条件同时成立操作:空闲区的始址=上邻的始址空闲区的长度=上邻的长度+作业的长度+下邻的长度删除下邻4、无上下邻: 操作:找flag=0的行空闲区的始址=回收作业的始址空闲区的长度=作业的长度六、实验代码# include# include#define M 10 /允的空闲区表长最大为m#define N 10 /允的最大作业数量为n#define MIN 1 /碎片的最大值#define SADDRESS 200 /空闲分区初始的起始地址#define SLENGTH 150000 /空闲分区的初始长度struct used_tfloat addr
6、ess; /已分分区起始地址float length; /已分分区长度int flag; /已分配表区登记栏标志,用0表示空栏目used_tableN;struct free_tfloat address; /空闲分区起始地址float length; /空闲分区长度int flag; /空闲分区表登记栏目用0表示空栏目,1表示未分配free_tableM; /空闲分区表void allocate(char,float); /分配算法子程序void reclaim(char); /回收算法子程序void main()int i,a;float zyl; char zyn;/空闲分区表初始化fr
7、ee_table0.address=SADDRESS; /空闲分区表的起始地址free_table0.length=SLENGTH; /空闲分区表的长度 free_table0.flag=1; /标志位置1表示未分配for(i=1;iM;i+)free_tablei.address=0;free_tablei.length=0;free_tablei.flag=0; /0表示空栏目/已分分区表初始化 for(i=0;iN;i+)used_tablei.address=0;used_tablei.length=0;used_tablei.flag=0;while(1)cout请选择功能项:end
8、l1-分配主存endl2-回收主存endl3-显示主存endl0-退出endla;switch(a)case 0: /中选择0时退出程序return;case 1: /a=1 分配主存空间coutn请输入作业名zyn和作业所需长度zyl(作业名为一个字符,长度zyl要小于SLENGTH):zynzyl;allocate(zyn,zyl); /为作业zyn分配主存空间break;case 2: / a=2 回收主存空间coutzyn;reclaim(zyn); /回收作业zyn的主存空间break;case 3: /a=3 显示主存情况,输出空闲区表和已分配区表 coutn输出空闲区表:endl
9、 起始地址 分区长度 标志endl;for(i=0;iM;i+) if(free_tablei.flag!=0)coutsetw(10)free_tablei.addresssetw(10)free_tablei.lengthsetw(10)free_tablei.flagendl; coutn按任意键,输出已分配区表;cin.get();coutn输出已分配区表:endl 起始地址 分区长度 标志endl;for(i=0;iN;i+)if(used_tablei.flag!=0)/输出已分配给作业的表目 coutsetw(10)used_tablei.addresssetw(10)used_
10、tablei.length setw(10)(char)used_tablei.flagendl; break;default: coutn没有该选项!endl;break; cin.get()/分配算法子程序void allocate(char zyn,float zyl)float ad;int k=-1;int i=0;while(i=zyl&free_tablei.flag=1) k=i; i+;if(k=-1) /未找到可用空闲区,返回cout无可用空闲区!endl;return;/*找到可用空闲区,开场分配:假设空闲区大小与作业要求分配的空间差小于MIN,那么将找到的空闲区全局部配
11、给该作业;假设空闲区大小与要求分配的空间的差大于minisize,那么从空闲区划出一局局部配给作业。*/ if(free_tablek.length-zyl=MIN) free_tablek.flag=0; ad=free_tablek.address; zyl=free_tablek.length; for(i=k;iM;i+)free_tablei=free_tablei+1; else free_tablek.length=free_tablek.length-zyl; ad=free_tablek.address; free_tablek.address=free_tablek.add
12、ress+zyl; /*修改已分配区表*/ i=0; while(used_tablei.flag!=0&iN) i+; /找空表目i used_tablei.address=ad; used_tablei.length=zyl; used_tablei.flag=zyn; return;/allocate/回收作业名为J的作业所占主存空间void reclaim(char zyn)int i,k,j,s,t;float S,L;s=0;while(used_tables.flag!=zyn|used_tables.flag=0)&s=N) cout找不到该作业!endl;return;use
13、d_tables.flag=0; /修改以分配表表目s标志为为空表目S=used_tables.address; /取作业zyn在存中的首地址L=used_tables.length; /取作业zyn所分配到的存的长度j=-1;k=-1;i=0;/寻找回收分区的上下邻空闲区,上邻表目k,下邻表目jwhile(iM&(j=-1|k=-1) if(free_tablei.flag=1)if(free_tablei.address+free_tablei.length=S) k=i; if(free_tablei.address=S+L) j=i;i+; if(k!=-1) /有上邻空闲区if(j!
14、=-1) /有下邻空闲区 即有上下邻空闲区,三项合并free_tablek.length=free_tablek.length+free_tablej.length+L; free_tablej.flag=0;else /上邻空闲区,下邻非空闲区,与上邻合并free_tablek.length=free_tablek.length+L;/ifelse /k=-1 无上邻空闲区if(j!=-1) /无上邻空闲区,有下邻空闲区,与下邻合并free_tablej.address=S;free_tablej.length=free_tablej.length+L; else /j=-1 上下邻均为非空
15、闲区,回收区域直接填入 t=0; /在空闲区表中寻找空栏目while(free_tablet.flag=1&t=M) /空闲区表满,回收空间失败,将已分配区表复原cout主存空闲表没有空间,回收失败!endl;used_tables.flag=zyn; return;free_tablet.address=S;free_tablet.length=L;free_tablet.flag=1; for(i=0;i=M-1;i+) for(int j=i;jfree_tablej.address) free_t temp; temp=free_tablei; free_tablei=free_tablej; free_tablej=temp; 七、实验结果1、总的存储空间2、分配空间3、回收空间1有上下邻2有上邻3有下邻4无上下邻,回收7八、实验总结1、通过实验学会了理解动态分区存储管理式下的存空间的分配与回收2、学会了回收的四种式3、实验过程中遇到了问题,学会了与同学探讨解决. .word.zl.