页面置换算法综合实现(Java,Java Swing实现)

修订2022/6/10

经小伙伴 @小林在划水 提醒,opt算法存在一些问题,当最后一个数据不在cache中,并不会加载到最终的cache缓存中,目前算法已修改。如果有问题,欢迎大家提出指正,谢谢🤞!

算法导入

       失踪人口回归!先聊聊闲话哈!
       最近在看《夏目友人帐》,真香,猫老师太萌了!但是操作系统老师的课设还是要完成的呀,莫得办法,只能打开IDEA开始敲代码了,敲着敲着,更新版本后(从2019.2.6直接到2019.3)突然发现之前激活好的IDEA,然后就没有激活了???什么操作,对于学生党的我来说,购买是不可能购买的,但又真的香,没办法, 只能从大佬那里找到新的注册码了。放链接,以防需要的小伙伴:
       最新版本IDEA破解和汉化
       汉化就没有必要了,激活才是最终要的。。。

       好了回归正题,今天给大家带来的算法是页面置换算法。操作系统的课设其实有好几个选择,但是我能力太弱(太辣鸡)只能选择我之前稍微做过的那个啦!
       这次的页面置换算法是一个综合,将包括5个单独的页面置换算法,分别是:最佳置换算法(Optimal)先进先出页面置换算法(FIFO)最近最久未使用置换算法(LRU)最少使用置换算法(LFU)改进型CLOCK算法
       同时为了不太low,在下结合Java Swing做了个简单的界面,最后实现的效果是这样的,感兴趣的同学可以看下去,源代码啥的先不给吧,白嫖是不可能白嫖的,除非你求我hhh

界面展示
-----------------------------------------这是一个丑陋的分割线------------------------------------

       这份代码我前后花了四天敲出来,包括中间的debug环节,如果你没有相关知识的话,权当个娱乐来看,反正博主的专业知识半吊子,以及这篇博客不会提及太多的专业知识,重要的是思路,设计窗体的思路,敲代码的思路,下面我会一一提及的。
       温馨提示:这篇博客大概要花10-15分钟看完,亲!

算法分析

一、界面分析

       在刚开始做课设的时候,要求是拥有简单的页面,我就很疑惑,到底该做什么样的界面,后面在网上搜了搜前辈写过的课设模板,才有了大概的想法。可是开始自己写的时候,却发现不知道如何写出来,网上的模板竟然还要币下载才能看到代码,我是有钱人嘛,不是,老实说是我抠hh。
       那没办法呀,只能自己写了。
       首先,窗体Frame是肯定要有的,你要创建界面,需要盛放组件(比如按钮之类)的容器,但是全都放在窗体里面吗?肯定不是的!因为我们需要有不同的界面来展示不同的算法执行过程,如果你都放在同一个界面中,如何规划又成了一个问题。所以这时候就需要面板Panel发挥作用。有人可能对这两个容器有所疑惑,都能放组件,那么有什么区别呢?下面放张图,你大概能看懂了:
在这里插入图片描述
(1)其中 ComponentContainerWindow 均为抽象类,无法直接new创建对象。其中 Window 属于有边框的一类,称为顶层容器,如Frame、Dialog,而Panel属于无边框的一类,称为中间容器,所以对我们来说,一般实际使用中,创建窗体的是Frame类,这个Frame中可以直接放组件(如Button、label之类)但是一般不这么使用,Panel也是一种容器,所以也可以放组件,但是它不能脱离Frame显示组件,也就是说,Frame是必须有的,Panel是可有可无的

(2)但是为什么要使用 面板Panel呢 ,这是因为 Panel 属于中间容器,所以它可以嵌套使用(Panel之中还可以放Panel,套娃),而Frame属于顶层容器,这决定了它自身不能嵌套,只能跳转到不同的窗体。所以Swing中Panel的使用更加频繁, 不过Swing中的 Panel 称为 JPanel

(3)面板 Panel 和 窗体 Frame 之间都可以设计属于自己的布局方式,这一点很重要,之后将会提到。

