• 【操作系统学习】内存管理(四)


    内存管理目录:

    基本概念和内存分配

    虚拟内存技术

    局部页面替换算法

    全局页面替换算法

    10. 局部页面替换算法

    (1)最优页面置换算法

    • 基本思路:
      • 当一个缺页中断发生时,对于保存在内存当中的每一个逻辑页面,计算在它的下一次访问之前,还需要等待多长时间,从中选择等待时间最长的那个,作为被置换的页面。
    • 这只是一种理想情况,在实际操作系统中无法实现。因为操作系统无法知道每个页面需要等待多长时间才会再次被访问。
    • 可用于其他算法的性能评价的依据。

    (2)先进先出算法

    • 基本思路:
      • 选择在内存中驻留时间最长的页面并淘汰之。具体来说,系统维护着一个链表,记录了所有位于内存当中的逻辑页面。从链表的排列顺序来看,链首页面的驻留时间最长,链尾页面最短。当发生缺页中断时,把链首淘汰出局,并把新的页面添加到链表的末尾。
    • 性能较差,调出的页面有可能是要经常访问的页面,并且有Belady现象。
    • FIFO算法很少单独使用。

    •v swa 
3 
2 
Frame List 
Time 
R uests 
0 
3 
Faults 
a 
b 
d 
c 
a 
b 
d 
a 
a 
b 
d 
d 
a 
b 
d 
4 
b 
a 
b 
d 
5 
e 
—e 
b 
c 
d 
6 
b 
e 
b 
d 
7 
e 
d 
8 
e 
a 
9 
e 
a 
b 
10 
a 
b

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

    • 当一个缺页中断发生时,选择最久未使用的那个页面,并淘汰之。
    • 它是对最优页面置换算法的一个近似,其依据是程序的局部性原理,即在最近一小段时间内,如果某些页面被频繁访问,那么在将来的一小段时间内,它们还可能被频繁地访问。反过来,如果在过去某些页面长时间未被访问,那么在将来它们还可能会长时间地得不到访问。
    • 需要记录各个页面使用时间的先后顺序,开销较大。两种可能实现方法:
      • 维护一个页面链表。
      • 设置一个活动页面栈。

    Time 
Requests 
0 
3 
Faults 
Time page 
last used 
o 
a 
b 
1 
a 
b 
d 
2 
a 
b 
3 
d 
a 
b 
d 
4 
b 
a 
b 
5 
a 
b 
d 
6 
b 
a 
b 
7 
a 
a 
b 
8 
a 
b 
9 
a 
b 
10 
a 
b

    (4)时钟页面置换算法

    • 基本思路:
      • 需要用到页表项中的访问位,当一个页面被装入内存时,把该位初始化位0.然后如果该为被访问,把该位置为1
      • 把各个页面组织成环形链表(类似钟面),把指针指向最老的页面(最先进来)
      • 当发生一个缺页中断时,考察指针所指向的最老页面,若它的访问位为0,立即淘汰;若访问位为1,则把该位置为0,然后指针往下移动一格。如此下去,直到找到被淘汰的页面,然后把指针移动到它的下一格。

    Time 
Requests 
0 
3 
Faults 
o 
a 
b 
1 
c 
a 
b 
c 
2 
a 
a 
b 
3 
d 
a 
b 
4 
b 
5 
b 
6 
e 
b 
c 
7 
b 
a 
8 
b 
a 
9 
b 
a 
10 
b 
a 
Page table entries 
for resident pages:

    (5)二次机会法

    Enhanced Clock algorithm 
Page 1: 
resident bit 
used bit 
dirty bit 
Page 4: 
3 
Before clock 
sweep 
used dirty 
1 
1 
1 
After clock 
sweep 
used dirty 
replace page 
1 
16

    Time 
