内存管理(操作系统)操作系统课程设计.doc

上传人:laozhun 文档编号:2392141 上传时间:2023-02-17 格式:DOC 页数:27 大小:758KB
返回 下载 相关 举报
内存管理(操作系统)操作系统课程设计.doc_第1页
第1页 / 共27页
内存管理(操作系统)操作系统课程设计.doc_第2页
第2页 / 共27页
内存管理(操作系统)操作系统课程设计.doc_第3页
第3页 / 共27页
内存管理(操作系统)操作系统课程设计.doc_第4页
第4页 / 共27页
内存管理(操作系统)操作系统课程设计.doc_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《内存管理(操作系统)操作系统课程设计.doc》由会员分享,可在线阅读,更多相关《内存管理(操作系统)操作系统课程设计.doc(27页珍藏版)》请在三一办公上搜索。

1、河南城建学院操作系统课程设计说明书设计题目: 存储管理 专 业: 计算机科学与技术 指导教师:班 级: 0814121 学 号: 081412112姓 名:同 组 人:计算机科学与工程学院2015 年 1 月 9日前言本课程设计是编制页面置换算法FIFO、LRU、LFU、NUR和OPT的模拟程序,并模拟其在内存的分配过程。同时根据页面走向,分别采用FIFO、LRU、LFU、NUR和OPT算法进行页面置换,统计命中率;同时系统可以随意设置当前分配给作业的物理块数。 系统运行时,任意输入一个页面访问序列,可以设定不同的页面置换算法和物理块数,输出其页面淘汰的情况,计算其缺页次数和缺页率。系统结束后

2、,比较同一个页面访问序列,可以得出在不同的页面置换算法和物理块数的情况下,其产生的缺页次数和缺页率。 使用FIFO算法,由于测试数据相同的页面比较少,所以采用FIFO算法时,需要置换的页面多,比较繁琐,没有优化效果,所以FIFO算法性能不好。使用LRU的算法,此组数据显示LRU的算法使用比较繁琐,总的来说,NUR、LFU、LRU算法介于FIFO和OPT之间。通过系统模拟得出,OPT算法的性能高,LRU、NUR、LRU算法的性能次之,FIFO的算法性能最差,较少应用;由于OPT算法在实际上难于实现,所以实际应用一般用LRU算法。 本程序实现了操作系统中页式虚拟存储管理中缺页中断理想型淘汰算法,该

3、算法在访问串中将来再也不出现的或是在离当前最远的位置上出现的页淘汰掉。这样,淘汰掉该页将不会造成因需要访问该页又立即把它调入的现象。该程序能按要求随机确定内存大小,随机产生页面数,进程数,每个进程的页数,给进程分配的页数等,然后运用理想型淘汰算法对每个进程进行计算缺页数,缺页率,被淘汰的序列等功能。目录一系统环境11.1硬件环境11.2软件环境1二设计目的2三总体设计33.1程序设计组成框图33.2流程图4四详细设计74.1模块功能说明74.11数据结构74.12函数定义84.13变量定义84.2算法分析8五调试与测试105.1调试方法105.11使用Vi编译程序105.12运行程序125.2

4、结果分析与讨论135.3测试问题及采取措施13六源程序14七心得体会23八参考文献24一系统环境1.1硬件环境PC机一台,0.99G内存,2.0GHZ主频1.2软件环境设计和实验将Windows环境下,gcc和虚拟机软件VMWare二 设计目的存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。本设计的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。要求:(1)通过随机数产生一个指令序列,共320条指令。指令的地址按下述原则生成:50%的指令是顺序执行的;25%的指令是均匀分布在前地址部分;25%的指令

