当前位置: 首页 > news >正文

Lecture 19: Memory Management 6

本章小结:

使用虚拟内存时,需要做出几个关键决策

  • 何时将页面加载到内存中
  • 哪些页面会被从内存中移除 ⇒ 页面替换算法
  • 为一个进程分配多少页面,以及这些页面是局部的还是全局
  • 何时将页面从内存中移除 ⇒ 分页守护进程

虚拟内存中可能出现哪些问题 ⇒ 超负荷(thrashing)

页面替换

概念

当新页面被加载且所有页面都被占用时,操作系统必须选择一个页面进行删除。
这一选择是由页面替换算法做出的,并会考虑以下因素:

  • 该页面最后一次被使用的时间/预计下次再次使用的时间
  • 该页面是否已被修改(只有被修改的页面需要进行写入操作)
  • 必须明智地做出替换选择(即非随机选择),以节省时间/避免出现混乱状态。

算法

  1. 最优(Optimal)页面替换
  2. 先进先出(FIFO)页面替换:①第二次机会替换 ②时钟替换
  3. 不最近使用(Not recently used,NRU)
  4. 最近最少使用(Least recently used,LRU)

最优页面替换

在理想/最优的世界里

  • 每一页都会被标注出将要执行的指令数量或再次被使用之前的时长
  • 那些长时间内都不会被引用的页面才是最应该被移除的页面

这种最优策略无法实际应用

  • 它可以用于执行后的分析——即最小的页面故障次数会是多少
  • 它为页面故障次数提供了一个下限(用于与其他算法进行比较)

先进先出(FIFO)页面替换

FIFO 会维护一个链表,并且新页面会添加到链表的末尾。
当发生页面错误时,链表头部的最旧页面会被淘汰。
FIFO 的优点和缺点包括:

  • 易于理解/实现
  • 性能不佳 ⇒ 无论是使用频繁的页面还是使用较少的页面,被淘汰的可能性都相同

模拟:

假设我们有一个包含八个逻辑页面四个物理帧(physical frames,PFs)的系统。
考虑以下页面引用顺序:
0 2 1 3 5 4 6 3 7 4 7 3 3 5 5 3 1 1 1 7 2 3 1 4
所产生的页面错误次数为 13 次。

……

第二次机会替换(Second Chance FIFO)

二次替换先进先出策略:

  • 如果列表前端的页面未被引用,则将其淘汰
  • 如果设置了引用位,则将该页面置于列表末尾,并重置其引用位

二次替换先进先出策略比先进先出策略效果更好,但实现起来成本较高(因为列表会不断变化),而且如果所有页面最初都被引用过,它可能会退化为先进先出策略

第二次机会算法
时钟替换

二次机会先入先出算法可以通过维护一个循环列表来得到改进:

  • 一个指针指向“已访问”的最后一页
  • 该算法被称为(单手)时钟算法
  • 对于长列表来说,其运行速度较

维护列表所花费的时间减少

时钟替换算法

不最近使用(Not recently used,NRU)

被引用和修改的位会保存在页表中:初始时,被引用的位会被设为 0,并会定期重置(例如,系统时钟中断或在搜索列表时进行重置)。
存在四种不同的页面“类型”

  • 类 0:未被引用且未被修改
  • 类 1:未被引用且被修改
  • 类 2:被引用但未被修改
  • 类 3:被引用且被修改

每当发生页面错误时,都会检查页面表条目
可以这样实现:

  1. 类 0 中找到一个要删除的页面
  2. 如果步骤 1 失败,则再次扫描以查找类 1 的页面,并将访问过的每个页面的引用位设置为 0
  3. 如果步骤 2 失败,则从步骤 1 重新开始(类 2 和 3 的元素现在已变为类 0 或 1)

NRU 算法具有良好的性能,并且易于理解和实现

最近最少使用(Least recently used,LRU)

最近最少使用算法会淘汰未被使用时间最长的页面。

  • 操作系统会记录页面的最后使用时间。
  • 每个页面表条目都包含一个计数器字段
  • 这种实现方式成本较高,因为它需要一个按使用顺序排列的页面列表。

