1、 3.1算法的总体思想(流程) 5 3.2 PCB模块 3.2.1 功能(运算) .53.2.2 数据结构(存储结构) .5 3.2.3 算法(实现) .5 3.3 进程队列模块 3.3.1功能 63.3.2 数据结构 6 3.3.3算法 64. 程序设计与实现 4.1 程序流程图 .7 4.2 程序说明(代码) 4.3 实验结果 .95. 结论 .106. 参考文献。 .107. 收获、体会和建议。 .10一:概述本系统模拟了操作系统内存分配算法的实现,实现了固定分区分配和动态分区分配,以及可重定位分区分配算法,采用PCB定义结构体来表示一个进程,定义了进程的名称和大小,进程内存起始地址和进
2、程状态。固定分区实现就是将单链表的每个节点的大小设为固定大小,系统默认如果按固定分区分配的话,只能分成20个相等大小的分区,因此系统只能最多运行20个进程。动态分区的实现是根据进程所申请的内存大小来决定动态的有系统进行分配内存空间大小,因此分区表里的空闲分区个数是不定的,根据进程数和进程大小决定的。可重定位分区算法比动态分区算法增加了紧凑和进程对换的功能。二:课程设计任务及要求设计任务:使用C+ MFC实现模拟操作系统内存分配算法的实现,定义结构体数据结构表示进程,定义单链表表示内存分区表。设计要求:定义与算法相关的数据结构,如PCB,空闲分区表;至少实现两种以上分配算法,且用户可以选择在某次
3、执行过程中使用何种算法;在使用动态分区分配或可重定位分区分配算法时必须实现紧凑和对换功能;动态分区分配和可重定位分区分配必选一个实现。三:算法及数据结构#define free 0 /表示进程状态空闲#define busy 1 /表示进程状态忙typedef int Status; /表示进程状态struct PCB /表示进程PCB结构体 CString name; /进程name Status status; /进程状态busy or free int lStartAddres; /进程起始地址 int Size; /进程大小;struct Node /表示组成链表的结点结构体 PCB
4、data; Node *next;class Queue /表示分区表的单链表类public: Queue(); Queue() /void Show(); /内存区分配情况显示 int GetLength(); int GetAllFree(); /获得所有空闲分区总大小 void InitialMemory(int ); /初始化内存区域大小 void FixedPartitonAlloc(); /固定分区分配初始化空闲内存链表 bool AllocProFixed(CString ,int ); /为进程分配内存(执行固定分区分配算法) bool AllocProDynamic(CStr
5、ing ,int ); /为进程分配内存(动态分区分配) bool FreeMemory(CString ); /释放进程内存 bool AllMerge(int ); /内存紧凑分区算法 bool Swaping(int ,PCB&); /进程对换算法 Node *GetFirst(); /返回头结点 void Clear(); /链表节点清除private: Node *first;#include StdAfx.hQueue.hQueue:Queue() /默认头结点数据 first = new Node; first-data.lStartAddres=0;data.name=;dat
6、a.Size=0;data.status=busy;next=NULL;int Queue:GetLength() int n=0; Node *p=first; while(p-next) p=p-next; n+; return n;Node *Queue:GetFirst() return first;GetAllFree() if (p-data.status=free) n+=p-data.Size; /void Queue:Show()/ Node *p=first;/ while(p-/ / p=p-/ coutdata.namedata.status=busy ?busyfre
7、e)分区起始地址:data.lStartAddres分区大小:data.Sizedata=tmp;next=s;Clear() Node *q; Node *p=first- q=p; delete q;FixedPartitonAlloc() int AllSize=first-next- int perSize=AllSize/20;data.Size=perSize; Node *p= first; for (int i=1;i p=p- tmp.name= tmp.status=free; tmp.lStartAddres=i*perSize+1; tmp.Size=perSize;
8、Node *s= new Node; s- p-bool Queue:AllocProFixed(CString _name,int _size)data.Size=_size& p-data.name=_name; return true; return false;SortList() Node *p=NULL; Node *q=NULL; for(p=first-p=p- for (q=p-q;q=q- if (p-q-data.Size) PCB tmp; tmp=p-data; p-data=q- q- /动态分区分配算法 (最佳适应算法)AllocProDynamic(CStrin
9、g _name,int _size) /用来记录最佳插入点位置 int ch=0; /用来记录最小碎片值 /分区大小正好和进程大小相等data.status=free&data.Size=_size)_size) ch=p-data.Size-_size; q=p; break; /* /分区大小大于进程大小,分割分区,并按大小分区排序_size& Node *s=new Node; int tmp=p- if (tmp s-data.lStartAddres=p-data.lStartAddres;data.Size=_size;data.lStartAddres+=_size;data.S
10、ize=tmp;next=q- SortList(); /对分区链表进行按大小有小到大排序 return true; elsedata.lStartAddres+tmp;next=p- */ while(p)=_size)data.Size-_size q=p; if(q=NULL) return false; else Node *s=new Node;data.lStartAddres=q-data.lStartAddres+ch; q-data.Size=ch; return true;FreeMemory(CString _name)data.name=_name)data.statu
11、s=free; /进行相邻分区合并 if (q-data.Size+=p- /判断是否为链表尾next!=NULL) if (p- p- AllMerge(int _size) int sum=0; bool flag=true; /标志是否为第一次找到free分区 while(p- p=p-flag) sum=p- q- flag=false; break; if (!flag&data.status=busy) /对数据进行重定位data.lStartAddres-=sum;!data.Size+=sum; if (p- return true; while(p) elseSwaping(
12、int needSize ,PCB &pro) /Node *q;=needSize) pro=p-四:程序设计与实现。流程图固定分区分配流程图: 默认1000KB内存大小 总共分为20个相等大小分区 动态分区分配算法:可重定位分区分配算法:实验结果:五:收获,体会和建议此次课程设计让我进一步加深了对操作系统内存分配算法的的理解,此次试验自己花了不少时间研究课本和课外资料,在写可重定位分区分配算法遇到了内存紧凑算法方面的难题,如何对内存剩余空间大小进行紧凑利用,花了好些时间不断的实验,不断的调试代码,最后终于写好了,并加以测试代码的健壮性,完成并测试了本次操作系统课程设计。期间虽然遇到了很多困难,但自己最后因为这些困难而收获到了不少知识,加强了自己动手写代码的能力,对代码调式技术进一步掌握,对操作系统也产生了更浓厚的兴趣,自己一定还要多花时间研究操作系统,争取进一步理解操作系统并能够将优秀算法加以运用到自己以后的代码中。六:参考资料和书籍。Visual C+深入讲解 孙鑫计算机操作系统 汤子瀛C+程序设计 谭浩强PS:如果程序不能正确编译成功,请换用VS2008编译,并尝试删除Debug目录下的.pch文件
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1