5、是均匀分布在后地址部分。具体的实施方法是:在0,319的指令地址之间随机选取一起点m;顺序执行一条指令,即执行地址为m+l的指令;在前地址0,m+1中随机选取一条指令并执行,该指令的地址为m;顺序执行一条指令,其地址为m+1;在后地址m+2,319中随机选取一条指令并执行;重复上述步骤,直到执行320次指令。(2)将指令序列变换成为页地址流。设:页面大小为1K;用户内存容量为4页到32页;用户虚存容量为32K。在用户虚存中,按每页存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:第0条第9条指令为第0页(对应虚存地址为0,9);第10条第19条指令为第1页(对应虚存地址为10,1

6、9); 第310条第319条指令为第31页(对应虚存地址为310,319)。按以上方式,用户指令可组成32页。(3)计算并输出下述各种算法在不同内存容量下的命中率(要为以下各种算法定义数据结构)。先进先出的算法(FIFO);最近最少使用算法(LRU);最近最不经常使用算法(NUR/NRU/CLOCK)。命中率=1-页面失效次数/页地址流长度在本设计中,页地址流长度为320,页面失效次数为每次访问相应指令时,该指令所对应的页不在内存的次数。(4)关于随机数产生办法,Linux/UNIX系统提供函数srand()和rand(),分别进行初始化和产生随机数。例如:srand()语句可初始化一个随机数

7、:a0=10*rand()/32767*319+1,a1=10*rand()/32767*a0; 语句可用来产生a0、a1、中的随机数。三总体设计3.1程序设计组成框图系统分为4个子模块:初始化模块,FIFO、LRU、LFU、NUR和OPT的五个算法模块。初始化模块:initialize( )初始化函数,给每个相关的页面赋值。FIFO算法模块:计算使用FIFO算法时的命中率。LRU算法模块:计算使用LRU算法时的命中率。LFU算法模块:计算使用OPT算法时的命中率。NUR算法模块:计算使用LFU算法时的命中率。OPT算法模块:计算使用NUR算法时的命中率。Main()FIFO算法模块LFU算法

8、模块NUR算法模块OPT算法模块LRU算法模块Initialize()初始化函数3.2流程图LFU NUROPT四详细设计本实验的程序设计基本上按照实验内容进行。即首先用srand()和rand()函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算出相应的命中率。相关定义如下:4.1模块功能说明4.11数据结构(l)页面类型typedef structintpn,pfn,count,time;pl_type;其中pn为页号,pfn为面号,count为个周期内访问该页面次数time为访问时间。(2)页面控制结构pfc_structintpn,pfn;struct p

9、fc_struct*next;typedefstruct pfc_struct pfc_type;pfc_typepfcxy,*free_head,*busy_head;pfc_type*busy_tail;其中:pfcxy定义用户进程虚页控制结构,*free_head为空页面头的指针,*busy_head为忙页面头的指针,*busy_tail为忙页面尾的指针。4.12函数定义(1)void initialize():初始化函数,给每个相关的页面赋值。(2)void FIFO():计算使用FIFO算法时的命中率。(3)void LRU():计算使用LRU算法时的命中率。(4)void OPT(

10、):计算使用OPT算法时的命中率。(5)void LFU():计算使用LFU算法时的命中率。(6)void NUR():计算使用NUR算法时的命中率。4.13变量定义(1)int azllc;指令流数据组。(2)int pagezllc;每条指令所属页号。(3)int offsetzllc;每页装入10条指令后取模运算页号偏移值。(4)int pf:用户进程的内存页面数。(5)int zhihuan:页面失效次数。4.2算法分析先进先出算法,即FIFO算法(First-In First-Out algorithm)。这种算法选择最先调入主存储器的页面作为被替换的页面。它的优点是比较容易实现,能

11、够利用主储存器中页面调度情况的历史信息,但是没有反应程序的局部性。因为最先调入主存的页面,很有可能是经常使用的页面。最近最少使用算法,即LFU(Least Frequently used algorithm)。这种算法选择近期最少访问的页面作为被替换的页面。显然这是一种非常合理的算法,因为到目前为止最少使用的页面,和可能也是将来最少访问的页面。该算法即充分利用了主存中吗调度的历史信息,又正确反映了程序的局部性。但是这种算法实现起来非常的困难,它要为每个页面设置一个很长的计数器,并且要选择一个固定的时钟为每个计数器定时计数。在选择被替换页面时,要从所有的计数器中选择一个计数值最大的计数器。因此,

