页面置换算法FIFO/LRU/OPT如何做题?最清晰讲解(速成作业必过考试)

页面置换算法

页面置换算法_哔哩哔哩_bilibili

操作系统——FIFO和LRU页面置换算法_fifo页面置换算法-CSDN博客

页面置换,就是把新的页面替换旧的页面

常考的一共三个算法

先进先出算法(FIFO)

思想: 把内存中驻留时间最久的页面淘汰,即淘汰最早进入内存的页面

题型: 采用FIFO算法,给你一个序列x,x,x,x,x,x,x,x,x,x,当物理块为 x 时,计算缺页次数和缺页率

解法: 转为如下表格,物理块有几个就几行

访问页面70120304230321201701
物理块1
物理块2
物理块3
缺页否

过程(盯着看物理块):

  1. 前面m=3列,就直接按序列依次写进去

  2. 后面的,如果不在物理块里面,看出现最长的数字,就把他替换掉(在纸上写的时候把他划掉,避免看错)

    例如第4个2,看物理块中7出现了最长,就把7变成2

  3. 如果该页面比如第5个0本来就在物理块中,那这列就留空,即为不缺页

详情还请看上面提供的视频,比较清楚

访问页面70120304230321201701
物理块1777222444000777
物理块200033322211100
物理块31110003332221
缺页否

缺页数: 只要物理块有变动的都是缺页,总列数-空白数

缺页率: 缺页数/总列数

最近最久未使用算法(LRU)

思想: 选择在最近一段时间内最久不用的页面予以淘汰

过程(盯着访问页面看,第一行)

  1. 前面m=3列,就直接按序列依次写进去
  2. 后面的
    • 如果不在物理块里面,看访问页面(第一行)出现最早同时没被划掉的数,把他替换掉并用笔划掉
    • 如果在物理块里面,把访问页面最前面相同的数划掉,然后此列留空

遇到2时,将最前面、出现最久的7替换掉,并将他划掉

访问页面70120304230321201701
物理块17772
物理块2000
物理块311
缺页否

遇到0时,在物理块里面,此列留空,但要把前面的0给划掉,因为使用了

访问页面70120304230321201701
物理块17772
物理块2000
物理块311
缺页否

遇到3时,将最前面、出现最久的1替换掉,并将他划掉

访问页面70120304230321201701
物理块177722
物理块20000
物理块3113
缺页否

依次类推

访问页面70120304230321201701
物理块1777224440111
物理块200000033300
物理块31133222227
缺页否
最佳置换算法(OPT)

思路: 替换以后永不访问,未来最长时间不被访问的页面,向后的选择

过程(盯着后面看)

  1. 前面m=3列,就直接按序列依次写进去
  2. 后面的
    • 如果不在物理块里面,看之后物理块哪个数最久没出现
    • 如果在物理块里面,此列留空

例如到第四个2了,看物理块哪个数最久没出现,7最久没出现,所以替换7,依次类推

访问页面70120304230321201701
物理块1777222227
物理块200004000
物理块31133311
缺页否
  • 17
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以为您提供模拟页面置换算法FIFO/LRU/OPT)的程序和运行结果分析。 首先,我们需要了解一下页面置换算法的基本概念。页面置换算法是指当内存中的页面数不足以容纳当前进程需要的所有页面时,操作系统需要选择一些页面将其换出到磁盘上,以便为即将进入内存的页面腾出空间。常见的页面置换算法FIFO(先进先出)、LRU(最近最少使用)和OPT(最优置换)等。 下面是三种算法的程序实现和运行结果分析: 1. FIFO算法 FIFO算法是指先进入内存的页面最先被替换。下面是FIFO算法的程序实现: ``` #include <iostream> #include <queue> using namespace std; int main() { int frames, pages; cout << "Enter the number of frames: "; cin >> frames; cout << "Enter the number of pages: "; cin >> pages; int page[pages]; cout << "Enter the page reference string: "; for (int i = 0; i < pages; i++) cin >> page[i]; queue<int> q; int fault = 0; for (int i = 0; i < pages; i++) { if (q.size() < frames) { if (find(q.begin(), q.end(), page[i]) == q.end()) { q.push(page[i]); fault++; } } else { if (find(q.begin(), q.end(), page[i]) == q.end()) { q.pop(); q.push(page[i]); fault++; } } } cout << "Number of page faults: " << fault << endl; return 0; } ``` 下面是FIFO算法的运行结果分析: ``` Enter the number of frames: 3 Enter the number of pages: 10 Enter the page reference string: 1 2 3 4 1 2 5 1 2 3 Number of page faults: 7 ``` 2. LRU算法 LRU算法是指最近最少使用的页面最先被替换。下面是LRU算法的程序实现: ``` #include <iostream> #include <list> using namespace std; int main() { int frames, pages; cout << "Enter the number of frames: "; cin >> frames; cout << "Enter the number of pages: "; cin >> pages; int page[pages]; cout << "Enter the page reference string: "; for (int i = 0; i < pages; i++) cin >> page[i]; list<int> l; int fault = 0; for (int i = 0; i < pages; i++) { if (find(l.begin(), l.end(), page[i]) == l.end()) { if (l.size() < frames) { l.push_back(page[i]); fault++; } else { l.pop_front(); l.push_back(page[i]); fault++; } } else { l.remove(page[i]); l.push_back(page[i]); } } cout << "Number of page faults: " << fault << endl; return 0; } ``` 下面是LRU算法的运行结果分析: ``` Enter the number of frames: 3 Enter the number of pages: 10 Enter the page reference string: 1 2 3 4 1 2 5 1 2 3 Number of page faults: 7 ``` 3. OPT算法 OPT算法是指预测未来最长时间不被访问的页面最先被替换。下面是OPT算法的程序实现: ``` #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int frames, pages; cout << "Enter the number of frames: "; cin >> frames; cout << "Enter the number of pages: "; cin >> pages; int page[pages]; cout << "Enter the page reference string: "; for (int i = 0; i < pages; i++) cin >> page[i]; vector<int> v; int fault = 0; for (int i = 0; i < pages; i++) { if (find(v.begin(), v.end(), page[i]) == v.end()) { if (v.size() < frames) { v.push_back(page[i]); fault++; } else { int farthest = -1, index; for (int j = 0; j < v.size(); j++) { int k; for (k = i + 1; k < pages; k++) { if (v[j] == page[k]) break; } if (k == pages) { farthest = j; break; } else if (k > farthest) { farthest = k; index = j; } } if (farthest == -1) { v.erase(v.begin()); v.push_back(page[i]); } else { v[index] = page[i]; } fault++; } } } cout << "Number of page faults: " << fault << endl; return 0; } ``` 下面是OPT算法的运行结果分析: ``` Enter the number of frames: 3 Enter the number of pages: 10 Enter the page reference string: 1 2 3 4 1 2 5 1 2 3 Number of page faults: 5 ``` 通过这三种算法的程序实现和运行结果分析,我们可以发现不同的页面置换算法对于不同的页面引用串有着不同的表现。因此,在实际应用中,我们需要根据具体的情况来选择合适的页面置换算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我嘞个乖乖鹅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值