该算法可以通过硬件实现,使用一个在每条指令后递增的计数器

假设我们有一个包含八个逻辑页面和四个物理帧(physical frames,PFs)的系统。
考虑以下页面引用顺序:
0 2 1 3 5 4 6 3 7 4 7 3 3 5 5 3 1 1 1 7 2 3 1 4
所产生的页面错误次数为 12 次。

……

总结

最佳页面替换:最佳但不实用
FIFO 页面替换:性能较差但易于实施

  • 第二次机会更换:性能提高但执行不佳
  • 时钟替换:改进了实现,但仍然可能很慢

最近未使用(NRU):易于理解,效率适中(接近LRU)
最近最少使用 (LRU):接近最佳,但更难实现

常驻集

常驻集的大小

应为单个进程分配多少页:

  • 小型常驻集可以在内存中存储更多进程 ⇒ 提高 CPU 利用率
  • 小型常驻集可能会导致更多的页面错误
  • 大型常驻集可能不再降低页面错误率(收益递减)

常驻集的大小系统利用率之间存在权衡

常驻集大小可以是固定的或可变的(即在运行时调整)
对于可变大小的常驻集,替换策略可以是:

  • 局部:替换同一进程的页面
  • 全局:可以从不同的进程中取出页面

使用局部作用域时,需要仔细评估其大小(通常基于工作集页面错误频率

局部页面替换与全局页面替换。(a) 原始配置,右边的数字代表加载时间 (b)
局部 (c) 全局

局部页面替换vs.全局页面替换

全局替换策略可以从整个集合中选择帧,即可以从其他进程“获取”它们

  • 动态分配给进程
  • 进程无法控制自己的页面错误频率,即一个进程的PFF受到其他进程的影响

局部替换策略只能选择分配给当前进程的帧

  • 每个进程都有固定的内存比例
  • 局部“最旧的页面”不一定是全局的“最旧页面”

Windows 使用带有局部替换变量方法
前面介绍的页面替换算法可以使用这两种策略。

工作集

常驻集包括内存中的进程页集
工作集 W(t,k) 包括流程的最后 k(= 工作集窗口)虚拟时间单位中的集合引用页
k 可以定义为“内存引用”或“实际处理时间

  • 最近使用的页面集
  • 在预先指定的时间间隔内使用的页面集

工作集大小可用作应分配给流程的数框的指南

例子:按顺序考虑以下页面引用

如果 k = 3:

  • 在 t1 时,W(t1,3) = {4,5,6}
  • 在 t2 时,W(t1,3) = {4,7}

如果 k = 5:

  • 在 t1 时,W(t1,5) = {2,3,4,5,6}
  • 在 t2 时,W(t1,5) = {2,4,7}

工作集是时间 t 的函数

  • 进程在位置之间移动,因此,工作集中包含的页面随时间变化
  • 稳定的间隔与快速变化的间隔交替出现

|W(t,k)|则在时间上可变。具体说来:1 ≤ |W(t,k)|≤ min(k,N) 
其中 N 是进程的总页数。

为 k 选择正确的值至关重要:

  • :不准确,页面丢失
  • :存在太多未使用的页面
  • 无穷大:进程的所有页面都在工作集中

工作集可用于指导常驻集的大小

  • 监视工作集
  • 从驻留集中删除不在工作集中的页面

工作集的维护成本很高⇒页面错误频率 (page fault frequency,PFF) 可以用作近似值

  • 如果 PFF 增加 ->我们需要增加 k
  • 如果 PFF 非常降低 ->我们可以尝试减少 k

分页守护程序(paging daemon):预清理(⇔需求清理)

主动保留一些空闲页面以备将来的页面错误使用会更有效

  • 如果没有,我们可能必须找到一个要驱逐的页面,并在发生页面错误时首先将其写入驱动器(如果已修改)

许多系统都有一个称为分页守护程序的后台进程

  • 此过程定期运行
  • 它检查帧的状态,如果空闲帧太少,它会选择要逐出的页面(使用页面替换算法)

分页守护进程可以与缓冲(空闲和修改列表)结合使用,⇒写入修改后的页面,但尽可能将它们保留在主内存中

颠簸(Thrashing)

定义抖动

假设所有可用页面在使用中,并且需要加载新页面:即将被逐出的页面必须在不久之后重新加载,即它仍然处于活动状态
当碎片被更换并立即再次加载时,就会发生抖动(颠簸)

恶性循环?

CPU 利用率太低 ⇒调度程序会提高多编程程度 ⇒ 帧被分配给新流程并从现有流程中删除 ⇒ I/O 请求因页面错误而排队
CPU 利用率进一步下降 ⇒ 调度器提高了多编程程度

原因/解决方案

抖动的原因包括:

  • 多编程程度过高,即总需求(即所有工作集大小的总和)超过供应(即可用帧)
  • 单个进程分配的页数太少

这可以通过例如使用良好的页面替换策略、降低多编程程度(中期调度程序)或添加更多内存来防止
页面错误频率可用于检测系统是否正在抖动

理解

FIFO vs. 最佳页面替换算法

将 FIFO/LRU 与最佳页面替换算法进行比较。该进程启动时内存中没有任何页面。
最佳方法产生的最小页面错误数是多少?

步骤 1:统一前提

  • 进程最初 内存中没有任何页(冷启动)。

  • 页面访问串:

    0 2 1 3 5 4 6 3 7 4 7 3 3 5 5 3 1 1 1 7 2 3 1 4

    (共 24 次访问)。

步骤 2:计算最优(OPT,Belady 最小页故障)

OPT 每次都把 下次使用最远(或永不使用) 的页面换出;
帧数未知,但图里给出了 4 个 PF 槽(图中 PF1 … PF4),说明 物理帧 = 4

按 4 帧模拟 OPT:

访问帧0帧1帧2帧3页故障?淘汰页
00
202
1021
30213
502153(3 下一次在第 7,最远)
402141(1 下一次在第 17)
602642(2 下一次在第 21)
30263
707634(4 不再使用)
407640(0 不再使用)
7764
3763
3763
557636(6 不再使用)
5573
3573
157137(7 下一次在第 20)
113
113
7713
227135(5 不再使用)
32713
12713
427143(3 不再使用)

统计页故障:共 14 次


结论

4 个物理帧 的前提下,最优(OPT)算法的最小页故障数为 14

http://www.dtcms.com/a/346284.html

相关文章:

  • linux驱动 day60
  • c语言之进程函数
  • Jetson Xavier NX 与 NVIDIA RTX 4070 (12GB)
  • CMake 快速开始
  • 常用的前端包管理器
  • 现代C#语法糖与核心特性
  • AI唤醒文化遗产新生:AI文物修复缩时、VR沉浸式展项破圈,大众感受千年文明新方式
  • 作品集PDF又大又卡?我用InDesign+Acrobat AI构建轻量化交互式文档工作流
  • AP服务发现PRS_SOMEIPSD_00256和PRS_SOMEIPSD_00631的解析
  • ubuntu 构建c++ 项目 (AI 生成)
  • uboot添加ping命令的响应处理
  • Flowise 任意文件上传漏洞 含Flowise Docker安装、漏洞复现(CVE-2025-26319)
  • 【python】python进阶——推导式
  • 深入理解 Java IO 流 —— 从入门到实战
  • 力扣(在排序数组中查找元素的第一个和最后一个位置)
  • Codeforces 更换
  • 零知开源——基于ESP8266(ESP-12F)驱动YS-IR05F红外控制空调
  • SRE系列(二) | 从可用性到 SLI/SLO
  • nginx-限速-限制并发连接数-限制请求数
  • 洛谷 P3811 【模板】模意义下的乘法逆元-普及/提高-
  • html基本元素
  • 嵌入式第三十五天(网络编程(UDP))
  • 特大桥施工绳断 7 人亡:索力实时监测预警机制亟待完善
  • STM32F1 EXTI介绍及应用
  • tiktok滑块反爬分析verifyV2
  • Linux设备模型技术路线图
  • B树,B+树,B*树
  • Codeforces Round 1043 (Div. 3)
  • set_case_analysis应用举例
  • 技术里常说 没有银弹