12、通常使用如下一种简单的方法。最久没有使用算法。即LRU(Least Recently Used Algorithm)。这种算法把近期最久没有被访问的页面作为被替换的页面。它把LFU算法中要记录数量上的多与少简化成判断有于无,因此实现起来比较容易。NUR算法在需要淘汰一页时,从哪些最近一个时期内未被访问的页面中任选一页淘汰。只要在页面中增加一个访问位即可实现。当某页被访问时,访问位置1.否则,访问位置0.系统周期性第对所有的引用位清零。当须淘汰一页时从那些访问位为0 的页中选择一页进行淘汰。如果引用位全为1或0,NRU算法退化为FIFO算法。最优替换算法,即OPT(Optimal Replace

13、ment Algorithm).s上面介绍的几种页面替换算法主要是以主存储器中页面调度情况的历史信息为依据的,它假设将来主存储器中的页面调度情况与过去一段时间内主存储器中的页面调度情况是相同的。当然这种假设不总是正确的。最好的算法是选择将来醉酒不被访问的页面作为被替换的页面,这种算法的命中率是最高的,它就是最有替换算法。要实现OPT算法,唯一的办法就是让程序先执行一遍,记录下实际的页地址流情况。根据这个页地址流才能找到药被替换的页面。显然这样做是不现实的。 因此OPT算法只是一种理想化的算法,然而它也是一种很用的算法。实际上,经常把这种算法作为评价其他页面替换算法好坏的标准。在其他条件相同的情

14、况下,哪一种算法的命中率与OPT算法最接近,那么,它就是一种比较好的页面替换算法。五调试与测试5.1调试方法5.11使用Vi编译程序(1) 打开VMware、选中Red Hat Enterprise Linux、查看属性、选项、共享文件夹添加(2) 查看root的主目录mnthgfszhengzhengjingjing使用vi打开5.12运行程序5.2结果分析与讨论 从上述结果可知,在内存页面数较少(45页面)时,5种算法的命中率差别不大,都是50%左右。在内存页面为725个页面之间时,5种算法的访内命中率大致在52%至87%之间变化。但是,FIFO算法与0PT算法之间的差别一般在610个百分

15、点左右。在内存页面为2532个页面时,由于用户进程的所有指令基本上都已装入内存,从而命中率已较大。从而算法之间的差别不大。 比较上述5种算法,以OPT算法的命中率最高,NUR算法次之,再就是LFU算LRU算法,其次是FIF0算法。5.3测试问题及采取措施本次课程设计中我们遇到的问题是,一开始没有弄清楚rand和sand函数的使用方法,以至于运行时的到的结果与实际算起来的不相符,后来查阅资料,上网浏览搜索相关信息后,终于弄明白了是怎么回事。 函数rand()是真正的随机数生成器,而srand()会设置供rand()使用的随机数种子。如果你在第一次调用rand()之前没有调用srand(),那么系

16、统会为你自动调用srand()。而使用同种子相同的数调用 srand()会导致相同的随机数序列被生成。 srand(unsigned)time(NULL)则使用系统定时/计数器的值做为随机种子。每个种子对应一组根据算法预先生成的随机数,所以,在相同的平台环境下,不同时间产生的随机数会是不同的,相应的,若将srand(unsigned)time(NULL)改为srand(TP)(TP为任一常量),则无论何时运行、运行多少次得到的“随机数”都会是一组固定的序列,因此srand生成的随机数是伪随机数。六源程序#include#include#include#define TRUE 1#define

