固定分区存储管理

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

-1-昆明理工大学信息工程与自动化学院学生实验报告(2013—2014学年第一学期)课程名称:操作系统开课实验室:信自楼4442013年11月28日年级、专业、班物联网2011级学号姓名成绩实验项目名称固定分区存储管理指导教师教师评语该同学是否了解实验内容与要求:A.了解□B.基本了解□C.不了解□设计思想或流程图是否正确:A.正确□B.基本正确□C.较差□该同学的实验能力:A.强□B.中等□C.差□该同学的实验是否达到要求:A.达到□B.基本达到□C.未达到□实验报告是否规范:A.规范□B.基本规范□C.不规范□是否有运行结果与分析:A.详细□B.一般□C.没有□是否有总结与体会:A.详细□B.一般□C.没有□教师签名:年月日注:报告内容按下列的要求进行。一、实验目的通过编写固定分区存储管理的模拟程序,加深对操作系统存储管理功能中的固定分区管理方式、主存分配表等相应知识的理解。通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉可变分区存储管理的内存分配和回收。二、实验题目1.设计一个固定分区分配的存储管理方案。并模拟实现分区的分配和回收过程。2.必须建立分区表,记录空闲区与占用区的状况。3.流程图按选定的算法自己完成。-2-三、算法设计的思想或流程图本系统将内存用户空间划分为五个大小不固定的分区,其分区大小由用户输入决定。在每个分区只装入一道作业,这样把用户空间划分为几个分区,便允许几道作业并发运行。当有一个空闲分区时,便可以从外存的后备队列中选择一个适当大小的作业装入该分区,当该作业结束时又可以从后备作业队列中找出另一作业调入该分区。每个内存空间是一个Node型的对象。Node类有一个三个参数的构造函数。分别为:分区号、起始地址、大小。然后就是一些属性的get、set方法和一个打印其属性的函数。四个数据域分别为:属性m_No用来表示该内存空间的序号。属性m_Addr用来表示内存分区的起始地址。属性m_Size用来表示内存空间的大小。属性m_State表示内存空间的是否已分配的状态标志。若该内存空间已分配,m_TaskNo表示占有该内存空间的任务序号。否则没有实际意义。在用户申请任务的内存空间时,提示用户输入任务号和其需要的内存空间大小。流程图主程序:-3-YNYNYN让用户手工输入每个分区大小,来初始化内存空间提示用户输入他的选择:1、申请内存空间2、释放内存空间。将用户输入存放入swt变量default:抛出异常进行任务的内存空间分配操作创建MManage对象,内存空间长度为5.swt!=1并且swt!=2?执行分配给任务的内存空间分释放操作提示用户是否继续操作(Y/N),将用户输入存放在变量yesorno中开始Swt==1?Swt==2?yesorno!=’n’&&yesorno!=’N’结束-4-分配内存空间算法:YYY检查该任务号是否已经存在,或该任务大小是否超过100Temp1=temp2.保存内存空间号到No提示用户输入作业名和作业占的内存大小该任务号已经存在或该任务大小否超过100temp2赋值为第i个内存空间大小与申请的内存空间大小只差开始初值为0的变量i,是否小于节点队列大小第i个内存空闲并且其大小大于作业申请的大小Temp1temp2?-5-NY释放内存空间算法申请失败将内存空间No置为占有,并将作业分配给它No==-1?结束打印出内存空间信息提示用户输入作业名保存内存空间号到No开始初值为0的变量i,是否小于节点队列大小第i个内存占有并且其作业号等于输入的作业号i++-6-四、算法设计的实现1、类设计本程序设计了两个比较简单的类:Node类和MManage类。Node类主要是存放每个固定分区的一些信息。而MManage类则主要是对Node类的容器ListNode进行一些操作来实现要求的内存空间的的分配和释放。类设计的数据成员和接口如下:Node.h#ifndefNODE_H#defineNODE_HclassNode{public:Node(intNo,intAddr,intSize);释放失败将内存空间No置为空闲No==-1?结束打印出内存空间信息-7-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-8-MManage.h#ifndefMMANAGE_H#defineMMANAGE_H#includevectorclassNode;classMManage{public://MManage();MManage(intMLength);MManage(std::vectorNodeNodes);voidMAlloc();voidMFree();voidprint();private:std::vectorNodem_Nodes;-9-};#endif//MMANAGE_H类接口实现和main函数的实现:Node.cpp#includeiostream#includeNode.hNode::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;}-10-voidNode::setState(boolState){m_State=State;}voidNode::print(){std::cout|m_No||m_Addr||m_Size||;if(m_State)std::coutIdle||std::endl;elsestd::coutOccupy||m_TaskNo||std::endl;}MManage.cpp#includeiostream#includeMManag.h#includeNode.h#defineMAXSIZE100-11-//classNode;/*MManage::MManage(){intsum;std::coutPleaseinputthenumberofmemory:;std::cinsum;std::coutstd::endl;MManage(sum);}*/MManage::MManage(intMNo){intsize;intaddr=0;charyesOrNo='n';while(yesOrNo!='y'&&yesOrNo!='Y'){m_Nodes.clear();std::coutStarttoinitthememorytablestd::endl;for(inti=0;iMNo;++i){do{-12-std::coutPleaseinputthesizeofi+1thmemory:;std::cinsize;}while(size=MAXSIZE);Nodenode(i+1,addr,size);m_Nodes.push_back(node);addr+=size;}print();std::coutIsthiscorrect?std::endl;std::cinyesOrNo;}}MManage::MManage(std::vectorNodeNodes){m_Nodes.assign(Nodes.begin(),Nodes.end());}voidMManage::MAlloc(){inttaskNo,size;intNo=-1;inttemp1=MAXSIZE;-13-inttemp2=MAXSIZE;boolflag;do{flag=false;std::coutPleaseinputthetaskNo.andsizestd::endl;std::cintaskNosize;for(unsignedi=0;im_Nodes.size();++i){if(m_Nodes[i].getTaskNo()==taskNo){std::coutThistaskareallyexist,pleasechangeitstd::endl;flag=true;}if(sizeMAXSIZE){std::coutThesizeistoobig,pleasechangeitstd::endl;flag=true;}}}while(flag);for(unsignedi=0;im_Nodes.size();++i){if(m_Nodes[i].getState()&&m_Nodes[i].getSize()=size)-14-{temp2=m_Nodes[i].getSize()-size;if(temp2temp1){temp1=temp2;No=i;}}}if(No==-1){std::coutAllocationfail.std::endl;}else{std::coutAllocationsuccess.std::endl;m_Nodes[No].setState(false);m_Nodes[No].setTaskNo(taskNo);}}voidMManage::MFree(){inttaskNo,No=-1;-15-std::coutPleaseinputthetaskNo.std::endl;std::cintaskNo;for(unsignedi=0;im_Nodes.size();++i){if(m_Nodes[i].getTaskNo()==taskNo&&!m_Nodes[i].getState()){No=i;}}if(No==-1){std::coutFreefail(Cannotfindthetask).std::endl;}else{std::coutFreesuccess.std::endl;m_Nodes[No].setState(true);m_Nodes[No].setTaskNo(0);}}voidMManage::print()-16-{std::coutThethememorytable:std::endl;std::cout|No||Addr||Size||State||TaskNo|std::endl;for(unsignedi=0;im_Nodes.size();++i)m_Nodes[i].print();}Main.cpp#includeiostream#includeMManag.h#includeNode.h#defineSIZE5//分配区的个数voidtestNode(){intsize=10;Nodenode1(1,0,size);node1.print();Nodenode2(2,size,size);node2.setState(false);node2.setTaskNo(1);-17-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==

1 / 21
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功