ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:214.82KB ,
资源ID:6667380      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6667380.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(OS课程设计模拟内存分配算法MFC实现.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

OS课程设计模拟内存分配算法MFC实现.docx

1、OS课程设计模拟内存分配算法MFC实现课程设计报告 设计题目:内存的连续分配算法 班级 : 1003 学号: 211011023 姓名: 指导老师: 设计时间: 2012年8月摘要1、 主要算法包括:固定分区分配、动态分区分配、伙伴算法、可重定位分区分配。2、内容要求:1)定义与算法相关的数据结构,如PCB,空闲分区表;2)至少实现两种以上分配算法,且用户可以选择在某次执行过程中使用何种算法;3)在使用动态分区分配或可重定位分区分配算法时必须实现紧凑和对换功能;4)动态分区分配和可重定位分区分配必选一个实现。本系统模拟了操作系统内存分配算法的实现,实现了固定分区分配和动态分区分配,以及可重定位

2、分区分配算法,采用PCB定义结构体来表示一个进程,定义了进程的名称和大小,进程内存起始地址和进程状态。内存分区表采用单链表来模拟实现。关键词:固定分区分配、动态分区分配、可重定位分区分配。目录1. 概述 .42. 课程设计任务及要求 2.1 设计任务 .4 2.2 设计要求 .43. 算法及数据结构 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 程

3、序说明(代码) 4.3 实验结果 .95. 结论 .106. 参考文献。 .107. 收获、体会和建议。 .10一:概述本系统模拟了操作系统内存分配算法的实现,实现了固定分区分配和动态分区分配,以及可重定位分区分配算法,采用PCB定义结构体来表示一个进程,定义了进程的名称和大小,进程内存起始地址和进程状态。内存分区表采用单链表来模拟实现。固定分区实现就是将单链表的每个节点的大小设为固定大小,系统默认如果按固定分区分配的话,只能分成20个相等大小的分区,因此系统只能最多运行20个进程。动态分区的实现是根据进程所申请的内存大小来决定动态的有系统进行分配内存空间大小,因此分区表里的空闲分区个数是不定

4、的,根据进程数和进程大小决定的。可重定位分区算法比动态分区算法增加了紧凑和进程对换的功能。二:课程设计任务及要求设计任务:使用C+ MFC实现模拟操作系统内存分配算法的实现,定义结构体数据结构表示进程,定义单链表表示内存分区表。设计要求:定义与算法相关的数据结构,如PCB,空闲分区表;至少实现两种以上分配算法,且用户可以选择在某次执行过程中使用何种算法;在使用动态分区分配或可重定位分区分配算法时必须实现紧凑和对换功能;动态分区分配和可重定位分区分配必选一个实现。三:算法及数据结构#define free 0 /表示进程状态空闲#define busy 1 /表示进程状态忙typedef int

5、 Status; /表示进程状态struct PCB /表示进程PCB结构体 CString name; /进程name Status status; /进程状态busy or free int lStartAddres; /进程起始地址 int Size; /进程大小;struct Node /表示组成链表的结点结构体 PCB data; Node *next;class Queue /表示分区表的单链表类public: Queue(); Queue() /void Show(); /内存区分配情况显示 int GetLength(); int GetAllFree(); /获得所有空闲分区

6、总大小 void InitialMemory(int ); /初始化内存区域大小 void FixedPartitonAlloc(); /固定分区分配初始化空闲内存链表 bool AllocProFixed(CString ,int ); /为进程分配内存(执行固定分区分配算法) bool AllocProDynamic(CString ,int ); /为进程分配内存(动态分区分配) bool FreeMemory(CString ); /释放进程内存 bool AllMerge(int ); /内存紧凑分区算法 bool Swaping(int ,PCB&); /进程对换算法 Node *

7、GetFirst(); /返回头结点 void Clear(); /链表节点清除private: Node *first; ;#include StdAfx.h#include Queue.hQueue:Queue() /默认头结点数据 first = new Node; first-data.lStartAddres=0; first-data.name=; first-data.Size=0; first-data.status=busy; first-next=NULL;int Queue:GetLength() int n=0; Node *p=first; while(p-next)

8、 p=p-next; n+; return n;Node *Queue:GetFirst() return first;int Queue:GetAllFree() int n=0; Node *p=first; while(p-next) p=p-next; if (p-data.status=free) n+=p-data.Size; return n;/void Queue:Show()/ Node *p=first;/ while(p-next)/ / p=p-next;/ cout分区号:data.nameendl;/ cout分区状态:data.status=busy ?busy:

9、free)endl;/ cout分区起始地址:data.lStartAddresendl;/ cout分区大小:data.Sizeendl;/ coutdata=tmp; first-next=s; s-next=NULL;void Queue:Clear() Node *q; Node *p=first-next; while(p-next) q=p; p=p-next; delete q; void Queue:FixedPartitonAlloc() PCB tmp; int AllSize=first-next-data.Size; int perSize=AllSize/20; fi