Requests 
0 
00 
3 
Faults 
e table 
entries 
sident 
ages 
o 
a 
b 
10 a 
10 b 
10 
1 
a 
b 
2 
a 
b 
c 
3 
d 
a 
b 
c 
d 
4 
a 
b 
c 
10 d 
5 
a 
b 
00 d 
6 
a 
b 
00 d 
7 
a 
b 
00 d 
8 
a 
b 
d 
9 
a 
b 
11 a 
10 
a 
e 
00

    (6)最不常使用算法(LFU)

    • 基本思路:
      • 当一个缺页中断发生时,选择访问次数最少的那个页面,并淘汰之。
    • 实现方法
      • 对每个页面设置一个访问计数器,每当一个页面被访问时,该页面的访问计数器+1 在发生缺页中断时,淘汰计数器最小的那个页面。
    • LFU和LRU的区别
      • LRU考察的是多久未访问,时间越短约好。而LFU考察的是访问的次数或频度,访问次数越多越好。

    Belady现象:

    • 在采用FIFO算法时,有时会出现分配的物理页面数增加,缺页率反而提高的异常现象
    • 原因
      • FIFO算法的置换特性与进程访问内存的动态特性是矛盾的,与置换算法的目标是不一致的(即替换较少使用的页面),因此,被它替换出去的页面不一定是进程不会访问的。

    LRU 、 FIFO 和 Clockfij 比 较 
· LRU 算 法 和 FIFO 本 质 上 都 是 先 进 先 出 的 思 路 , 只 不 过 LRU 是 针 对 页 面 的 最 
近 访 问 时 间 来 进 行 排 序 , 所 以 需 要 在 每 一 次 页 面 访 问 的 时 候 动 态 地 调 整 
各 个 页 面 之 间 的 先 后 顺 序 ( 有 一 个 页 面 的 最 近 访 问 时 间 变 了 ) ; 而 FIFO 
是 针 对 页 面 进 入 内 存 的 时 间 来 进 行 排 序 , 这 个 时 间 是 固 定 不 变 的 , 所 以 
各 页 面 之 间 的 先 后 顺 序 是 固 定 的 。 如 果 一 个 页 面 在 进 入 内 召 后 没 有 被 访 
问 , 那 么 它 的 最 近 访 问 时 间 就 是 它 进 入 内 存 的 时 间 。 换 旬 话 说 , 如 果 内 
荏 当 中 的 所 有 页 面 都 未 访 问 过 , 那 么 LRU 算 法 就 退 化 为 FIFO 算 法 。 
例 如 : 给 进 程 分 配 3 个 物 理 页 面 , 逻 辑 页 面 的 访 问 顺 序 为 1 、 2 、 3 、 4 、 5 、 
6 、 1 、 2 、 3 “ ·

    · LRU 算 法 性 能 较 好 , 但 糸 统 开 销 较 大 ; FIFO 算 法 系 统 开 销 较 小 , 但 可 能 会 
发 生 Beladyn 象 。 因 此 , 折 表 的 办 法 就 是 Clock 算 法 , 在 每 一 次 页 面 访 问 
时 , 它 不 去 动 态 地 调 整 该 页 面 在 链 表 当 中 的 顺 序 , 而 仅 仅 是 做 一 个 标 
记 , 然 后 等 到 发 生 缺 页 中 断 的 时 候 , 再 把 它 移 动 到 链 表 末 尾 。 对 于 内 召 
当 中 那 些 未 被 访 问 的 页 面 , Clock 算 法 的 表 现 和 LRIJ 算 法 一 样 好 ; 而 对 于 
那 些 经 被 访 问 过 的 页 面 , 它 不 能 象 LRU 算 法 那 样 , 记 住 它 们 的 准 确 位 置 。

  • 相关阅读:
    logstash入门
    Gray Code LeetCode 89
    Longest Valid Parentheses Leetcode 32 一种奇特的解法
    写一个播放视频文件的ActiveX控件——MFC版(原创)
    一种用于网络播放的ActiveX控件
    《COM原理与应用》学习笔记——一个简单的COM组件的实现
    《COM原理与应用》学习笔记——COM的实现
    《COM原理与应用》题外话——C++虚函数表和delete this
    《COM原理与应用》学习笔记二——COM对象和COM接口的实现
    《COM原理与应用》学习笔记一
  • 原文地址:https://www.cnblogs.com/keeptry/p/15726345.html
Copyright © 2020-2023  润新知