17、FALSE 0#define INVALID -1#define zllc 320 /指令流长#define xy 32 /虚页长#define clear 50 /清零周期typedef struct /页面结构int pn;/页号int pfn;/页面框架号int count; /计数器int time;/时间pc;pc plxy;/页面线性结构typedef struct pfc_struct/页面控制结构,调度算法的控制结构int pn;int pfn;struct pfc_struct *next;pfc_type;pfc_type pfcxy,*free_head,*busy_he

18、ad,*busy_tail;int zhihuan,azllc;/a 为指令序列int pagezllc,offsetzllc;/地址信息int initialize(int);/初始化模块int FIFO(int);/FIFO调度算法int LRU(int);/LRU调度算法int LFU(int);/LFU调度算法int NUR(int);/NUR调度算法int OPT(int);/OPT调度算法/*主函数*/int main()int s,i;srand(unsigned)time(NULL);s = rand()%320;for(i=0;izllc;i += 4)if(s319)pri

19、ntf(When i = %d,Error,s=%d,i,s);exit(0);ai = s;ai+1 = ai+1;ai+2 = rand()%(ai+1+1);ai+3 = ai+2 + 1;s = rand()%(319-ai+3) +ai+3+1;if(ai+2318|s319)printf(a%d+2,a number which is:%d and s = %dn,i,ai+2,s);for(i=0;izllc;i+)/将指令序列变换为页地址流pagei = ai/10;offseti = ai%10;for(i=4;i=32;i+)printf(%2d page frames:t

20、,i);FIFO(i);LRU(i);LFU(i);NUR(i);OPT(i);return 0;/*初始化相关的数据结构,pf表示内存的块数*/int initialize(int pf)int i;zhihuan = 0;for(i=0;ixy;i+)pli.pn = i;pli.pfn = INVALID;/质页面控制结构中的页号,页面为空pli.count = 0;/页面控制结构中访问次数pli.time = -1;/访问时间for(i=0;ipf-1;i+)/建立pfci-1与pfci之间的联系pfci.next = &pfci+1;pfci.pfn = i;pfcpf-1.next

