页面置换算法

  在一个请求分页系统中,分别采用最佳置换算法、先进先出置换算法、最近最久未使用置换算法(LRU)时,假如一个作业的页面走向为4、3、2、1、4、3、5、4、3、2、1、5,当分配给该作业的物理块数M分别为3和4时,试计算在访问过程中所发生的缺页次数和缺页率,并比较所得结果。

实验步骤与记录

(一)准备阶段

  因为作业的页面走向是一串数字,因此可以定义一个数组 pageString[] 来储存将要发送请求的页号,同时还需要定义一个数组 inStore[] 作为分配给该作业的内存物理块以及定义一个变量times记录缺页次数。

  根据题目要求内存物理块数M分别为3和4,所以我构造了一个方法 setInStore() ,用来初始化内存物理块,并将内存物理块中的数值置为无实际含义的“-1”:

java实现FIFO页面置换 java页面置换算法_java实现FIFO页面置换


(二)置换方法实现阶段

1、最佳置换算法和最近最久未使用置换算法(LRU)

  分析发现这两种算法几乎相同,只是一个向后看,一个向前看,因此将两个算法的代码放在一起分析:

  以内存物理块数是3为例,进程运行时,内存未满时,先将4、3、2三个页面依次装入内存。

java实现FIFO页面置换 java页面置换算法_java实现FIFO页面置换_02


  内存满后,进程要访问页面,先判断该页是否在内存中,如果在内存中则不会产生缺页中断。

java实现FIFO页面置换 java页面置换算法_缺页中断_03


  如果不在内存则需要将内存中的页根据最佳置换方法置换出来。即由请求页在作业的页面走向( pageString[ ] )数组中的位置为起点,如果是“最佳置换算法”则分别计算当前内存中各页下次出现的距离(即由起点向后遍历 pageString[ ] 数组),而“LRU置换算法”则由起点向前遍历 pageString[ ] 数组,分别计算当前内存中各页到起点的距离(需注意的是将遍历结束后再也不出现的页号的距离置为最大值),这需要定义一个大小与内存物理块数相同的数组( num[ ] )来存放计算出来的距离。(这是两种算法唯一的不同点)

java实现FIFO页面置换 java页面置换算法_java实现FIFO页面置换_04


java实现FIFO页面置换 java页面置换算法_操作系统_05


  比较距离的大小,将距离最远的替换出来。

java实现FIFO页面置换 java页面置换算法_操作系统_06


2、先进先出置换算法(FIFO)

  内存空间未满时将请求页依次放入内存。内存满后,判断请求页是否在内存中,如果在内存则不产生缺页中断(此段代码与最佳算法相同),反之则产生缺页中断需要依据先进先出规则对内存中的页面进行置换。即将内存中最早进入的页换出。这需要数组( num[ ] )用来存放内存中各页面进入内存的先后顺序,内存中最早进入的页面的序号标记为“1”,第二早的标记为“2”,依次将内存中的页标记好,最后换出最早进入的页面(即序号标记为“1”的页)

java实现FIFO页面置换 java页面置换算法_操作系统_07


(三)输出内存变化过程以及计算缺页次数和缺页率

1、构建一个方法( putInstore() )输出内存的当前状态

java实现FIFO页面置换 java页面置换算法_缺页中断_08


2、定义一个变量 times 作为访问过程中所发生的缺页次数,每发生一次缺页中断 times 就+1。然后根据“缺页率=缺页次数/进程总页面访问次数”构造一个方法( pagef() )计算缺页率。

java实现FIFO页面置换 java页面置换算法_缺页_09

运行结果

  当分配给该作业的物理块数为3时:

java实现FIFO页面置换 java页面置换算法_java实现FIFO页面置换_10


java实现FIFO页面置换 java页面置换算法_缺页中断_11


java实现FIFO页面置换 java页面置换算法_数组_12


java实现FIFO页面置换 java页面置换算法_缺页中断_13


  当分配给该作业的物理块数为4时,最佳置换算法缺页中断次数为6,缺页率为0.5;先入先出算法缺页中断次数为10,缺页率为0.8333333;LRU置换算法缺页中断次数为8,缺页率为0.6666667。