当前位置:文档之家› 固定分区存储管理

固定分区存储管理

理工大学信息工程与自动化学院学生实验报告( 2013 —2014 学年第一学期)课程名称:操作系统开课实验室:信自楼444 2013年 11月28 日注:报告容按下列的要求进行。

一、实验目的通过编写固定分区存储管理的模拟程序,加深对操作系统存储管理功能中的固定分区管理方式、主存分配表等相应知识的理解。

通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉可变分区存储管理的存分配和回收。

二、实验题目1.设计一个固定分区分配的存储管理方案。

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

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

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

三、算法设计的思想或流程图本系统将存用户空间划分为五个大小不固定的分区,其分区大小由用户输入决定。

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

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

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

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

分别为:分区号、起始地址、大小。

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

四个数据域分别为:属性m_No用来表示该存空间的序号。

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

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

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

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

否则没有实际意义。

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

流程图主程序:分配存空间算法:释放存空间算法四、算法设计的实现1、类设计本程序设计了两个比较简单的类:Node类和MManage类。

Node类主要是存放每个固定分区的一些信息。

而MManage类则主要是对Node类的容器List<Node>进行一些操作来实现要求的存空间的的分配和释放。

类设计的数据成员和接口如下:Node.h#ifndef NODE_H#define NODE_Hclass Node{public:Node(int No, int Addr, int Size);int getSize() const{return m_Size;}bool getState() const{return m_State;}int getTaskNo() const{return m_TaskNo;}void setState(bool State);void setTaskNo(int TaskNo);void print();private:int m_No;int m_Addr;int m_Size;bool m_State;int m_TaskNo;};#endif //NODE_HMManage.h#ifndef MMANAGE_H#define MMANAGE_H#include <vector>class Node;class MManage{public://MManage();MManage(int MLength);MManage(std::vector<Node> Nodes);void MAlloc();void MFree();void print();private:std::vector<Node> m_Nodes;};#endif//MMANAGE_H类接口实现和main函数的实现:Node.cpp#include <iostream>#include "Node.h"Node::Node(int No, int Addr, int Size) :m_No(No),m_Addr(Addr),m_Size(Size) {m_State = true;m_TaskNo = 0;}void Node::setTaskNo(int TaskNo){m_TaskNo = TaskNo;}void Node::setState(bool State){m_State = State;}void Node::print(){std::cout<<"| "<<m_No<<" || "<<m_Addr<<" || "<<m_Size<<" || ";if(m_State)std::cout<<"Idle ||"<<std::endl;elsestd::cout<<"Occupy || "<<m_TaskNo<<" ||"<<std::endl;}MManage.cpp#include <iostream>#include "MManag.h"#include "Node.h"#define MAXSIZE 100//class Node;/*MManage::MManage(){int sum;std::cout << "Please input the number of memory:";std::cin >> sum;std::cout << std::endl;MManage(sum);}*/MManage::MManage(int MNo){int size;int addr = 0;char yesOrNo = 'n';while ( yesOrNo != 'y' && yesOrNo != 'Y'){m_Nodes.clear();std::cout << "Start to init the memory table" << std::endl;for (int i=0; i<MNo; ++i){do{std::cout << "Please input the size of " << i+1 << "th memory:";std::cin >> size;}while(size >= MAXSIZE);Node node(i+1, addr, size);m_Nodes.push_back(node);addr+=size;}print();std::cout << "Is this correct?" << std::endl;std::cin >> yesOrNo;}}MManage::MManage(std::vector<Node> Nodes){m_Nodes.assign(Nodes.begin(), Nodes.end());}void MManage::MAlloc(){int taskNo, size;int No = -1;int temp1 = MAXSIZE;int temp2 = MAXSIZE;bool flag;do{flag=false;std::cout << "Please input the task No. and size" << std::endl;std::cin >> taskNo >> size;for(unsigned i=0; i<m_Nodes.size(); ++i){if(m_Nodes[i].getTaskNo() == taskNo){std::cout<<"This task areally exist,please change it"<<std::endl;flag = true;}if(size > MAXSIZE){std::cout<<"The size is too big,please change it"<<std::endl;flag = true;}}}while(flag);for(unsigned i=0; i<m_Nodes.size(); ++i){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){std::cout << "Allocation fail." << std::endl;}else{std::cout << "Allocation success." << std::endl;m_Nodes[No].setState(false);m_Nodes[No].setTaskNo(taskNo);}}void MManage::MFree(){int taskNo,No=-1;std::cout << "Please input the task No." << std::endl;std::cin >> taskNo;for(unsigned i=0; i<m_Nodes.size(); ++i){if(m_Nodes[i].getTaskNo()==taskNo&&!m_Nodes[i].getState()){No = i;}}if(No==-1){std::cout << "Free fail(Can not find the task)." << std::endl;}else{std::cout << "Free success." << std::endl;m_Nodes[No].setState(true);m_Nodes[No].setTaskNo(0);}}void MManage::print(){std::cout << "The the memory table:" << std::endl;std::cout << "| No |" << "| Addr |" << "| Size |" << "| State |" << "| TaskNo |"<< std::endl;for (unsigned i=0; i<m_Nodes.size(); ++i)m_Nodes[i].print();}Main.cpp#include <iostream>#include "MManag.h"#include "Node.h"#define SIZE 5 //分配区的个数void testNode(){int size = 10;Node node1(1,0,size);node1.print();Node node2(2,size,size);node2.setState(false);node2.setTaskNo(1);node2.print();//MManage m1();//m1.print();MManage m2(2);m2.print();}int main(){MManage m(SIZE);char yesOrNo = 'y';int swt = 0;while(yesOrNo != 'n' && yesOrNo != 'N'){while(swt != 1 && swt != 2){system("cls");std::cout<<"=========================="<<std::endl;std::cout<<" Please put your choice:"<<std::endl;std::cout<<" 1--apply memory"<<std::endl;std::cout<<" 2--free memory"<<std::endl;std::cout<<"=========================="<<std::endl;std::cin>>swt;if(swt!=1&&swt!=2)std::cout<<"error iput,please put(1、2)"<<std::endl;}switch(swt){case 1: m.MAlloc();break;case 2: m.MFree();break;default:{printf("exception ouccer\n");return 1;}}m.print();std::cout<<"Do you like to continue?"<<std::endl;std::cin >> yesOrNo;swt = 0;}}四、运行结果与分析手工输入每个分区的大小来初始化分区表:分析:在手工输入每个存空间的大小后,立即调用打印的函数将存空间的情况打印出来。

相关主题