21、 = NULL;pfcpf-1.pfn = pf-1;free_head = &pfc0;/空页面队列的头指针为pfc0return 0;/*先进先出算法,pf为用户进程的内存页面数*/int FIFO(int pf)int i;pfc_type *p;/中间变量initialize(pf);/初始化数据结构busy_head = busy_tail = NULL;/忙页面头队列,为队列链接for(i=0;inext;/保存忙页面的下一个页面plbusy_head-pn.pfn = INVALID;/把这个页面换出,更新它的数据成员free_head = busy_head;/释放忙页面队列的

22、第一个页面free_head-next = NULL;/表明此页面是空的组后一面busy_head = p;/更新页面的头队列指针p = free_head-next;free_head-pn = pagei;plpagei.pfn = free_head-pfn;free_head-next = NULL;/使busy的尾为空if(busy_tail = NULL)busy_tail = busy_head = free_head;else/把刚刚换进来的接在busy_tail的后面busy_tail-next = free_head;busy_tail = free_head;free_h

23、ead = p;/下一个空页面printf(FIFO:%6.4f|,1-(float)zhihuan/320);return 0;/*最近最久未使用算法*/int LRU(int pf)int min,minj,i,j,present_time;/minj为最小值下标initialize(pf);present_time=0;for(i=0;izllc;i+)if(plpagei.pfn = INVALID)/页面失效zhihuan+;if(free_head = NULL)/无空闲页面min = 32767;/设置最大值for(j=0;jplj.time&plj.pfn!=INVALID)m

24、in = plj.time;minj = j;free_head = &pfcplminj.pfn;/腾出一个单元plminj.pfn = INVALID;plminj.time = 0;free_head-next= NULL;plpagei.pfn = free_head-pfn;/有空闲页面改为有效plpagei.time =present_time;free_head = free_head-next;/减少一个free页面elseplpagei.time = present_time;/命中则增加该页面的访问次数present_time+;printf(LRU:%6.4f|,1-(f

25、loat)zhihuan/320);return 0;/*最近未使用算法*/int NUR(int pf)int i,j,dp,cont_flag,old_dp;/这个算法用count用于访问位initialize(pf);dp = 0;for(i=0;inext = NULL;plpagei.pfn = free_head-pfn;plpagei.count = 1;free_head-pn = pagei;free_head = free_head-next;elseplpagei.count = 1;if(i%clear = 0)for(j=0;jxy;j+)plj.count = 0;

26、printf(NUR:%6.4f|,1-(float)zhihuan/320);return 0;/*最少访问页面算法*/int LFU(int pf)int i,j,min,minpage;initialize(pf);for(i=0;izllc;i+)if(plpagei.pfn = INVALID)/页面失效zhihuan+;if(free_head = NULL)/无空闲页面min = 32767;/获取count的使用频率最小的内存for(j=0;jplj.count&plj.pfn!=INVALID)min = plj.count;minpage=j;free_head = &pf

27、cplminpage.pfn;plminpage.pfn = INVALID;plminpage.count=0;free_head-next=NULL;plpagei.pfn = free_head-pfn;plpagei.count+;free_head = free_head-next;/减少一个free页面elseplpagei.count = plpagei.count+1;printf(LFU:%6.4f,1-(float)zhihuan/320);return 0;/*最佳置换算法*/int OPT(int pf)int i,j,k,l,max,maxpage;initializ

28、e(pf);for(i = 0; i zllc; i+)if(plpagei.pfn = INVALID)/页面失效zhihuan+;max = maxpage = 0;if(free_head = NULL)/无页面空闲for(j = 0; j pf; j+)l = 1;for(k = i + 1; k zllc; k+)if(pfcj.pn = pagek)if(max next = NULL;plpfcmaxpage.pn.pfn = INVALID;plpagei.pfn = free_head-pfn;free_head-pn = plpagei.pn ;free_head = fr

29、ee_head-next ;printf(OPT:%6.4fn,1-(float)zhihuan/320);return 0;七心得体会本次课程设计使我加深了请求页式存储管理中置换算法的理解,在这次设计中,我学到了许多知识,由于之前的C语言、数据结构等基础打的不好,分析算法程序时感到很吃力,在刚开始编程时很茫然,无从下手,所以先看了老师之前的程序,也到网上看了别人写的相似程序,这才对存储管理的各个置换算法的设计有一点眉目。在做课程设计的时候遇到了很多问题,比如对srand()、rand()函数不是很清楚,经过上网查和询问得知,它们分别为进行初始化和产生随机数的函数。在这次课程设计中,我不仅学会

30、了一些C+知识,还知道了一个道理:有些程序编写看起来很难,毫无头绪,一旦你尝试去写,最终你终能得到你想要的结果,不怕你不会,就怕你不做。通过各个置换算法的设计编程,使我在思维、看待问题的全面性等方面也有了很大的提高。让我对实验原理有更深的理解,通过把该算法的内容,算法的执行顺序在计算机上实现,知道和理解了该理论在计算机中是怎样执行的,对该理论在实践中的应用有深刻的理解。并且这次课程设计把各个学科之间的知识融合起来,把各门课程的知识联系起来,对计算机整体的认识更加深刻。我希望今后能在动手方面加强,多上机。虽然现在的我还不能独立的完成这样一个复杂的设计,但我相信经过这样一次又一次的设计,最终我能做得更好。八参考文献【1】计算机操作系统 西安电子科技大学出版社 汤子瀛、哲凤屏、汤小丹编著【2】VC+深入详解 电子工业出版社 孙鑫、余安萍编著【3】计算机操作系统教程(第三版)清华大学出版社 张尧学、史美林编著【4】数据结构教程(第三版)电子工业出版社 谢希仁等

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号