固定分区存储管理.docx
- 文档编号:3956704
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:15
- 大小:255.44KB
固定分区存储管理.docx
《固定分区存储管理.docx》由会员分享,可在线阅读,更多相关《固定分区存储管理.docx(15页珍藏版)》请在冰豆网上搜索。
固定分区存储管理
昆明理工大学信息工程与自动化学院学生实验报告
(2013—2014学年第一学期)
注:
报告内容按下列的要求进行。
一、实验目的
通过编写固定分区存储管理的模拟程序,加深对操作系统存储管理功能中的固定分区管理方式、主存分配表等相应知识的理解。
通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉可变分区
存储管理的内存分配和回收。
二、实验题目
1.设计一个固定分区分配的存储管理方案。
并模拟实现分区的分配和回收过程。
2.必须建立分区表,记录空闲区与占用区的状况。
3.流程图按选定的算法自己完成。
三、算法设计的思想或流程图
本系统将内存用户空间划分为五个大小不固定的分区,其分区大小由用户输入决定。
在每个分区只装入一道作业,这样把用户空间划分为儿个分区,便允许儿道作业并发运行。
当有一个空闲分区时,便可以从外存的后备队列中选择一个适当大小的作业装入该分区,当该作业结束时乂可以从后备作业队列中找出另一作业调入该分区。
每个内存空间是一个Node型的对象。
Node类有一个三个参数的构造函数。
分别为:
分区号、起始地址、大小。
然后就是一些属性的get、set方法和一个打印其属性的函数。
四个数据域分别为:
属性m_N。
用来表示该内存空间的序号。
属性m_Addr用来表示内存分区的起始地址。
属性m.Size用来表示内存空间的大小。
属性m.State表示内存空间的是否已分配的状态标志。
若该内存空间已分配,m.TaskNo表示占有该内存空间的任务序号。
否则没有实际意义。
在用户申请任务的内存空间时,提示用户输入任务号和其需要的内存空间大小。
流程图
主程序:
开始
释放内存空间算法
四、算法设计的实现
1、类设计
本程序设计了两个比较简单的类:
Node类和MManage类。
Node类主要是存放每个固定分区的一些信息。
而MManage类则主要是对Node类的容器List
类设计的数据成员和接口如下:
Node.h
#ifndefNODE_H
^defineNODE_H
classNodepublic:
Node(intNo,intAddr,intSize);intgetSize()const
{
returnm_Size;
}
boolgetState()const
{
returnm_State;
}
intgetTaskNof)const
{
returnm_TaskNo;
}
voidsetStatefboolState);
voidsetTaskNo(intTaskNo);voidprint();
private:
intm_No;
intm_Addr;
intm_Size;
boolm_State;
intm_TaskNo;
};
#endif//NODE_H
MManage.h
#ifndefMMANAGE_H
^defineMMANAGE.H
#inelude
classNode;
classMManage
{
public:
//MManage();
MManage(intMLength);
MManage(std:
:
vector
voidMAlloc();
voidMFree();
voidprint();
private:
std:
:
vector
};
#endif//MMANAGE_H
类接口实现和main函数的实现:
Node.cpp
^include
#inelude"Node.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;
}
voidNode:
:
setState(boolState)
{
m_State=State;
}
voidNode:
:
print()
{
std:
:
cout«M|,,< if(m_State) std: : cout< : endl; else std: : cout< : endl; } MManage.cpp ^include #ineludeMNode.hM ^defineAAAXSIZE100//classNode; /*MManage: : MManage() intsum; std: : cout<<'Pleaseinputthenumberofmemory: 1';std: : cin>>sum; std: : cout< : endI; MManage(sum); MManage: : MManage(intMNo) intsize; intaddr=0;charyesOrNo='rf; while(yesOrNo! =y'&&yesOrNo! =Y) m_Nodes.clear(); std: : cout<<"Starttoinitthememorytable"< : endl;for(inti=0;i do{ std: : cout<<"PleaseinputthesizeofM< ";std: : cin»size; }while⑸ze>=MAXSIZE); Nodenode(i+1,addr,size);m_Nodes.push_back(node);addr+=size; } pnnt(); std: : cout«Isthiscorrect? 11< : endl; std: : cin»yesOrNo; MManage: : MManage(std: : vectorvNode>Nodes) m_Nodes.assign(Nodes.begin(),Nodes.end()); } voidMManage: : MAlloc() { inttaskNo,size; intNo=-1; inttemp! =MAXSIZE; inttemp2=AAAXSIZE; boolflag; do{ flag=false; std: : cout<<"PleaseinputthetaskNo.andsize'*< : endl;std: : cin»taskNo>>size; for(unsignedi=0;i { if(m_Nodes[i].getTaskNo()==taskNo) {std: : cout< : endl;flag=true; } if(size>AAAXSIZE) { std: : cout«'Thesizeistoobig,pleasechangeitM< : endl;flag=true; } } Jwhile(flag); for(u“signedi=0;i { if(m_Nodes[i].getState()&&m_Nodes[i].getSize()>=size) { temp2=m_Nodes[i].getSize()・size;if(temp2 { tempi=temp2; No=i; } } } if(No==-1) { std: : cout<<"Allocationfail.”< : endl; } else std: : cout<<"Allocationsuccess/'< : endl;m_Nodes[No].setState(false);m_Nodes[No].setTaskNo(taskNo); } } voidMManage: : MFree() { inttaskNo,No=-1; std: : cout<<卩leaseinputthetaskNo."«std: : 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() { std: : cout< "«std: : endl; std: : cout< : endl; for(unsignedi=0;i } Main.cpp ^include #ineludeMMManag.h” #ineludeNode.h” ..wd.. ^defineSIZE5//分配区的个数 voidtestNode() { intsize=10; Nodenode1(1,0,size); nodel.print(); Nodenode2(2,size,size); node2.setState(false); node2.setTaskNo (1); node2.print(); //AAManagem1(); //m1.print(); MManagem2 (2); m2.print(); } intmain() { MManagem(SIZE); charyesOrNo="y; intswt=0; whilefyesOrNo! =n1&&yesOrNo! =N){ while(swt! =1&&swt! =2) { system「cisJ; std: : cout«M==========================,,< : endl;std: : cout«MPleaseputyourchoice: "< : endl;std: : cout«'t1・・applymemoryM«std: : endl; std: : cout«M2-freememoryu«std: : endl; std: : cout«M==========================,,< : endl; std: : cin>>swt; if(swt! =1&&swt! =2) std: : cout«Merroriput,pleaseput(1>2)*< : endl; } switch(swt) { case1: m.MAlloc(); break; case2: m.MFree(); break; default: 开始初始化内存空间表 请输入第1个内存空间的大小(小于100): 3请输入第2个内存空间的大小(小于100): 4请输入第3个内存空间的大小(小于100): 2请输入第4个内存空间的大小(小于100): 6请输入第5个内存空间的大小(小于100): 2内存空间表格: printf(Mexceptionouccer'rf);return1; } } m.print(); std: : cout< "< : endl; std: : cin»yesOrNo; swt=0; } } 四、运行结果与分析 手工输入每个分区的大小来初始化分区表: 分析: 在手工输入每个内存空间的大小后,立即调用打印的函数将内存空间的情况打印岀来。 让用 户确左自己输入是否正确。 分配成功: 请输入您的选择 1--申请内存空间 2— 释放内存空间 分析: 申请内存空间。 首先得输入作业号与作业大小。 在程序中是通过汁算岀最合适的内空间(内存空间与作业大小之差最小)分配给当前作业。 如图,任作业,大小为4.在图中可以看出使用最佳适应算法,内存空间2与之最为合适.故将内存空间2分配给作业2.在内存空间的分配图也可以看得岀来内存空间2被作业2占用。 分配失败: 请输入您的选择 1--申请内存空间 2— 释放内存空间 分析: 由于申请的作业3其大小超过了每一个内存空间的大小。 故分配失败。 内存释放: 请输入您的选择 1—申请内存空间 2— 释放内存空间 分析: 内存空间释放,先输入要释放的内存空间对应的任务号。 然后通过查找岀对应的内存空间,将其信息修改为空闲,作业号改为0•说明该内存空间被释放。 五.总结体会 通过此次试验加深了对操作系统存储管理功能中的固定分区管理方式、主存分配表等相应知识的理解。 对操作系统怎样实现存储管理有了初步的认识。 固定分区的优势是实现简单,只需要极少的操作系统开销。 它也有很多的缺点,例如: 有内部碎片,对内存的使用不充分、活动进程的最大数LJ是固定的等。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 固定 分区 存储 管理