主存储器空间地分配和回收实验报告材料_第1页
主存储器空间地分配和回收实验报告材料_第2页
主存储器空间地分配和回收实验报告材料_第3页
主存储器空间地分配和回收实验报告材料_第4页
主存储器空间地分配和回收实验报告材料_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、操作系统实验报告实验1 :主存储器空间的分配和回收姓名:何 浪学号: 201306080215专业班级: 计本132实验时间:报告时间:201566系 别:计算机系学 院:电气与信息工程学院实验3主存储器空间的分配和回收一、实验内容主存储器空间的分配和回收。二、实验目的一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存

2、的分配和回收的实现与主存储器的管理方式有关的,通过本实验帮助学生理解在可变分区管理方式下应怎样实现主存空间的分配和回收。三、实验原理模拟在可变分区管理方式下采用最先适应算法实现主存分配和回收。(1)可变分区方式是按作业需要的主存空间大小来分割分区的。当要装入一个作业时, 根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入。随着作业的装入、撤离,主存空间被分成许多个分区,有的分区被作业占用,而有的分区是空闲的。例如:为了说明哪些区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,格式如下:第一栏第二栏其中,起址一一指出起址长度状态1

3、4 K12 K未分配32 K96 K未分配个空闲区的主存起始地址。长度一一指出从起始地址开始的一个连续空闲的长度。状态一一有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区。(2) 当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两部分:一部分分给作业占用;另一部分又成为一个较小的空闲区。为了尽量减少由于分割造成的空闲区,而尽量保存高地址部分有较大的连续空闲区域,以利于大型作业的装入。为此,在空闲区说明表中,把每个空闲区按其地址顺序登记,即每个后继的空闲区其起始地址总是比前者大

4、。(3) 采用最先适应算法(顺序分配算法)分配主存空间。按照作业的需要量, 查空闲区说明表,顺序查看登记栏,找到第一个能满足要求的空闲 区。当空闲区大于需要量时,一部分用来装入作业,另一部分仍为空闲区登记在空闲区说明表中。由于本实验是模拟主存的分配,所以把主存区分配给作业后并不实际启动装入程序装入 作业,而用输出“分配情况”来代替。(4) 当一个作业执行结束撤离时,作业所占的区域应该归还,归还的区域如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。(5) 请按最先适应算法设计主存分配和回收的程序。假设初始时主存中没有作业,现按下面序列进行内存的申请与释放:作业1申请300K

5、,作业2申请100K,作业1释放300K,作业3申请150K,作业4申请30K,作业5申请40K,作业6申请60K,作业4释放30K。请你为它们进行主存分配和回收,把空闲区说明表的初值以及每次分配或回收后的变化显示出来或打印出来。四、算法流程图结束/双向链表结构头文件/除系统占用内存外的剩余内存/第一块空闲区的起至地址/第一块空闲区的大小/清屏函数头文件/定义空闲区类五、源程序及注释#in clude using n amespace std;#in elude #defi ne Residue 512#defi ne fst_free 0#defi ne fst_size512#i nclu

6、de #i nclude class Freepublic:Free();Free(i nt s,i nt I)start = s;len gth = l;int get_free(int length);/成员函数获取空闲分区void free_task(i nt start,i nt len gth);friend void prin t_free();protected:int start;int len gth;list free_list;/ 声明空闲分区表int Free:get_free (int size)int start = -1;list:iterator it=free

7、_list.begin(); 查找适当的空闲分区 iterator :迭代器(游标)提供一种方法访问一个容器bool find = false;while(it!=freeist.e nd()if(*it)-le ngth=size)fin d=true;start = (*it)-start;if(*it)-le ngthsize)/大于就分割把低地址分配出去(*it)-start += size;(*it)-le ngth -= size;elsefree_list.erase(it);/等于就从空闲分区中删掉break;/找到就跳出循环it+;return start; void Fre

