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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

操作系统课程设计.docx

1、操作系统课程设计课程设计任务书学生姓名: 专业班级: 指导教师: 工作单位: 计算机科学与技术学院 题 目: 动态分区管理的主存分配模拟设计-最先适应法、最差适应法初始条件:1预备内容:阅读操作系统的内存管理章节内容,理解动态分区的思想,并体会各分配算法的具体实施方法。2实践准备:掌握一种计算机高级语言的使用。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1采用指定算法模拟动态分区管理方式的主存分配。能够处理以下的情形: 随机出现的进程i申请jKB内存,程序能判断是否能分配,如果能分配,要求输出分配的首地址Faddress,并要求输出内存使用情况和空闲情况。

2、内存情况输出的格式为:Faddress该分区的首地址;Eaddress该分区的尾地址Len 分区长度;Process 如果使用,使用的进程号,否则为0 主存分配函数实现寻找空闲区、空闲区表的修改、已分配区表的修改功能;2设计报告内容应说明: 需求分析; 功能设计(数据结构及模块说明); 开发平台及源程序的主要部分; 测试用例,运行结果与运行情况分析; 自我评价与总结:)你认为你完成的设计哪些地方做得比较好或比较出色;)什么地方做得不太好,以后如何改正;)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);)完成本题是否有其他方法(如果有,简要说明该方法);)对实验题的评价和改进意见,请

3、你推荐设计题目。时间安排:设计安排一周:周1、周2:完成程序分析及设计。周2、周3:完成程序调试及测试。周4、周5:验收、撰写课程设计报告。(注意事项:严禁抄袭,一旦发现,一律按0分记)指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日目录封面.(1)课程设计任务书.(2)1.需求分析.(4)2.功能设计.(5) 2.1.数据结构.(5) 2.2.模块说明.(6) 2.2.1最先适应法(first-fit).(6) 2.2.2最坏匹配法(worst-fit).(8)3.开发平台及源程序的主要部分.(9)4.测试用例,运行结果与运行情况分析.(16) 4.1.最先适应法.(16)

4、4.2最坏适应法.(19)5.自我评价与总结.(23)6.参考文献.(24)1.需求分析在科技高速发展的今天,计算机早已成为人类的常用现代工具,每一个人都应该了解计算机,学会使用计算机,并用它来处理面临的事务。对于一台完全无软件的计算机系统,即使功能再强,也必定是难于使用的。所以在计算机上覆盖了OS后,便可获的一台功能显著使用极为方便的计算机。因此操作系统是最重要的计算机系统软件,而进程调度是操作系统中最核心的内容。存储器是计算机的重要组成部分,存储空间是操作系统管理的宝贵资源,虽然其容量在不断扩大,但仍然远远不能满足软件发展的需要。对存储资源进行有效的管理,不仅关系到存储器的利用率,而且还对

5、操作系统的性能和效率有很大的影响。操作系统的存储管理的基本功能有:存储分配、地址转换和存储保护、存储共享、存储扩充。存储分配指为选中的多道运行的作业分配主存空间;地址转换是把逻辑地址空间中的用户程序通过静态重定位或动态重定位转换和映射到分给的物理地址空间中,以便用户程序的执行;存储保护指各道程序只能访问自己的存储区域,而不能互相干扰,以免其他程序受到有意或无意的破坏;存储共享指主存中的某些程序和数据可供不同用户进程共享。最简单的单道系统中,一旦一个程序能装入主存,它将一直运行直到结束。如果程序长度超出了主存的实际容量,可以通过覆盖和交换的技术获得解决。更多的操作系统支持多个用户进程在主存同时执

6、行,能满足多道程序设计需要的最简单的存储管理技术是分区方式,有分固定分区和可变分区。可变分区的分配(如图(1)所示)算法包括:最先适应、下次适应、最佳适应、最坏适应和快速适应等分配算法。图(1)动态内存分配采用分区方式管理存储器,每道程序总是要求占用主存的一个或几个连续的存储区域,主存中会产生许多碎片。因此,有时为了接纳一个新的作业而往往要移动已在主存的信息,这不仅不方便,而且开销不小。现代计算机都有某种虚存硬设备支持,简单也是常用的虚存是请求分页式虚存管理,于是允许把一个进程的页面存放到若干不相邻的主存页框中。从搜索速度上看,最先适应算法具有最佳性能。并且从回收过程来看,最先适应法也是最佳的

7、。它的另一个优点就是尽可能地利用了低地址空间。从而保证高地址有较大的空闲区来放置要求内存过多的进程或作业。最坏适应法是基于不留下碎片空闲区这一出发点的。它选择最大的空闲区来满足用户要求,以期分配后的剩余部分仍能再分配。本课程设计就是分析动态分区法,与固定分区法相比,动态分区法在作业执行前并不建立分区,分区的建立是在作业的处理过程中进行的。且其大小可随作业或进程对内存的要求而改变分区的建立是在作业的处理过程中进行的。且其大小可随作业或进程对内存的要求而改变。这就改变了固定分区法中那种即使是小作业也要占据大分区的浪费现象,从而提高了内存的利用率。2.功能设计2.1数据结构最先适应法和最差适应法都采

