主存储器空间地分配和回收实验报告材料.doc

上传人:scccc 文档编号:12436580 上传时间:2021-12-03 格式:DOC 页数:29 大小:501KB
返回 下载 相关 举报
主存储器空间地分配和回收实验报告材料.doc_第1页
第1页 / 共29页
主存储器空间地分配和回收实验报告材料.doc_第2页
第2页 / 共29页
主存储器空间地分配和回收实验报告材料.doc_第3页
第3页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《主存储器空间地分配和回收实验报告材料.doc》由会员分享,可在线阅读,更多相关《主存储器空间地分配和回收实验报告材料.doc(29页珍藏版)》请在三一文库上搜索。

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<iostream> using n amespace std;#in elude <list>#defi ne Residue 512#defi ne fst_free

6、0#defi ne fst_size512#i nclude <stdio.h>#i nclude <stdlib.h> 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 *> free_list

7、;/ 声明空闲分区表int Free:get_free (int size)int start = -1;list<Free *>:iterator it=free_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 ngth>size)/大于就分割把低地址分配出去(*it)->

8、start += size;(*it)->le ngth -= size;elsefree_list.erase(it);/等于就从空闲分区中删掉break;/找到就跳出循环it+;return start; void Free:free_task (int start,i nt len gth)list<Free *>:iterator init_it,last_it;/ 查找要插入的位置last_it = ini t_it;list<Free *>:iterator it=free_list.begi n();while(it!=freeist.e nd()i

9、f(*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)->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 &&

10、 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 = start;(*it)->le ngth += len gth;else /前后都不相连Free *fr = new Free(start,le ngth); freeist.i nsert(it,fr);

11、void prin t_free()cout <<e ndl<<"空闲区状态:"<< en dl<< en dl<<"起始地址 大小"<< endl;for(list<Free *>:iterator it=free _l ist.begi n( );it!=free _l ist.e nd();it+)cout<<""<< (*it)->start <<""<< (*it)-&

12、gt;length << endl;class Task:public Free/ 定义分配分区类public:Task();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 *> task_list;/分配可用起始地址void Task:do_request (i nt n ame

13、,i nt size)if(n ame=0)cout <<" 申请不合法!非法作业名!"<< en dl<<e ndl;return;if(size>Residue)cout <<"申请不合法!超出最大可用内存! "<< en dl<<e ndl; return;bool find = false;/查找是否已存在同名作业list<T ask *>:iterator it=task_list.begin();while(it!=task_list.e nd()if(

14、*it)-> name=n ame)fin d=true;break;it+;if(fin d)return;int start=get_free(size);/从空闲分区选择合适的空间if(start=-1)/未找到合适空间cout <<" 系统内存不足!作业等待!"<< en dl<<e ndl;return;Task *ta = new T ask (n ame,start,size);task_list.push_back(ta);cout <<" 作业申请内存成功!"<<e nd

15、l<<e ndl;void Task:do_revoke (int n ame)if(n ame=0)cout <<"错误!不能回收系统内存!"<< endl;return;bool find = false;/查找要回收的作业是否存在list<T ask *>: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 <<" 错误!

16、作业名不存在!"<< en dl;return;free_task(*it)->start,(*it)->le ngth);task_list.erase(it);cout <<"回收作业占用内存成功!"<< endl; void prin t_task()cout <<" 作业名称起始地址大小"<< endl;for(list<Task *>:iterator it=task_list.begi n( );it!=task_list.e nd();it+)&l

17、t;<cout <<""<<(*it)-> name <<""<< (*it)->start <<""<<(*it)->le ngthen dl;cout <<""<< en dl; int mai n()cout <<"<<e ndl;cout <<"主存储器空间的分配和回收"<<e ndl;cout <<

18、"<<e ndl<<e ndl<<e ndl;Free *fr1 = new Free(fst_free,fst_size);/把系统占用后剩余的内存空间计入空闲分区表free_list.push_back(fr1);prin t_free();bool quit=false;while(!quit)Task T;Free F;cout <<"a.申请内存b.回收内存"<<endl;cout <<"c.查看作业0.退出程序"<<endl<<endl;

19、cout <<"请选择:"char op;cin> >op;if(op='a'|op='A')int n ame;int size;cout <<"请输入作业名及占用空间大小:"cin >> n ame;cin >> size;T.do_request (n ame,size);prin t_free();else if(op='b'|op='B') int n ame;cout <<"请输入要回收的作业名:&

20、quot;cin >> n ame;T.do_revoke( name);prin t_free();else if(op='c'|op=C)prin t_task();else if(op='0')break;else"<< endl;cout <<" 非法操作!char con;cout <<" 继续(Y/N):"cin >> con;if(con='n' | con='N')quit=true;system("cls

21、");六、打印的程序运行时初值和运行结果H:煌诈矣茫注存仝Kt汾酷涓袞2-exeI 回pstz状态*竝Mi址大1、U512回退 P 0内作青看大 间 空 ffl!占功业内 ±A把W择<2=g业内 择入申 迭並r H:谣年奚籬住丢I駆谀与谒克2 E起始迪址 大小4m112ng I H:谣乍察辭E旧的分配与调宸2e" * .卡-二看唯口US1?K-l 择入作 送器 请L±npu1回占空闲区状态:始地址主小B竝0408丄:LZ彩敷Y/W:业内 择入申H :谀咋枣陥汪疗淫1那方暫日司當2. *W取退51程予:聃业内 择入曰 SMXPF:翳三间大小決三闲区忒

22、态起始t也址弋卜18B丄2日4 圜112需卽邛大小汚机-甲谄内吁 -查看咋业宦闭区决态:&始地址丈小52BSR408112业内 择入申 ASVT4B业内 择入曰 SMXPFba三闲区忒态起始t也址弋卜28B204 圜112H: '谯先孰.王疔注问的分奇与注妄2启灼内栓回退$內作名功 业咸 的山收用回-0IB養择入作圭冃*:回宦闲区状i态. 肚如地址 大小400112_七、实验小结模拟在可变分区管理方式下采用最先适应算法实现了主存分配和回收,整个程序由两个类构成其主体,空闲区类和申请空间类。 使的整个程序更结构化。 程序在编写过程中也遇到了 很多问题,还好在查询各方面资料后都得以解决。每一个的程序的编写成功都是一件不易的工程不仅是对能力的检测,也是对心态的检测。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1