请求调页存储方式的模拟 java_课内资源 - 基于JAVA实现的操作系统请求调页模拟...

该博客介绍了基于JAVA实现的请求调页模拟程序,包括FIFO、LRU和NRU三种调页策略。程序通过Memory和Page两大类实现,Page类负责生成随机指令,Memory类实现调页算法。通过位运算优化判重,提高效率。同时,文章讨论了各种置换算法的实现细节和心得体会。
摘要由CSDN通过智能技术生成

一、程序使用说明

打开程序,得到如下画面

9a8116c8eb9daadd228441fbd942442b.png

点击FIFO调页得到FIFO(先进先出)调页模拟,点击LRU调页得到(最近最少使用)调页模拟,点击NRU调页得到NRU(轮转)调页模拟。

下图为FIFO调页结果

677b488c209b13023bce9265d926ad8e.png

页面最后有缺页率的计算

2d301899071d165c85b32fdf3c7a5a9d.png

二、程序设计图

程序共有2个大类 Memory 和 Page。

2.1 Memory

Memory中包括成员变量:

lackCount:计算却页数

orderNumber:执行的命令编号

totMemroyPage:内存的总页数(题目要求为4)

runModel:运行模式,FIFO || LRU || NRU

point:在运行NRU方法时的指针

pageMemory[totMemroyPage]:每个内存中的页的情况

PageMemory类:

pageAge:指令进入的时间

runPage:该内存页中存储的指令中的哪个页

use:NRU调页中的use标记

2.2 Page

该类为外部命令产生随机指令的类。主要变量有:

totOrder:指令总数

hashPage[]:判断随机数是否产生过

三、实现思想

3.1 Page产生随机数

开辟一个hashPage[totOrder/10]大小的int 数组,利用位运算方法判重。每一个hashPage[i]判断10条指令,计算机存储数据是以二进制方法存储,因此,一个int有32位,取它的后面10位即可完成次操作。如,需要判断第15个页中的第8条(从0开始计算)指令是否产生过,只需要判断hashPage[14] & (1<<8)是否为0;如果产生一个17页中的第9条指令,需要将它在以后的指令中删除,只需要hashPage[16]=hashPage[16] | (1<<9)即可。初始时,将每一个hashPage[i]制为0。

在利用Random得到一个随机数randomNumber以后,用这个位运算进行判重。开始的时候,我严格按照课件上的要求去产生随机数,每次产生随机数之前先判断这个数之前(之后)是否有随机数。如果有才产生,没有转换一个方法去取随机数。

但是,后来实践证明这个方法效率不够高,于是,我就修改成了随机10次产生随机数,如果都失败了,则换一个方法取随机数。

3.2 Memory置换方法

FIFO、LRU、NRU,都需要先检查内存的页中是否已有目前需要的页号。因此,我先设定一个int check(int page)的函数,函数返回哪一个内存页中的runPage=page,如果都没有,返回-1。

3.2.1 FIFO

在得到一个指令order以后,order/10为相应的page编号,如果在check(order/10)中,返回的不是-1,则直接退出,代表内存已有次页号。

如果返回的不是-1,在所有的pageMemory[i]中,找到pageAge(也就是最早进入的)最小的一个,替换掉新加入的page,并且把pageMemory[i].pageAge重新更新。并且lackCount++;

3.2.2 LRU

LRU其实和FIFO差不多,唯一的区别就是在如果check(order/10)在返回不是-1时,我重新更新pageMemory[which].pageAge的值即可。

3.2.3 NRU

NRU轮转算法是FIFO和LRU的折中,首先,建立一个point指针和pageMemory[i].use分别表示指针轮转到哪个地方,以及该内存中的页是否在最近被使用过。

与上两个方法类似,首先,返回一个which= check(order/10),如果which!=-1,则pageMemory[which].use=true。

在置换出一个内存时,将pageMemory[i].use=true。

在寻找置换出来的内存时,需要将point移动,移动过程中,如果pageMemory[point].use=true,将其置为false,如果pageMemory[point].use=false,则停止point的移动,并且置换出此时的point。

四、心得体会

这个项目比起操作系统的第一次项目简单了不少,算法本身也相对简单,目的只是为了让我们了解页面调度的各种算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值