固定分区存储管理.docx
- 文档编号:27646037
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:24
- 大小:48.13KB
固定分区存储管理.docx
《固定分区存储管理.docx》由会员分享,可在线阅读,更多相关《固定分区存储管理.docx(24页珍藏版)》请在冰豆网上搜索。
固定分区存储管理
昆明理工大学信息工程与自动化学院学生实验报告
)学期一(2013—2014学年第
日11月28课程名称:
操作系统开课实验室:
信自楼4442013年
年级、专业、班N
default:
抛出异常
,将用提示用户是否继续操作(Y/N)户输入存放在变量yesorno中
&&
yesorno!
='n'Y
'N'yesorno!
=N
结束-3-
Y
temp2赋值为第i个内存空间大小与申请的内存空间大小只差
Temp1 Y No 保存内存空间号到Temp1=temp2. -4- NY 物联网2011级MManage对象,创建5.长度为提示用户输入作业名和作业占的内存大小 学号内存空间 姓名 成绩 实验项目名称将内存空间闲 固定分区存储管理No置为空释放失败 指导教师 教师评语YNY Y 不了解□基本了解□C.B.该同学是否了解实验内容与要求: A.了解□ 设计思想或流程图是否正确: □较差B.基本正确□C.A.正确□ 该同学的实验能力: 差B.中等□C.A.强□□达到□A.未达到□B.基本达到□C.该同学的实验是否达到要求: 规范□B.基本规范□C.不规范□A.实验报告是否规范: 是否有运行结果与分析: 详细□□B.一般□C.没有A.详细□C.□一般B.没有□A.是否有总结与体会: 教师签名: 日月年让用户手工输入每个分区大小,来初始化内存空间 、、提示用户输入他的选择: 1申请内存空间2将用户输入存放入释放内存空间。 swt变量 swt! =1swt! =2? 并且进行任务的内存Swt==1? 空间分配操作执行分配给任务的内Swt==2? 检查该任务号是否已经存在,100 或该任务大小是否超过该任务号已经存在或100该任务大小否超过是否i的变量,0初值为小于节点队列大小个内存空闲并且其大第i将内存空间No置为占申请失败并将作业分配给它有, 打印出内存空间信息 结束 开始提示用户输入作业名打印出内存空间信息结束 注: 报告内容按下列的要求进行。 实验目的一、通过编写固定分区存储管理的模拟程序,加深对操作系统存储管理功能中的固定分区管理方式、主存分配表等相应知识的理解。 通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉可变分区存储管理的内存分配和回收。 实验题目二、 设计一个固定分区分配的存储管理方案。 并模拟实现分区的分配和回收过程。 1.必须建立分区表,记录空闲区与占用区的状况。 2. 流程图按选定的算法自己完成。 3. -1- 三、算法设计的思想或流程图 本系统将内存用户空间划分为五个大小不固定的分区,其分区大小由用户输入决定。 在每个分区只装入一道作业,这样把用户空间划分为几个分区,便允许几道作业并发运行。 当有一个空闲分区时,便可以从外存的后备队列中选择一个适当大小的作业装入该分区,当该作业结束时又可以从后备作业队列中找出另一作业调入该分区。 每个内存空间是一个Node型的对象。 Node类有一个三个参数的构造函数。 分别为: 分区号、起始地址、大小。 然后就是一些属性的get、set方法和一个打印其属性的函数。 四个数据域分别为: 属性m_No用来表示该内存空间的序号。 属性m_Addr用来表示内存分区的起始地址。 属性m_Size用来表示内存空间的大小。 属性m_State表示内存空间的是否已分配的状态标志。 若该内存空间已分配,m_TaskNo表示占有该内存空间的任务序号。 否则没有实际意义。 在用户申请任务的内存空间时,提示用户输入任务号和其需要的内存空间大小。 流程图 主程序: -2- 开始 存空间分释放操作 分配内存空间算法: 开始 小大于作业申请的大小 i++ No==-1? 释放内存空间算法 初值为0的变量i,是否小于节点队列大小 第i个内存占有并且其作 业号等于输入的作业号 No 保存内存空间号到 -5- No==-1? 四、算法设计的实现、类设计1类主要是存放每个固本程序设计了两个比较简单的类: Node类和NodeMManage类。 进行一些操作来实NodeMManage定分区的一些信息。 而类则主要是对类的容器List 类设计的数据成员和接口如下: Node.h #ifndefNODE_H #defineNODE_H classNode { public: Node(intNo,intAddr,intSize); -6- intgetSize()const { returnm_Size; } boolgetState()const { returnm_State; } intgetTaskNo()const { returnm_TaskNo; } voidsetState(boolState); voidsetTaskNo(intTaskNo); voidprint(); private: intm_No; intm_Addr; intm_Size; boolm_State; intm_TaskNo; }; #endif//NODE_H -7- MManage.h #ifndefMMANAGE_H #defineMMANAGE_H #include classNode; classMManage { public: //MManage(); MManage(intMLength); MManage(std: : vector voidMAlloc(); voidMFree(); voidprint(); private: std: : vector -8- }; #endif//MMANAGE_H 类接口实现和main函数的实现: Node.cpp #include #includeNode.h Node: : Node(intNo,intAddr,intSize) : m_No(No),m_Addr(Addr),m_Size(Size) { m_State=true; m_TaskNo=0; } voidNode: : setTaskNo(intTaskNo) { m_TaskNo=TaskNo; } -9- voidNode: : setState(boolState) { m_State=State; } voidNode: : print() { std: : cout<<|< if(m_State) std: : cout< : endl; else std: : cout< : endl; } MManage.cpp #include #includeMManag.h #includeNode.h #defineMAXSIZE100 -10- //classNode; /*MManage: : MManage() { intsum; std: : cout< ; std: : cin>>sum; std: : cout< : endl; MManage(sum); } */ MManage: : MManage(intMNo) { intsize; intaddr=0; charyesOrNo='n'; while(yesOrNo! ='y'&&yesOrNo! ='Y') { m_Nodes.clear(); std: : cout< : endl; for(inti=0;i { do{ -11- std: : cout< ; std: : cin>>size; }while(size>=MAXSIZE); Nodenode(i+1,addr,size); m_Nodes.push_back(node); addr+=size; } print(); std: : cout< < : endl; std: : cin>>yesOrNo; } } MManage: : MManage(std: : vector { m_Nodes.assign(Nodes.begin(),Nodes.end()); } voidMManage: : MAlloc() { inttaskNo,size; intNo=-1; inttemp1=MAXSIZE; -12- inttemp2=MAXSIZE; boolflag; do{ flag=false; std: : cout< : endl; std: : cin>>taskNo>>size; for(unsignedi=0;i { if(m_Nodes[i].getTaskNo()==taskNo) { std: : cout< : endl; flag=true; } if(size>MAXSIZE) { std: : cout< : endl; flag=true; } } }while(flag); for(unsignedi=0;i { if(m_Nodes[i].getState()&&m_Nodes[i].getSize()>=size) -13- { temp2=m_Nodes[i].getSize()-size; if(temp2 { temp1=temp2; No=i; } } } if(No==-1) { std: : cout< : endl; } else { std: : cout< : endl; m_Nodes[No].setState(false); m_Nodes[No].setTaskNo(taskNo); } } voidMManage: : MFree() { inttaskNo,No=-1; -14- std: : cout< : endl; std: : cin>>taskNo; for(unsignedi=0;i { if(m_Nodes[i].getTaskNo()==taskNo&&! m_Nodes[i].getState()) { No=i; } } if(No==-1) { std: : cout< : endl; } else { std: : cout< : endl; m_Nodes[No].setState(true); m_Nodes[No].setTaskNo(0); } } voidMManage: : print() -15- { std: : cout< < : endl; std: : cout<<|No|<<|Addr|<<|Size|<<|State|<<|TaskNo |< : endl; for(unsignedi=0;i m_Nodes[i].print(); } Main.cpp #include #includeMManag.h #includeNode.h #defineSIZE5//分配区的个数 voidtestNode() { intsize=10; Nodenode1(1,0,size); node1.print(); Nodenode2(2,size,size); node2.setState(false); node2.setTaskNo (1); -16- node2.print(); //MManagem1(); //m1.print(); MManagem2 (2); m2.print(); } intmain() { MManagem(SIZE); charyesOrNo='y'; intswt=0; while(yesOrNo! ='n'&&yesOrNo! ='N') { while(swt! =1&&swt! =2) { system(cls); std: : cout<<==========================< : endl; std: : cout< < : endl; std: : cout<<1--applymemory< : endl; std: : cout<<2--freememory< : endl; std: : cout<<==========================< : endl; std: : cin>>swt; if(swt! =1&&swt! =2) -17- std: : cout< : endl; } switch(swt) { case1: m.MAlloc(); break; case2: m.MFree(); break; default: { printf(exceptionouccer\n); return1; } } m.print(); < : endl;std: : cout< std: : cin>>yesOrNo; swt=0; } } 四、运行结果与分析 手工输入每个分区的大小来初始化分区表: -18- 分析: 在手工输入每个内存空间的大小后,立即调用打印的函数将内存空间的情况打印出来。 让用户确定自己输入是否正确。 分配成功: 分析: 申请内存空间。 首先得输入作业号与作业大小。 在程序中是通过计算出最合适的内-19- 空间(内存空间与作业大小之差最小)分配给当前作业。 如图,在作业,大小为4.在图中可以看出使用最佳适应算法,内存空间2与之最为合适.故将内存空间2分配给作业2.在内存空间的分配图也可以看得出来内存空间2被作业2占用。 分配失败: 分析: 由于申请的作业3其大小超过了每一个内存空间的大小。 故分配失败。 内存释放: -20- 分析: 内存空间释放,先输入要释放的内存空间对应的任务号。 然后通过查找出对应0.的内存空间,将其信息修改为空闲,作业号改为说明该内存空间被释放。 总结体会五、通过此次试验加深了对操作系统存储管理功能中的固定分区管理方式、主存分配表等相应知识的理解。 对操作系统怎样实现存储管理有了初步的认识。 固定分区的优势是实现简单,只需要极少的操作系统开销。 它也有很多的缺点,例如: 有内部碎片,对内存的使用不充分、活动进程的最大数目是固定的等。 -21-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 固定 分区 存储 管理