模拟页式存储管理-操作系统课程设计报告 2

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、目的和要求

1、设计目的

通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。

2、设计要求

根据模拟的页式管理设计,掌握在页式存储管理中最基本的三种页面调度算法FIFO、LRU以及OPT。但在三种算法中均要求在调度程序中产生的页面序列是随机产生的,而不是人为的输入,在执行时只需改变页面的大小及内存容量就可以得到不同的页面序列,另外还需要说明随机的性能和其性能可能对算法的影响,并对随机性要有一定的参数控制能力。此外,计算并输出FIFO、LRU以及OPT算法在不同内存容量下的命中率。

根据方法的执行过程,编写一个解决上述问题的程序,显示访问每个值页面中的值。

具体参数:访问串的长度,访问串,页面个数。

分别用3种不同的方法实现页面的置换,并输出相关信息。

二、设计思路及过程

1、概要设计

1.1 问题概述

根据三种不同的置换算法,依据其不同的算法方式,分别计算该算法在不同情况下的命中率,并显示各页面的变化情况。

1.2 内容分析

对于该课程设计中模拟的页式存储管理的页面置换过程,只要掌握其中最基本的三种算法,包括FIFO、LRU及OPT。但最重要的一点就是要求产生随机

序列,所以在编写程序时要采用控制产生随机值的种子数函数,如此能产生随机的访问序列。另外,不能在执行完一次操作后就只能进行另外一种算法的操作,必须还要有更加详细的操作,比如:是否要重新得到新序列?还是要不改变访问序列而只改变访问串的内存容量?抑或是不操作就退出该算法以进行下一种调度算法?因此,在执行完每次操作后都必须要有提示语,看是否进入更细节的操作,还是退出本次算法的操作以进入下一种算法的调度。

2、过程设计

2.1模块设计

在下图的主模块设计图中,只注重描绘了页式存储管理的三种主要算法,未描绘出细节部分。其中,在执行每种算法时都会要求输入你所需要的访问串长度、随机值以及同一种算法的不同内存容量,如此就可以得出不同的命中率。另外,在执行完该操作后又会出现三条提示语,是重新得到新序列?还是不改变访问序列只改变访问串的内存容量?抑或是不操作退出以进行下一种调度算法?这些在下图中都未一一实现。

=2.2 算法原理分析

要学成功实现算法,首先要知道各个方法是怎么做的,即原理是怎样的,下面是三种算法的原理。

FIFO算法是先进先出,当当前内存中没有正要访问的页面时,置换出最先进来的页面。

LRU算法是最近最久未使用,当当前内存中没有正要访问的页面时,置换出在当前页面中最近最久没有使用的页面。

OPT算法是未来最远出现,当当前内存中没有正要访问的页面时,置换出当前页面中在未来的访问页中最远出现的页面或再也不出现的页面。

2.3 程序流程图

本次课程设计的主要流程是3种置换算法的流程图,本人负责OPT,流程图如下所示:

图2.2 OPT 算法流程图

三、数据定义

int length,num_page,count,seed; //length 记录访问串的长度,num_page 页面数,count 记录缺

页次数

int result[20][30],order[30],a[10]; //result 记录结果,order 存储访问串,a 存储当前页面中的值 int pos1,flag1,flag2,flag3; //pos1位置变量,flag1等为标志变量 char result1[30]; //记录缺页数组

N

N

Y

Y

开始

输入内存中分配页数

N

Y 还有请求访问页?

内存中是否已存在?

直接复制前一列内容

内存有空页?

直接插入

替换内存中将来不出现或离当前最远的页

输出全部页面变化情况

结束

据第一个访问页初始化第一列值

四、核心代码

三种置换算法中只列出本人负责部分(OPT算法),具体代码及注释如下:void opt() //理想型

{

int i,pos[10],flag[10];//i为for循环控制语句,pos为位置变量,flag标志变量

while(1)

{

flag1=flag2=0;

for(i=0;i

{

if(!search(order[i]))//查询要访问的页是否在内存中

{

count++;

result1[i]='*';

if(a[num_page-1]!=-1) //表示当前页面已满要淘汰一个

{

memset(pos,-1,sizeof(pos));//初始pos数组

memset(flag,0,sizeof(flag));//初始flag数组

int j,k;

for( j=i;j

{

for( k=0;k

{

if(order[j]==a[k]&&flag[k]==0)

{

pos[k]=j;

flag[k]=1;

}

}

}

cout<

int max=-10,max_pos;

for( k=0;k

{

if(pos[k]==-1)//未出现则跳出,替换该值

{

max_pos=k;

break;

}

else if(max

{

max=pos[k];

相关文档
最新文档