8、e:free_task (int start,i nt len gth)list:iterator init_it,last_it;/ 查找要插入的位置last_it = ini t_it;list:iterator it=free_list.begi n();while(it!=freeist.e nd()if(*it)-start start) break;last_it = it;it+;bool li nk_prev=false;bool li nk_n ext=false;if(last_it!= init_it)/ 有前一个时if(*last_it)-start+(*last_it

9、)-le ngth = start)li nk_prev = true;if(it!=free_list.end()/ 有后一个时if(start+le ngth=(*it)-start)link_n ext = true;if(link_prev & link_next)/ 与前后都相连(*last_it)-le ngth += len gth + (*it)-le ngth;freeist.erase(it);else if(link_prev)/ 只与前相连(*last_it)-le ngth += len gth;else if(link_next)/ 只与后相连(*it)-start

10、 = start;(*it)-le ngth += len gth;else /前后都不相连Free *fr = new Free(start,le ngth); freeist.i nsert(it,fr); void prin t_free()cout e ndl空闲区状态: en dl en dl起始地址 大小 endl;for(list:iterator it=free _l ist.begi n( );it!=free _l ist.e nd();it+)coutstart length endl;class Task:public Free/ 定义分配分区类public:Task(

11、);Task(i nt n ,i nt s,i nt l):Free(s,l)n ame = n;void do_request(i nt n ame,i nt len gth);void do_revoke(i nt n ame);friend void prin t_task();protected:int n ame;list task_list;/分配可用起始地址void Task:do_request (i nt n ame,i nt size)if(n ame=0)cout 申请不合法!非法作业名! en dlResidue)cout 申请不合法!超出最大可用内存! en dle

12、ndl; return;bool find = false;/查找是否已存在同名作业list:iterator it=task_list.begin();while(it!=task_list.e nd()if(*it)- name=n ame)fin d=true;break;it+;if(fin d)return;int start=get_free(size);/从空闲分区选择合适的空间if(start=-1)/未找到合适空间cout 系统内存不足!作业等待! en dle ndl;return;Task *ta = new T ask (n ame,start,size);task_l

13、ist.push_back(ta);cout 作业申请内存成功!e ndle ndl;void Task:do_revoke (int n ame)if(n ame=0)cout 错误!不能回收系统内存! endl;return;bool find = false;/查找要回收的作业是否存在list:iterator it=task_list.begin();while(it!=task_list.e nd()if(*it)_ name=n ame)fin d=true;break;it+;if(!fi nd)cout 错误!作业名不存在!start,(*it)-le ngth);task_l

14、ist.erase(it);cout 回收作业占用内存成功! endl; void prin t_task()cout 作业名称起始地址大小 endl;for(list:iterator it=task_list.begi n( );it!=task_list.e nd();it+)cout name start le ngthen dl;cout en dl; int mai n()cout e ndl;cout 主存储器空间的分配和回收e ndl;cout e ndle ndle ndl;Free *fr1 = new Free(fst_free,fst_size);/把系统占用后剩余的内

15、存空间计入空闲分区表free_list.push_back(fr1);prin t_free();bool quit=false;while(!quit)Task T;Free F;cout a.申请内存b.回收内存endl;cout c.查看作业0.退出程序endlendl;cout op;if(op=a|op=A)int n ame;int size;cout n ame;cin size;T.do_request (n ame,size);prin t_free();else if(op=b|op=B) int n ame;cout n ame;T.do_revoke( name);pr

16、in t_free();else if(op=c|op=C)prin t_task();else if(op=0)break;else endl;cout 非法操作!char con;cout con;if(con=n | con=N)quit=true;system(cls);六、打印的程序运行时初值和运行结果H:煌诈矣茫注存仝Kt汾酷涓袞2-exeI 回pstz状态*竝Mi址大1、U512回退 P 0内作青看大 间 空 ffl!占功业内 A把W择2=g业内 择入申 迭並r H:谣年奚籬住丢I駆谀与谒克2 E起始迪址 大小ng I4m112 H:谣乍察辭E旧的分配与调宸2e * .卡-二看唯口US1?K-l 择入作 送器 请Lnpu1回占空闲区状态:始地址主小B竝0408丄:LZ彩敷Y/W:业内 择入申H :谀咋枣陥汪疗淫1那方暫日司當2. *W取退51程予:聃业内 择入曰 SMXPF:翳三间大小決三闲区忒态起始t也址弋卜18B丄2日4 圜112需卽邛大小汚机-甲谄内吁 -查看咋业宦闭区决态:&始地址丈小52BSR408112业内 择入申 ASV

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论