计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告

上传人:大米 文档编号:492404358 上传时间:2023-06-12 格式:DOCX 页数:9 大小:119.29KB
返回 下载 相关 举报
计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告_第1页
第1页 / 共9页
计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告_第2页
第2页 / 共9页
计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告_第3页
第3页 / 共9页
计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告_第4页
第4页 / 共9页
计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告》由会员分享,可在线阅读,更多相关《计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告(9页珍藏版)》请在金锄头文库上搜索。

1、计算机操作系统实验报告实验二实验题目:存储器管理系别:计算机科学与技术系班级:姓名:学号:2一、实验目的深入理解动态分区存储管理方式下的内存空间的分配与回收。二、实验内容编写程序完成动态分区存储管理方式下的内存分配和回收的实现。具体内容 包括:确定用来管理内存当前使用情况的数据结构;采用首次适应算法完成内存空间的分配;分情况对作业进行回收;编写主函数对所做工作进行测试。三、实验原理分配:动态分区存储管理方式把内存除OS占用区域外的空间看作一个大的 空闲区。当作业要求装入内存时,根据作业需要内存空间的大小查询内存中 各个空闲区,当从内存中找到一个大于或等于该作业大小的内存空闲区时, 选择其中一个

2、空闲区,按作业要求划出一个分区装入该作业。回收:作业执行完后,它所占用的内存空间被收回,成为一个空闲区。如果 该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。四、实验方法实现动态分区的分配与回收,主要考虑三个问题:第一、设计记录内存使用情况的数据表格,用来记录空闲区和作业占用的区 域(利用结构体类型数组来保存数据);第二、在设计的数据表格基础上设计内存分配算法(采用首次适应算法找合 适的分区(对空闲分区表进行排序),分配时要考虑碎片问题);第三、在设计的数据表格基础上设计内存回收算法(分四种情况进行回收(上 令匕、下邻、上下邻和无相邻分区)。五、实验步骤第一,设计记录内存使用

3、情况的数据表格已分配分区表:起始地址、长度、标志(0表示“空表项”,1表示“已分配”) 空闲分区表:起始地址、长度、标志(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表示未配; /空闲分区表第二,在设

4、计的表格上进行内存分配首次适应算法:为作业分配内存,要求每次找到一个起始地址最小的适合 作业的分区(按起始地址递增排序)。最大碎片size:要求当找到的空闲分区一作业的大小的值小于或等于size 时,将该分区全部分配给作业(数组后面元素向前移);否则,给作业分割出一部分空间时,其余部分仍作为新的空闲分区登记(空 闲分区长度=空闲分区长度-作业长度,空闲分区起始地址=空闲分区起始地址+作业长度 第三,在设计的表格上进行内存回收。1、上邻:条件:回收作业的始址=某个空闲区的始址+长度操作:空闲区的长度=空闲区的长度+作业的大小2、下邻:条件:回收作业的始址+作业的长度=某个空闲区的始址操作:空闲区

5、的始址=回收作业的始址空闲区的长度=空闲区的长度+作业的长度3、上下邻:条件:1,2条件同时成立操作:空闲区的始址=上邻的始址空闲区的长度=上邻的长度+作业的长度+下邻的长度 删除下邻4、无上下邻:操作:找flag=0的行 空闲区的始址=回收作业的始址 空闲区的长度=作业的长度六、实验代码# include# include#define M 10#define N 10#define MIN 1#define SADDRESS 200#define SLENGTH 150000 struct used_tfloat address; float length; int flag;used_t

6、ableN; struct free_tfloat address; float length; int flag;未分配free_tableM;/允许的空闲区表长最大为m/允许的最大作业数量为n/碎片的最大值/空闲分区初始的起始地址/空闲分区的初始长度/已分分区起始地址/已分分区长度/已分配表区登记栏标志,用0表示空栏目/空闲分区起始地址/空闲分区长度/空闲分区表登记栏目用0表示空栏目,1表示/空闲分区表void alloca te(char,floa t);/分配算法子程序void reclaim(char);void main()/回收算法子程序int i,a; float zyl;ch

7、ar zyn;/空闲分区表初始化/空闲分区表的起始地址/空闲分区表的长度/标志位置1表示未分配/0表示空栏目free_tableO.address二SADDRESS; free_tableO.length二SLENGTH;free_tableO.flag=l; for(i=1;iM;i+)free_tablei.address=O;free_tablei.length=0; free_ tablei.flag=O; /已分分区表初始化 for(i=0;iN;i+)used_tablei.address=0;used_tablei.length=0; used _t ablei.flag=O;

8、wh il e(1)cou t请选择功能项:endl1-分配主存endl2-回收主存endl3-显示主存endl 0-退出 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显示主存情况,输出空闲区表

9、和已分配区表coutn输出空闲区表:endl起始地址分区长度标志endl;for(i=0;iM;i+)if(free _t ablei.flag!=0)coutsetw(10)free_tablei.addresssetw(10)free_tablei.length setw(10)free_tablei.flagendl;coutn按任意键,输出已分配区表;cin.ge t();coutn输出已分配区表:endl起始地址分区长度标志endl;for(i=0;iN;i+)if(used_ tablei.flag!=O)/输出已分配给作业的表目coutsetw(10)used_tablei.ad

10、dresssetw(10)used_tablei.lengthse tw(10)(char)used _t ablei.flagendl; break;default:coutn 没有该选项! endl; break;cin.ge t()/分配算法子程序void alloca te(char zynfloa t zyl)float ad;int k=-1;int i=0;while(i二zy l&f ree_ tablei.flag=l) k=i;i+;if(k=-1)/未找到可用空闲区,返回cout无可用空闲区! endl;return;/*找到可用空闲区,开始分配:若空闲区大小与作业要求分

11、配的空间差小于MIN, 则将找到的空闲区全部分配给该作业;若空闲区大小与要求分配的空间的差大于 minisize,则从空闲区划出一部分分配给作业。*/if(free_tablek.length-zyl二MIN) free_tablek.flag=O;ad二free_tablek.address;zyl=free_tablek.length;for(i=k;iM;i+)free_tablei二free_tablei+l; elsefree_tablek.length二free_tablek.length-zyl;ad二free_tablek.address;free_tablek.address

12、二free_tablek.address+zyl;/*修改已分配区表*/i=0;while(used_tablei.flag!=O&iN)i+; /找空表目 iused_tablei.address=ad;used_tablei.length二zyl;used_tablei.flag=zyn;return;/allocate/回收作业名为J的作业所占主存空间void reclaim(char zyn)int i,k,j,s ,t;floa t S,L;s=0;while(used_tables.flag!=zyn|used_tables.flag=0)&s=N)cout找不到该作业! endl

13、;return;used_tables.flag=O;/修改以分配表表目s标志为为空表目S=used_tables.address;/取作业zyn在内存中的首地址L二used_tables.length;/取作业zyn所分配到的内存的长度j=-1;k=-1;i=0;/寻找回收分区的上下邻空闲区,上邻表目k,下邻表目j while(iM& (j=l|k=l)if(free _t ablei.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!=-1)/有下邻空闲区即有上下邻空闲区,三项合并free_tablek.length二free_tablek.length+free_tablej.length+L; free_tablej.flag=0;else/上邻空闲区,下邻非空闲区,与上邻合并free_tablek.le

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号