二、界面设计

       刚开始我也是把所有东西都放在Frame中,那为什么不这么干呢,因为后面发现,它不方便,不整洁,看着烦,我这么多东西塞一起,好像不知道如何安排它们。
       所以我设计了刚开始那样的界面,这是由一个顶层窗体Frame,8个JPanel所组成的。
       8个?到底是哪8个呢?
       下面我就一一介绍了。

       1.顶部面板jp1 : 这个面板的功能是存放五个按钮,其余的啥都不干,啥也不加,采用的布局方式是默认布局方式——FlowLayout , 将部件按照加入的先后顺序从左到右排放,放不下再换至下一行。所以五个按钮在同一行水平排列。

       2.中间面板jp2:这个面板的功能是存放其余五个算法面板,其余也啥都不干, 啥也不加,采用的布局方式是BoxLayout,Swing中引入的一种布局管理器,能够允许将控件按照x轴(从左到右)或者y轴(从上到下)方向来摆放。 这里沿着x轴从左到右摆放算法面板。而这就是 面板Panel 的作用:可以嵌套,也可以设置自己的布局方式 ,这就是为什么使用 面板Panel 的理由。

       3.算法面板jp3-7 :这五个面板的作用就是用来展示算法了,其中的设计也一致,都设计了6个 JLabel 来显示相关信息,缺页率,缺页次数,置换次数。一个 TextArea 来接受输出的置换过程,页面是否命中的信息。

       4.信息面板jp8 : 这个面板纯粹是为了显示一些信息而存在,不想要也无所谓,但存在即合理,比如我要显示各种算法的数据结构,默认的页面序列等。

       5.按钮 : 以Optimal算法为例,通过给按钮注册监听事件,来调用不同的类方法,实现不同的功能。监听事件放在主窗体中,如下:

	btn5.addActionListener(e -> {
            String[] chooses = {"使用固定的页面序列", "我要自己输入页面序列", "使用随机生成页面序列"};
            String choose= (String) JOptionPane.showInputDialog(null, "make a choose",
                    "Optimal Choose", JOptionPane.QUESTION_MESSAGE, null, chooses, chooses[0]);
            if (choose == null || "".equals(choose)) {
                //没有做选择
                repaint();
            }else {
                if (choose.equals(chooses[0])) {
                    OptimaPanel.run1();
                }else if (choose.equals(chooses[1])) {
                    OptimaPanel.run2();
                }else {
                    OptimaPanel.run3();
                }
            }
        });

三、界面相关算法设计

       看此博客的同学我默认你是知道五种页面置换算法的,什么?你不知道,那你看个锤子,动漫不香嘛,我猫老师不可爱嘛!快去快去。

       什么,你真不知道!好吧,去看看我之前写过的LRU算法(java实现)算法导入第二点,里面简单介绍了各种页面置换算法的概念,链接在此,速去速回hh。
       Lru算法(java实现)

       好了,现在咱们简单讲一下如何实现:

       (1) Optimal算法:虽然说理论上不能实现,但是咱们是模拟,虽然进程的未来所需页面不可预知,但是模拟情况下,我们输入页面序列,那就不一样了。Optimal算法 的精髓在于它 往后看 ,判断一个数据是否要置换出去,是搜索后面这个数据是否出现,如果不出现,好了小伙子就是你,你可以滚了。如果都出现,那谁出现的最晚,来的最晚,就让他滚,换新数据,不能站着茅坑不那啥,浪费内存空间的使用率是吧。那如何实现呢,我们可以将每个数据 arr[i] 出现时,将数组后面将要出现的 剩余数据保存在另一个数组中,每次要置换时,就看谁不出现或者谁出现的最晚。具体实现代码就不放了。

注:2022/6/10修改,该算法实现上,采用复制数组方式,时间复杂度较高,且存在问题。改进算法,使用hashMap统计栈中数据在后面出现的位置,由于hashMap O(1)的查找效率,整体时间复杂度降低为 O(n^2)。

       (2) FIFO算法: 这个算法应该是比较好实现的了,先进先出嘛,可以采用数据结构 队列Queue 来实现,具体实现也省略。

       (3) Lru算法 : 这个算法我之前写过分析,这里就不说了,链接在此。
       Lru算法(java实现)

       (4) Lfu算法: 这个没写过,所以我重新写了一个,用的还是数组。Lfu是淘汰最少使用的页面,我们在访问每个数据的时候,不妨建立一个大小相同的数组,用来存储当前页面的访问次数,如果访问的数据相同,那么每次除了自己的访问次数加1,前面和它相同的页面的访问次数也要改变。然后淘汰时,先淘汰当前内存块中,访问次数最少的,然后如果访问次数都相同,那么就淘汰最先进来的,何为最先进来的,我们这里可以简单认为数组中出现的最早的页面,那么它肯定最先被访问,最先进来。

       (5) 改进型Clock算法 : 这个算法在于它给页面添加了访问位和修改位。优先淘汰最近既没有被访问,又未被修改的页面。如果没有,那么淘汰最近未被访问,但已被修改的页面,且此时修改访问位,进行相关操作。

