• FIFO调度算法和LRU算法


    一.理论

    FIFO:先进先出调度算法

    LRU:最近最久未使用调度算法

    两者都是缓存调度算法,经常用作内存的页面置换算法。

    打一个比方,帮助你理解。你有很多的书,比如说10000本。由于你的书实在太多了,你只能放在地下室里面。你看书的时候不会在地下室看书,而是在书房看书。每次,你想看书都必须跑到地下室去找出来你想看的书,然后抱回来放到书桌上,之后才开始看。还有就是,有一些书你会反复的看,今天看了也许过几天又要看。总之,你自己是不知道你哪天会需要看哪本书的。你的老师每天下课的时候会给你布置一个书单,让你晚上回去去看哪本书。(假设你老师让你看的书在你的地下室里面都有)跑地下室当然是非常麻烦的,所以你希望你的经常看的那些书最好放在书桌上。但是你的书房的书桌同时只能摆放10本书(这个是假设的啊)。那么,问题来了。到底把哪些说留在书桌上最好呢?这里说的最好,就是说你尽量少的跑地下室去找书。为了解决这个问题,人们发明了很多的算法。

    其中,比较常见的就是上面这两种:FIFO算法和LRU算法。

    FIFO算法:

    很简单,我把书桌上的10本书按照放置时间先后堆放成一堆。这里的放置时间,就是说这本书在我的书桌上放了几天了。每次要看书的时候,我先在书桌上找,找到就直接可以读了。读完之后放回原来的位置就可以,不打乱顺序。如果书桌上面没有我要读的书,就去地下室找。找来之后,我就把书桌上放的时间最长的那本(也就是书堆里面最下面的那本书)放回地下室。然后把我今天需要看的这本书放在书堆的最上面。

    LRU算法:

    也不难,我把书桌上的10本书按照阅读时间先后堆放成一堆。这里的阅读时间,就是说我最近一次读这本书是几天之前。每次要看书的时候,我先在书桌上找,找到就直接可以读了。读完之后放在书堆的最上面。如果书桌上面没有我要读的书,就去地下室找。找来之后,我就把书桌上最久没有阅读的那本(也就是书堆里面最下面的那本书)放回地下室。然后把我今天需要看的这本书放在书堆的最上面。上面这个比方,相信你可以看明白吧。这里的地下室对应内存,书桌对应缓存,书对应页面。

    二.缺页次数

    在一个采用页式虚拟存储管理的系统中,有一用户作业,它依次要访问的页面序列是1,2,3,4,1,2,5,1,2,3,4,5.假定分配给该作业的页数为3且作业初始时未装载页面,那么采用FIFO调度算法产生的缺页中断数为多少,采用LRU调度算法产生的缺页中断数为多少?
     FIFO算法:(First In First Out),先进先出,一般看到这类思想,首先想到的数据结构应当是队列,但是我们这里最好是用vector,因为调页过程中需要遍历队列检查该页是否已存在,当算法的存储结构是队列或栈,但实现过程中需要经常遍历全队列或全栈的内容时,最好用vector,这是《剑指Offer》面试题25给我的启发。给出一个访问序列的模拟算法到此应该非常简单了,为了节省时间,下面仅给出题目计算步骤,代码今后再补。
               访问序列:1,2,3,4,1,2,5,1,2,3,4,5
                       1,2,3先调入内存,内存结构:3      2      1    缺页次数:3  
                       4调入内存,1调出,  内存结构:4      3      2    缺页次数:4
                       1调入内存,2调出,  内存结构:1      4      3    缺页次数:5
                       2调入内存,3调出,  内存结构:2      1      4    缺页次数:6
                       5调入内存,4调出,  内存结构:5      2      1    缺页次数:7
                       1存在,内存结构不改变
                       2存在,内存结构不改变
                       3调入内存,1调出,  内存结构:3      5      2    缺页次数:8
                       4调入内存,2调出,  内存结构:4      3      5    缺页次数:9
                       5存在,内存结构不改变
                共缺页9次,缺页中断率 = 缺页中断次数 / 总访问页数 = 9 / 12    


    LRU算法:最近最少使用(Least Recently Used),先看一下调页过程
               访问序列:1,2,3,4,1,2,5,1,2,3,4,5
                    1,2,3先调入内存,内存结构:3      2      1    缺页次数:3  
                    4调入内存,1调出,  内存结构:4      3      2    缺页次数:4
                    1调入内存,2调出,  内存结构:1      4      3    缺页次数:5
                    2调入内存,3调出,  内存结构:2      1      4    缺页次数:6
                    5调入内存,4调出,  内存结构:5      2      1    缺页次数:7
               到这一步其实和FIFO并没有区别
                  1调入内存,由于内存中存在1,故没有缺页中断,但由于1最近被访问过,所以要将其位置调换,
                  使它最后一个被淘汰,内存结构:1      5      2
                  2调入内存,没有缺页中断,但内存位置要变化,内存结构:2      1      5
                      3调入内存,5调出,  内存结构:3      2      1    缺页次数:8
                      4调入内存,1调出,  内存结构:4      3      2    缺页次数:9
                      5调入内存,2调出,  内存结构:5      4      3    缺页次数:10
               共缺页10次,缺页中断率:10/12

  • 相关阅读:
    图数据库的选择与对比(Neo4j)
    pip install ahocorasick报错以及Requirement already satisfied问题
    从知识图谱到认知图谱: 历史、发展与展望
    kafka(一)—— kafka安装简单使用
    python管理docker
    Javaweb前后端分离项目docker部署
    django + uwsgi + nginx部署(前后端不分离)
    坑(八)—— LayUI框架中append新的元素的问题
    docker(三)—— 避免一直输入sudo
    坑(七)—— 表单提交方式
  • 原文地址:https://www.cnblogs.com/shenzhenhuaya/p/sdfsduhoi.html
Copyright © 2020-2023  润新知