固定分区存储管理文档格式.docx
《固定分区存储管理文档格式.docx》由会员分享,可在线阅读,更多相关《固定分区存储管理文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
是否有总结与体会:
A.详细□B.一般□C.没有□
教师签名:
年月日
注:
报告内容按下列的要求进行。
一、实验目的
通过编写固定分区存储管理的模拟程序,加深对操作系统存储管理功能中的固定分区管理方式、主存分配表等相应知识的理解。
通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉可变分区存储管理的内存分配和回收。
二、实验题目
1.设计一个固定分区分配的存储管理方案。
并模拟实现分区的分配和回收过程。
2.必须建立分区表,记录空闲区与占用区的状况。
3.流程图按选定的算法自己完成。
三、算法设计的思想或流程图
本系统将内存用户空间划分为五个大小不固定的分区,其分区大小由用户输入决定。
在每个分区只装入一道作业,这样把用户空间划分为几个分区,便允许几道作业并发运行。
当有一个空闲分区时,便可以从外存的后备队列中选择一个适当大小的作业装入该分区,当该作业结束时又可以从后备作业队列中找出另一作业调入该分区。
每个内存空间是一个Node型的对象。
Node类有一个三个参数的构造函数。
分别为:
分区号、起始地址、大小。
然后就是一些属性的get、set方法和一个打印其属性的函数。
四个数据域分别为:
属性m_No用来表示该内存空间的序号。
属性m_Addr用来表示内存分区的起始地址。
属性m_Size用来表示内存空间的大小。
属性m_State表示内存空间的是否已分配的状态标志。
若该内存空间已分配,m_TaskNo表示占有该内存空间的任务序号。
否则没有实际意义。
在用户申请任务的内存空间时,提示用户输入任务号和其需要的内存空间大小。
流程图
主程序:
Y
N
N
分配内存空间算法:
NY
释放内存空间算法
四、算法设计的实现
1、类设计
本程序设计了两个比较简单的类:
Node类和MManage类。
Node类主要是存放每个固定分区的一些信息。
而MManage类则主要是对Node类的容器List<
Node>
进行一些操作来实现要求的内存空间的的分配和释放。
类设计的数据成员和接口如下:
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<
vector>
classNode;
classMManage
//MManage();
MManage(intMLength);
MManage(std:
:
vector<
Nodes);
voidMAlloc();
voidMFree();
std:
m_Nodes;
#endif//MMANAGE_H
类接口实现和main函数的实现:
Node.cpp
iostream>
#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;
setState(boolState)
m_State=State;
print()
cout<
<
"
|"
m_No<
||"
m_Addr<
m_Size<
;
if(m_State)
std:
Idle||"
std:
endl;
else
Occupy||"
m_TaskNo<
||"
MManage.cpp
MManag.h"
#defineMAXSIZE100
//classNode;
/*MManage:
MManage()
intsum;
cout<
"
Pleaseinputthenumberofmemory:
cin>
>
sum;
MManage(sum);
*/
MManage:
MManage(intMNo)
intsize;
intaddr=0;
charyesOrNo='
n'
while(yesOrNo!
='
y'
&
&
yesOrNo!
Y'
)
m_Nodes.clear();
Starttoinitthememorytable"
<
for(inti=0;
i<
MNo;
++i)
{
do{
std:
Pleaseinputthesizeof"
i+1<
thmemory:
size;
}while(size>
=MAXSIZE);
Nodenode(i+1,addr,size);
m_Nodes.push_back(node);
addr+=size;
}
print();
Isthiscorrect?
yesOrNo;
MManage(std:
Nodes)
m_Nodes.assign(Nodes.begin(),Nodes.end());
voidMManage:
MAlloc()
inttaskNo,size;
intNo=-1;
inttemp1=MAXSIZE;
inttemp2=MAXSIZE;
boolflag;
do{
flag=false;
PleaseinputthetaskNo.andsize"
taskNo>
for(unsignedi=0;
m_Nodes.size();
{
if(m_Nodes[i].getTaskNo()==taskNo)
{
Thistaskareallyexist,pleasechangeit"
flag=true;
}
if(size>
MAXSIZE)
Thesizeistoobig,pleasechangeit"
}
}while(flag);
for(unsignedi=0;
if(m_Nodes[i].getState()&
m_Nodes[i].getSize()>
=size)
temp2=m_Nodes[i].getSize()-size;
if(temp2<
temp1)
temp1=temp2;
No=i;
}
if(No==-1)
Allocationfail."
Allocationsuccess."
m_Nodes[No].setState(false);
m_Nodes[No].setTaskNo(taskNo);
MFree()
inttaskNo,No=-1;
PleaseinputthetaskNo."
taskNo;
if(m_Nodes[i].getTaskNo()==taskNo&
!
m_Nodes[i].getState())
No=i;
Freefail(Cannotfindthetask)."
Freesuccess."
m_Nodes[No].setState(true);
m_Nodes[No].setTaskNo(0);