固定分区存储管理.docx

上传人:b****5 文档编号:28311065 上传时间:2023-07-10 格式:DOCX 页数:18 大小:123.36KB
下载 相关 举报
固定分区存储管理.docx_第1页
第1页 / 共18页
固定分区存储管理.docx_第2页
第2页 / 共18页
固定分区存储管理.docx_第3页
第3页 / 共18页
固定分区存储管理.docx_第4页
第4页 / 共18页
固定分区存储管理.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

固定分区存储管理.docx

《固定分区存储管理.docx》由会员分享,可在线阅读,更多相关《固定分区存储管理.docx(18页珍藏版)》请在冰豆网上搜索。

固定分区存储管理.docx

固定分区存储管理

昆明理工大学信息工程与自动化学院学生实验报告

(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表示占有该内存空间的任务序号。

否则没有实际意义。

在用户申请任务的内存空间时,提示用户输入任务号和其需要的内存空间大小。

流程图

主程序:

 

 

让用户手工输入每个分区大小,来初始化内存空间

提示用户输入他的选择:

1、申请内存空间2、释放内存空间。

将用户输入存放入swt变量

default:

抛出异常

进行任务的内存空间分配操作

创建MManage对象,内存空间长度为5.

swt!

=1

并且swt!

=2?

执行分配给任务的内存空间分释放操作

提示用户是否继续操作(Y/N),将用户输入存放在变量yesorno中

开始

Swt==1?

Swt==2?

yesorno!

=’n’&&yesorno!

=’N’

 

Y

N

Y

N

 

Y

N

检查该任务号是否已经存在,或该任务大小是否超过100

提示用户输入作业名和作业占的内存大小

该任务号已经存在或该任务大小否超过100

temp2赋值为第i个内存空间大小与申请的内存空间大小只差

开始

初值为0的变量i,是否小于节点队列大小

第i个内存空闲并且其大小大于作业申请的大小

Temp1

分配内存空间算法:

 

Y

 

Y

 

申请失败

Temp1=temp2.保存内存空间号到No

将内存空间No置为占有,并将作业分配给它

No==-1?

结束

打印出内存空间信息

i++

Y

 

NY

 

释放内存空间算法

 

释放失败

保存内存空间号到No

将内存空间No置为空闲

No==-1?

结束

打印出内存空间信息

 

四、算法设计的实现

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;i

m_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.说明该内存空间被释放。

五、总结体会

通过此次试验加深了对操作系统存储管理功能中的固定分区管理方式、主存分配表等相应知识的理解。

对操作系统怎样实现存储管理有了初步的认识。

固定分区的优势是实现简单,只需要极少的操作系统开销。

它也有很多的缺点,例如:

有内部碎片,对内存的使用不充分、活动进程的最大数目是固定的等。

(资料素材和资料部分来自网络,供参考。

可复制、编制,期待你的好评与关注)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 小学作文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1