算法展示

一、操作展示

       操!不知不觉就说了这么多,全是文字,估计你们都不想看了。咱来放点图,展示一下这个窗体的实际演示吧。
       以 FiFO算法 来演示:

(1)点击按钮,出现三种选择,你是要使用默认的页面序列呢?还是要自己输入页面序列呢?还是随机生成呢?贴心吧(f**k要求)。

在这里插入图片描述
(2) 假如选择的操作为1:使用固定的页面序列,那么,执行方法 Fifo.run1() ,选择后弹出输入框,因为选择了固定的页面序列,所以我们还需要输入物理块个数,假如我们输入值为4,如图:
在这里插入图片描述
那么当前Fifo算法执行的页面序列为 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1,内存的物理块个数为4,执行结果如下:
在这里插入图片描述
(3) 假如选择的操作2: 我要自己输入页面序列,那么需要我们手动输入相关信息,比如这里我们输入页面序列为4 7 0 7 1 0 1 2 1 2 6,输入的物理块个数为5,如下图:
在这里插入图片描述
那么执行Fifo算法产生的结果如下:
在这里插入图片描述
(3) 假如选择操作3: 使用随机生成的页面序列,那么只需要输入要生成的页面序列的长度,以及物理块的个数,就能生成随机序列来运行算法,比如我们随机生成15个页面,使用的物理块个数为5个,如下:
在这里插入图片描述
那么算法执行情况如下:

在这里插入图片描述
注:Clock算法稍微有点不同,因为它的选择不一致,如下:
在这里插入图片描述
除了选择页面序列,还要选择页面的修改位是否为默认,当然你可以自己输入页面序列,然后随机修改位。如果你想自己输入每个页面的修改位,我只想说,你咋这么闲呢?自己改去!!!

二、算法比较

       要比较不同算法之间的优劣,最好的方法就是使用同一个页面序列,相同的物理块个数,测试不同的算法,然后比较他们之间的缺页率。在这里我设置了默认的页面序列,放置在底部面板中。现在假设使用该序列来测试,选择的物理块个数为3。那么算法结果如下:
在这里插入图片描述
       可以看到,默认序列的长度有20个,选择相同的物理块,可以看出不同算法之间的缺页率差异。Opt算法效果最好,缺页率为45%,Fifo算法的缺页率为75%,Lru算法的缺页率为60%,Lfu的缺页率为65%,Clock的缺页率为60%。这是在物理块大小为3的情况下测试数据,现在修改物理块为5:
在这里插入图片描述
       从图中可以看出,除了Fifo的缺页率为0.449外,其他四种算法的缺页率竟然惊奇的相似,那么这是为什么呢?其实是因为默认的页面序列本身只有0,1,2,3,4,7,这6种数据,而整个页面序列长度为20,当物理块长度变大时,就会造成相同的数据重复访问占用。所以造成相同的结果。

结尾

       也不知道要说啥,因为完整的代码还没有放给你们,有点小惭愧,想要的小伙伴底下评论吧,记得留下联系方式。这篇就到此为止了。我们有缘再见!

再结尾

       最近越来越多的小伙伴私聊要源代码,上班后无法及时回复,于是源码就开源到github和gitee上了,大家可以到网站上获取。

github:https://github.com/moailaozi1/page-replacement-algorithm
gitee:https://gitee.com/liao-kaiqiang/page-replacement-algorithm

       想念叨一两句,好像大家都喜欢白嫖,文章阅读不多,但要源码的人不少,点赞却更少。乐于奉献是没错,但你我萍水相逢,如果对你有助,为何一个小小的赞,不愿高抬贵手呢。

       多的不说,大家学习愉快,顺利毕业吧。

  • 54
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 118
    评论
评论 118
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值