固定分区存储管理.docx
《固定分区存储管理.docx》由会员分享,可在线阅读,更多相关《固定分区存储管理.docx(19页珍藏版)》请在冰豆网上搜索。
固定分区存储管理
昆明理工大学信息工程与自动化学院学生实验报告
(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.流程图按选定的算法自己完成。
三、算法设计的思想或流程图
本系统将内存用户空间划分为五个大小不固定的分区,其分区大小由用户输入决定。
在每个分区只装入一道作业,这样把用户空间划分为几个分区,便允许几道作业并发运行。
当有一个空闲分区时,便可以从外存的后备队列中选择一个适当大小的作业装入该分区,当该作业结束时又可以从后备作业队列中找出另一作业调入该分区。
每个内存空间是一个Node型的对象。
Node类有一个三个参数的构造函数。
分别为:
分区号、起始地址、大小。
然后就是一些属性的get、set方法和一个打印其属性的函数。
四个数据域分别为:
属性m_No用来表示该内存空间的序号。
属性m_Addr用来表示内存分区的起始地址。
属性m_Size用来表示内存空间的大小。
属性m_State表示内存空间的是否已分配的状态标志。
若该内存空间已分配,m_TaskNo表示占有该内存空间的任务序号。
否则没有实际意义。
在用户申请任务的内存空间时,提示用户输入任务号和其需要的内存空间大小。
流程图
主程序:
Y
N
Y
N
Y
N
分配内存空间算法:
Y
Y
Y
NY
释放内存空间算法
提示用户输入作业名
开始
初值为0的变量i,是否小于节点队列大小
第i个内存占有并且其作业号等于输入的作业号
四、算法设计的实现
1、类设计
本程序设计了两个比较简单的类:
Node类和MManage类。
Node类主要是存放每个固定分区的一些信息。
而MManage类则主要是对Node类的容器List进行一些操作来实现要求的内存空间的的分配和释放。
类设计的数据成员和接口如下:
Node.h
#ifndefNODE_H
#defineNODE_H
classNode
{
public:
Node(intNo,intAddr,intSize);
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
MManage.h
#ifndefMMANAGE_H
#defineMMANAGE_H
#include
classNode;
classMManage
{
public:
//MManage();
MManage(intMLength);
MManage(std:
:
vectorNodes);
voidMAlloc();
voidMFree();
voidprint();
private:
std:
:
vectorm_Nodes;
};
#endif//MMANAGE_H
类接口实现和main函数的实现:
Node.cpp
#include
#include"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<<"|"<if(m_State)
std:
:
cout<<"Idle||"<:
endl;
else
std:
:
cout<<"Occupy||"<:
endl;
}
MManage.cpp
#include
#include"MManag.h"
#include"Node.h"
#defineMAXSIZE100
//classNode;
/*MManage:
:
MManage()
{
intsum;
std:
:
cout<<"Pleaseinputthenumberofmemory:
";
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<<"Starttoinitthememorytable"<:
endl;
for(inti=0;i{
do{
std:
:
cout<<"Pleaseinputthesizeof"<
";
std:
:
cin>>size;
}while(size>=MAXSIZE);
Nodenode(i+1,addr,size);
m_Nodes.push_back(node);
addr+=size;
}
print();
std:
:
cout<<"Isthiscorrect?
"<:
endl;
std:
:
cin>>yesOrNo;
}
}
MManage:
:
MManage(std:
:
vectorNodes)
{
m_Nodes.assign(Nodes.begin(),Nodes.end());
}
voidMManage:
:
MAlloc()
{
inttaskNo,size;
intNo=-1;
inttemp1=MAXSIZE;
inttemp2=MAXSIZE;
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<<"Thistaskareallyexist,pleasechangeit"<:
endl;
flag=true;
}
if(size>MAXSIZE)
{
std:
:
cout<<"Thesizeistoobig,pleasechangeit"<:
endl;
flag=true;
}
}
}while(flag);
for(unsignedi=0;i{
if(m_Nodes[i].getState()&&m_Nodes[i].getSize()>=size)
{
temp2=m_Nodes[i].getSize()-size;
if(temp2{
temp1=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<<"PleaseinputthetaskNo."<:
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<<"Freefail(Cannotfindthetask)."<:
endl;
}
else
{
std:
:
cout<<"Freesuccess."<:
endl;
m_Nodes[No].setState(true);
m_Nodes[No].setTaskNo(0);
}
}
voidMManage:
:
print()
{
std:
:
cout<<"Thethememorytable:
"<:
endl;
std:
:
cout<<"|No|"<<"|Addr|"<<"|Size|"<<"|State|"<<"|TaskNo|"<:
endl;
for(unsignedi=0;im_Nodes[i].print();
}
Main.cpp
#include
#include"MManag.h"
#include"Node.h"
#defineSIZE5//分配区的个数
voidtestNode()
{
intsize=10;
Nodenode1(1,0,size);
node1.print();
Nodenode2(2,size,size);
node2.setState(false);
node2.setTaskNo
(1);
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<<"Pleaseputyourchoice:
"<:
endl;
std:
:
cout<<"1--applymemory"<:
endl;
std:
:
cout<<"2--freememory"<:
endl;
std:
:
cout<<"=========================="<:
endl;
std:
:
cin>>swt;
if(swt!
=1&&swt!
=2)
std:
:
cout<<"erroriput,pleaseput(1、2)"<:
endl;
}
switch(swt)
{
case1:
m.MAlloc();
break;
case2:
m.MFree();
break;
default:
{
printf("exceptionouccer\n");
return1;
}
}
m.print();
std:
:
cout<<"Doyouliketocontinue?
"<:
endl;
std:
:
cin>>yesOrNo;
swt=0;
}
}
四、运行结果与分析
手工输入每个分区的大小来初始化分区表:
分析:
在手工输入每个内存空间的大小后,立即调用打印的函数将内存空间的情况打印出来。
让用户确定自己输入是否正确。
分配成功:
分析:
申请内存空间。
首先得输入作业号与作业大小。
在程序中是通过计算出最合适的内
空间(内存空间与作业大小之差最小)分配给当前作业。
如图,在作业,大小为4.在图中可以看出使用最佳适应算法,内存空间2与之最为合适.故将内存空间2分配给作业2.在内存空间的分配图也可以看得出来内存空间2被作业2占用。
分配失败:
分析:
由于申请的作业3其大小超过了每一个内存空间的大小。
故分配失败。
内存释放:
分析:
内存空间释放,先输入要释放的内存空间对应的任务号。
然后通过查找出对应的内存空间,将其信息修改为空闲,作业号改为0.说明该内存空间被释放。
五、总结体会
通过此次试验加深了对操作系统存储管理功能中的固定分区管理方式、主存分配表等相应知识的理解。
对操作系统怎样实现存储管理有了初步的认识。
固定分区的优势是实现简单,只需要极少的操作系统开销。
它也有很多的缺点,例如:
有内部碎片,对内存的使用不充分、活动进程的最大数目是固定的等。