8、取了相同的数据结构:设计了两个数据结构:进程类process: class process public: process(void); int getnumber(); int getsize(); process(void); private: int i; /进程号 int size; /进程大小;process:process(void) i=nrand(50); size=nrand(110)+1;进程号是049的随机数,进程大小是1110的随机数。进程的图形类似图(2)所示:图(2)进程的结构图分区类memory: class memorypublic: memory(void);

9、 memory(int a1,int a2,int a3,int a4); int getnumber(); void setnumber(int z); int getprocessnumber(); void setprocessnumber(int x); int getFaddress(); void setFaddress(int t); int getlen(); void setlen(int y); memory(void);private: int number; int processnumber; int Faddress; int len;分区单元类memory里有4个

10、数据成员,分别为:number(分区号)、processnumber(此分区内的进程号)、Faddress(分区的首地址)、len(分区的长度),由此可得分区尾地址Eaddress(分区的尾地址)。内存分配表的图类似与图(3)所示:图(3)内存使用情况2.2模块说明2.2.1最先适应法(first-fit) 按分区起始地址的递增次序,从头查找,找到符合要求的第一个分区。该算法的分配和释放的时间性能较好,一旦找到大于或等于所要求内存长度的分区,则结束探索。for(int i=1;i!=50;i+) process pr; int p=tablei-1.getFaddress()+pr.getsi

11、ze(); int n=nrand(100); int j=nrand(3); tablei=memory(i+1,(i+1)*j,p,n); 采用随机产生的进程process pr来初始化内存,一共产生了50个进程他们将对内存的所有内存单元进行初始化。当j=0时,则(i+1)*j=0,即此内存单元的进程号为“0”,按任务书的标准这代表该内存单元空闲。由于j=nrand(3),故j=0的概率为33.3%。即内存中有33.3%的单元是空闲的。 cout区号 进程号 首地址 尾地址 长度endl; for(int i=0;i!=50;i+) couttablei.getnumber()ttable

12、i.getprocessnumber() ttablei.getFaddress()ttablei.getFaddress() +tablei.getlen()ttablei.getlen()endl; 该语句是输出初始化后内存单元的使用情况。choice=create模块是进行创建一个随机进程,并按照最先适应法的要求,对内存单元进行查找。当第一个找到满足要求的内存单元即用该内存单元存放该进程。并建立一个内存单元的对象 memory mtemp用于保存该内存单元除了进程部分所剩下的内存单元,并将该内存单元的剩余部分仍保留在内存中。该模块完成的功能如图(4)所示:图(4)进程进入内存choice

13、=inquire模块对内存单元的使用情况输出。choice=empty模块是将内存单元中进程号processnumber=0的内存单元全部保存到空闲区表emptytab中,并将该表中的内容输出。choice=full模块是将内存单元中进程号processnumber!=0的内存单元全部保存到已分配区表fulltab中,并将该表中的内容输出。最先适应法流程如图(5)所示:图(5)最先适应算法流程2.2.2最坏匹配法(worst-fit) 按分区大小的递减次序,从头查找,找到符合要求的第一个分区。找到最大的空闲分区。大部分模块和最先适应法是相同的。现只对create模块和empty模块说明。cho

14、ice=create模块创建一个进程,然后将内存单元的空闲单元保存到容器emptytab1中,并对emptytab1按内存单元从大到小进行排列,然后将进程的大小size和空闲区表emptytab1中的第一个内存单元比较,当size小于第一个内存单元的大小,则进行分配,并建立一个内存单元的对象 memory mtemp用于保存该内存单元除了进程部分所剩下的内存单元,并将该内存单元的剩余部分仍保留在内存中。当size大于第一个内存单元的大小,则输出超出可用表第一项长度,无法分配!。choice=empty模块是将内存单元的空闲单元保存到容器emptytab中,并对empty按内存单元从大小进行排列

15、,并将空闲区表输出。这两个模块实现的功能如图(6)所示:图(6)最差适应法内存分配3.开发平台及源程序的主要部分3.1开发平台 采用visual studio 2008 C+的控制台应用程序进行开发。3.2源程序的主要部分3.2.1进程类的头文件与实现/进程类process.h#include class processpublic: process(void); int getnumber(); int getsize(); process(void);private: int i; /进程号 int size; /进程大小;int nrand(int n);/进程类process.cpp#

16、include process.h#includeusing std:domain_error;process:process(void) i=nrand(50); size=nrand(110)+1;process:process(void)int process:getnumber() return i;int process:getsize() return size;int nrand(int n) if(nRAND_MAX) throw domain_error(Argument to nrand is out of range);const int bucket_size=RAND

