1、并模拟实现分区的分配和回收过程。 2. 必须建立分区表,记录空闲区与占用区的状况。3. 流程图按选定的算法自己完成。三、 算法设计的思想或流程图 本系统将存用户空间划分为五个大小不固定的分区,其分区大小由用户输入决定。在每个分区只装入一道作业,这样把用户空间划分为几个分区,便允许几道作业并发运行。当有一个空闲分区时,便可以从外存的后备队列中选择一个适当大小的作业装入该分区,当该作业结束时又可以从后备作业队列中找出另一作业调入该分区。每个存空间是一个Node型的对象。Node类有一个三个参数的构造函数。分别为:分区号、起始地址、大小。然后就是一些属性的get、set方法和一个打印其属性的函数。四
2、个数据域分别为:属性m_No用来表示该存空间的序号。属性m_Addr用来表示存分区的起始地址。属性m_Size用来表示存空间的大小。属性m_State表示存空间的是否已分配的状态标志。若该存空间已分配,m_TaskNo表示占有该存空间的任务序号。否则没有实际意义。在用户申请任务的存空间时,提示用户输入任务号和其需要的存空间大小。流程图主程序: Y N N 检查该任务号是否已经存在,或该任务大小是否超过100提示用户输入作业名和作业占的内存大小该任务号已经存在或该任务大小否超过100temp2赋值为第i个内存空间大小与申请的内存空间大小只差开始初值为0的变量i,是否小于节点队列大小第i个内存空闲
3、并且其大小大于作业申请的大小Temp1temp2?分配存空间算法:申请失败Temp1=temp2.保存内存空间号到No将内存空间No置为占有,并将作业分配给它No=-1?结束打印出内存空间信息i+ N Y释放存空间算法释放失败保存内存空间号到No将内存空间No置为空闲四、算法设计的实现1、类设计本程序设计了两个比较简单的类:Node类和MManage类。Node类主要是存放每个固定分区的一些信息。而MManage类则主要是对Node类的容器List进行一些操作来实现要求的存空间的的分配和释放。类设计的数据成员和接口如下:Node.h#ifndef NODE_H#define NODE_Hcla
4、ss Nodepublic: 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;#
5、endif /NODE_HMManage.h#ifndef MMANAGE_H#define MMANAGE_H#include class Node;class MManage /MManage(); MManage(int MLength); MManage(std:vector#include Node.hNode: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
6、 = TaskNo;setState(bool State) m_State = State;print()cout| m_No | m_Addrm_Size; if(m_State) std:Idle |std:endl; elseOccupy | m_TaskNo |MManage.cppMManag.h#define MAXSIZE 100/class Node;/*MManage:MManage() int sum;cout sum; MManage(sum);*/MManage:MManage(int MNo) int size; int addr = 0; char yesOrNo
7、 = n while ( yesOrNo != y & yesOrNo !Y) m_Nodes.clear();Start to init the memory table for (int i=0; iMNo; +i) do std:Please input the size of i+1 = MAXSIZE); Node node(i+1, addr, size); m_Nodes.push_back(node); addr+=size; print();Is this correct? yesOrNo;MManage(std: Nodes) m_Nodes.assign(Nodes.be
8、gin(), Nodes.end();void MManage:MAlloc() int taskNo, size; int No = -1; int temp1 = MAXSIZE; int temp2 = MAXSIZE; bool flag; do flag=false;Please input the task No. and size taskNo for(unsigned i=0;m_Nodes.size(); if(m_Nodesi.getTaskNo() = taskNo) This task areally exist,please change it flag = true
9、; if(size MAXSIZE)The size is too big,please change it while(flag); for(unsigned i=0; if(m_Nodesi.getState()&m_Nodesi.getSize()=size) temp2 = m_Nodesi.getSize() - size; if(temp2swt; if(swt!=1&swt!=2)error iput,please put(1、2) switch(swt) case 1: m.MAlloc(); break; case 2: m.MFree(); default: printf(
10、exception ouccern return 1; m.print();Do you like to continue? swt = 0;四、 运行结果与分析手工输入每个分区的大小来初始化分区表:分析:在手工输入每个存空间的大小后,立即调用打印的函数将存空间的情况打印出来。让用户确定自己输入是否正确。分配成功:申请存空间。首先得输入作业号与作业大小。在程序中是通过计算出最合适的空间(存空间与作业大小之差最小)分配给当前作业。如图,在作业,大小为4.在图中可以看出使用最佳适应算法,存空间2与之最为合适.故将存空间2分配给作业2.在存空间的分配图也可以看得出来存空间2被作业2占用。分配失败:由于申请的作业3其大小超过了每一个存空间的大小。故分配失败。存释放:存空间释放,先输入要释放的存空间对应的任务号。然后通过查找出对应的存空间,将其信息修改为空闲,作业号改为0.说明该存空间被释放。五、 总结体会通过此次试验加深了对操作系统存储管理功能中的固定分区管理方式、主存分配表等相应知识的理解。对操作系统怎样实现存储管理有了初步的认识。固定分区的优势是实现简单,只需要极少的操作系统开销。它也有很多的缺点,例如:有部碎片,对存的使用不充分、活动进程的最大数目是固定的等。