10、rst-next-data.Size=perSize; Node *p= first; for (int i=1;inext) p=p-next; tmp.name=; tmp.status=free; tmp.lStartAddres=i*perSize+1; tmp.Size=perSize; Node *s= new Node; s-data=tmp; p-next=s; s-next=NULL; bool Queue:AllocProFixed(CString _name,int _size) PCB tmp; Node *p= first; while(p-next) p=p-nex

11、t; if (p-data.Size=_size&p-data.status=free) p-data.name=_name; p-data.status=busy; return true; return false;void Queue:SortList() Node *p=NULL; Node *q=NULL; for(p=first-next;p-next;p=p-next) for (q=p-next;q;q=q-next) if (p-data.Sizeq-data.Size) PCB tmp; tmp=p-data; p-data=q-data; q-data=tmp; /动态分

12、区分配算法 (最佳适应算法)bool Queue:AllocProDynamic(CString _name,int _size) Node *p=first; Node *q=NULL; /用来记录最佳插入点位置 int ch=0; /用来记录最小碎片值 while(p-next) p=p-next; /分区大小正好和进程大小相等 if (p-data.status=free&p-data.Size=_size) p-data.name=_name; p-data.status=busy; return true; if (p-data.status=free&p-data.Size_siz

13、e) ch=p-data.Size-_size; q=p; break; /* /分区大小大于进程大小,分割分区,并按大小分区排序 if (p-data.Size_size&p-data.status=free) Node *s=new Node; int tmp=p-data.Size-_size; if (tmp_size) s-data.lStartAddres=p-data.lStartAddres; s-data.Size=_size; s-data.name=_name; s-data.status=busy; p-data.lStartAddres+=_size; p-data.

14、Size=tmp; s-next=q-next; q-next=s; SortList(); /对分区链表进行按大小有小到大排序 return true; else s-data.lStartAddres=p-data.lStartAddres+tmp; s-data.name=_name; s-data.Size=_size; s-data.status=busy; p-data.Size=tmp; s-next=p-next; p-next=s; SortList(); /对分区链表进行按大小有小到大排序 return true; */ while(p) if (p-data.status

15、=free&p-data.Size=_size) if (p-data.Size-_sizedata.Size-_size; q=p; p=p-next; if(q=NULL) return false; else Node *s=new Node; s-data.lStartAddres=q-data.lStartAddres+ch; s-data.name=_name; s-data.Size=_size; s-data.status=busy; q-data.Size=ch; s-next=q-next; q-next=s; return true; bool Queue:FreeMem

16、ory(CString _name) Node *p=first; Node *q; while(p-next) q=p; p=p-next; if (p-data.name=_name) p-data.name=; p-data.status=free; /进行相邻分区合并 if (q-data.status=free) q-data.Size+=p-data.Size; q-next=p-next; /判断是否为链表尾 if (p-next!=NULL) if (p-next-data.status=free) p-data.Size+=p-next-data.Size; p-next=p

17、-next-next; return true; return false;bool Queue:AllMerge(int _size) Node *p=first; Node *q; int sum=0; bool flag=true; /标志是否为第一次找到free分区 while(p-next) while(p-next) q=p; p=p-next; if (p-data.status=free&flag) sum=p-data.Size; q-next=p-next; flag=false; break; if (!flag&p-data.status=busy) /对数据进行重定位

18、 p-data.lStartAddres-=sum; if (p-data.status=free&!flag) p-data.Size+=sum; /对数据进行重定位 p-data.lStartAddres-=sum; if (p-data.Size=_size) return true; q-next=p-next; sum=p-data.Size; break; while(p) q=p; p=p-next; if (p-data.status=free) p-data.Size+=sum; /对数据进行重定位 p-data.lStartAddres-=sum; if (p-data.S

19、ize_size) return true; q-next=p-next; sum=p-data.Size; break; else /对数据进行重定位 p-data.lStartAddres-=sum; return false;bool Queue:Swaping(int needSize ,PCB &pro) Node *p=first; /Node *q; while(p-next) p=p-next; if (p-data.Size=needSize) pro=p-data; p-data.name=; p-data.status=free; return true; return

20、false;四:程序设计与实现。流程图固定分区分配流程图: 默认1000KB内存大小 总共分为20个相等大小分区 动态分区分配算法:可重定位分区分配算法:实验结果:五:收获,体会和建议此次课程设计让我进一步加深了对操作系统内存分配算法的的理解,此次试验自己花了不少时间研究课本和课外资料,在写可重定位分区分配算法遇到了内存紧凑算法方面的难题,如何对内存剩余空间大小进行紧凑利用,花了好些时间不断的实验,不断的调试代码,最后终于写好了,并加以测试代码的健壮性,完成并测试了本次操作系统课程设计。期间虽然遇到了很多困难,但自己最后因为这些困难而收获到了不少知识,加强了自己动手写代码的能力,对代码调式技术进一步掌握,对操作系统也产生了更浓厚的兴趣,自己一定还要多花时间研究操作系统,争取进一步理解操作系统并能够将优秀算法加以运用到自己以后的代码中。六:参考资料和书籍。Visual C+深入讲解 孙鑫计算机操作系统 汤子瀛C+程序设计 谭浩强PS:如果程序不能正确编译成功,请换用VS2008编译,并尝试删除Debug目录下的.pch文件

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

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