17、_MAX/n; int r; do r=rand(); while(r=n); return r;3.2.2分区类的头文件与实现/分区类memory.h#pragma once#include class memorypublic: memory(void); memory(int a1,int a2,int a3,int a4); int getnumber(); void setnumber(int z); /设置该分区的区号 int getprocessnumber(); void setprocessnumber(int x); /设置占用该分区的进程号 int getFaddress

18、(); void setFaddress(int t); /设置该分区的首地址 int getlen(); void setlen(int y); memory(void);private: int number; int processnumber; int Faddress; int len;/分区类memory.cpp#include memory.hmemory:memory(void)memory:memory(int a1,int a2,int a3,int a4) number=a1; processnumber=a2; Faddress=a3; len=a4;int memor

19、y:getnumber() return number;void memory:setnumber(int z) number=z;int memory:getprocessnumber() return processnumber;void memory:setprocessnumber(int x) processnumber=x;int memory:getFaddress() return Faddress;void memory:setFaddress(int t) Faddress=t;int memory:getlen() return len;void memory:setle

20、n(int y) len=y;memory:memory(void)3.2.3最先适应法/ * 最先适应法,先创建一个随机进程p,再逐个遍历内存单元,如果发现该内 * 存单元是空闲的并且它的大小比进程申请长度大,则对它进行分配。 */create模块 if(choice=create) process p; cout创建的进程号为:p.getnumber() 申请内存大小为:p.getsize()endl; for(vector:iterator iter=distable.begin();iter!=distable.end();+iter) if(iter-getprocessnumber

21、()=0&iter-getlen()=p.getsize() iter-setprocessnumber(p.getnumber();/修改该内存单元的进程号 int temp2=iter-getlen(); /将内存单元的长度保存 iter-setlen(p.getsize(); /将内存单元的长度改为进程申请的长度 memory mtemp; /临时对象保存剩余内存单元 int temp1=iter-getnumber(); /保存内存单元的分区号 int temp=iter-getFaddress(); /保存内存单元的首地址 mtemp.setnumber(temp1); /设置临时对

22、象的分区号 mtemp.setprocessnumber(0); /设置临时单元的进程号 mtemp.setFaddress(temp+p.getsize();/设置临时单元的首地址 mtemp.setlen(temp2-p.getsize();/设置临时单元的长度 +iter; if(mtemp.getlen()!=0) /如果临时单元长度不为零 distable.insert(iter,mtemp);/将临时单元保存到内存中 cout分配的区号:temp1 分配的首地址:tempendl; break; if(+iter=distable.end() /如果已经到了内存中最后一个内存单元

23、cout超出最大空闲区,无法分配!endl; -iter; /*inqurie模块对内存单元情况进行输出 */ if(choice=inquire) cout区号 进程号 首地址 尾地址 长度endl; for(vector:iterator iter=distable.begin();iter!=distable.end();+iter) coutgetnumber()tgetprocessnumber() tgetFaddress()tgetFaddress()+iter-getlen()tgetlen()endl; /*full模块对进程号不为零的单元进行输出 */ if(choice=

24、full) vector fulltab; for(vector:iterator iter=distable.begin();iter!=distable.end();+iter) if(iter-getprocessnumber()!=0) fulltab.push_back(*iter); cout 已分配区表endl; cout区号 进程号 首地址 尾地址 长度endl; for(vector:iterator iter=fulltab.begin();iter!=fulltab.end();+iter) coutgetnumber()tgetprocessnumber() tgetF

25、address()tgetFaddress()+iter-getlen()tgetlen()endl; 3.2.4最坏适应法/*create模块先将processnumber=0的分区保存到空闲区表emptytab1中,然 *后对emptytab1按长度从大到小排列,再将内存单元中是空闲区的和emptytab1 *表中的第一个元素分配给进程p*/if(choice=create) process p; cout创建的进程号为:p.getnumber() 申请内存大小为:p.getsize()endl; vector emptytab1; for(vector:iterator iter=dis

26、table.begin();iter!=distable.end();+iter) if(iter-getprocessnumber()=0) emptytab1.push_back(*iter); sort(emptytab1.begin(),emptytab1.end(),compare); for(vector:iterator iter=distable.begin();iter!=distable.end();+iter) if(iter-getprocessnumber()=0&iter-getnumber()=emptytab1.begin()-getnumber()&empty

27、tab1.begin()-getlen()=p.getsize() iter-setprocessnumber(p.getnumber(); int temp2=iter-getlen(); iter-setlen(p.getsize(); memory mtemp; int temp1=iter-getnumber(); int temp=iter-getFaddress(); mtemp.setnumber(temp1); mtemp.setprocessnumber(0); mtemp.setFaddress(temp+p.getsize(); mtemp.setlen(temp2-p.getsize(); +iter; if(mtemp.getlen()!=0) distable.insert(iter,mtemp);

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

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