固定分区存储管理Word下载.docx

上传人:b****2 文档编号:3705824 上传时间:2023-05-02 格式:DOCX 页数:18 大小:152.18KB
下载 相关 举报
固定分区存储管理Word下载.docx_第1页
第1页 / 共18页
固定分区存储管理Word下载.docx_第2页
第2页 / 共18页
固定分区存储管理Word下载.docx_第3页
第3页 / 共18页
固定分区存储管理Word下载.docx_第4页
第4页 / 共18页
固定分区存储管理Word下载.docx_第5页
第5页 / 共18页
固定分区存储管理Word下载.docx_第6页
第6页 / 共18页
固定分区存储管理Word下载.docx_第7页
第7页 / 共18页
固定分区存储管理Word下载.docx_第8页
第8页 / 共18页
固定分区存储管理Word下载.docx_第9页
第9页 / 共18页
固定分区存储管理Word下载.docx_第10页
第10页 / 共18页
固定分区存储管理Word下载.docx_第11页
第11页 / 共18页
固定分区存储管理Word下载.docx_第12页
第12页 / 共18页
固定分区存储管理Word下载.docx_第13页
第13页 / 共18页
固定分区存储管理Word下载.docx_第14页
第14页 / 共18页
固定分区存储管理Word下载.docx_第15页
第15页 / 共18页
固定分区存储管理Word下载.docx_第16页
第16页 / 共18页
固定分区存储管理Word下载.docx_第17页
第17页 / 共18页
固定分区存储管理Word下载.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

固定分区存储管理Word下载.docx

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

固定分区存储管理Word下载.docx

并模拟实现分区的分配和回收过程。

2.必须建立分区表,记录空闲区与占用区的状况。

3.流程图按选定的算法自己完成。

三、算法设计的思想或流程图

本系统将存用户空间划分为五个大小不固定的分区,其分区大小由用户输入决定。

在每个分区只装入一道作业,这样把用户空间划分为几个分区,便允许几道作业并发运行。

当有一个空闲分区时,便可以从外存的后备队列中选择一个适当大小的作业装入该分区,当该作业结束时又可以从后备作业队列中找出另一作业调入该分区。

每个存空间是一个Node型的对象。

Node类有一个三个参数的构造函数。

分别为:

分区号、起始地址、大小。

然后就是一些属性的get、set方法和一个打印其属性的函数。

四个数据域分别为:

属性m_No用来表示该存空间的序号。

属性m_Addr用来表示存分区的起始地址。

属性m_Size用来表示存空间的大小。

属性m_State表示存空间的是否已分配的状态标志。

若该存空间已分配,m_TaskNo表示占有该存空间的任务序号。

否则没有实际意义。

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

流程图

主程序:

 

Y

N

N

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

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

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

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

开始

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

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

Temp1<

temp2?

分配存空间算法:

申请失败

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

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

No==-1?

结束

打印出内存空间信息

i++

NY

释放存空间算法

释放失败

保存内存空间号到No

将内存空间No置为空闲

四、算法设计的实现

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

Thethememorytable:

|No|"

|Addr|"

|Size|"

|State|"

|TaskNo|"

for(unsignedi=0;

m_Nodes[i].print();

Main.cpp

#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);

intswt=0;

while(yesOrNo!

N'

while(swt!

=1&

swt!

=2)

system("

cls"

);

std:

=========================="

Pleaseputyourchoice:

1--applymemory"

2--freememory"

cin>

swt;

if(swt!

=1&

swt!

=2)

erroriput,pleaseput(1、2)"

switch(swt)

case1:

m.MAlloc();

break;

case2:

m.MFree();

default:

printf("

exceptionouccer\n"

return1;

}

m.print();

Doyouliketocontinue?

swt=0;

四、运行结果与分析

手工输入每个分区的大小来初始化分区表:

分析:

在手工输入每个存空间的大小后,立即调用打印的函数将存空间的情况打印出来。

让用户确定自己输入是否正确。

分配成功:

申请存空间。

首先得输入作业号与作业大小。

在程序中是通过计算出最合适的

空间(存空间与作业大小之差最小)分配给当前作业。

如图,在作业,大小为4.在图中可以看出使用最佳适应算法,存空间2与之最为合适.故将存空间2分配给作业2.在存空间的分配图也可以看得出来存空间2被作业2占用。

分配失败:

由于申请的作业3其大小超过了每一个存空间的大小。

故分配失败。

存释放:

存空间释放,先输入要释放的存空间对应的任务号。

然后通过查找出对应的存空间,将其信息修改为空闲,作业号改为0.说明该存空间被释放。

五、总结体会

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

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

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

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

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

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2