3.2.5 抖动和工作集


1.抖动

在操作系统和内存管理的语境下,抖动(Thrashing,又称“颠簸”) 是一个非常关键的概念。

简单来说,抖动就是系统把所有的时间都花在了“搬运页面”上,而没时间运行程序。


1. 什么是抖动?

当一个进程频繁地发生缺页中断,导致系统必须不断地在内存和磁盘之间换入、换出页面,而实际执行指令的时间却变得极少时,我们就说系统陷入了“抖动”状态。

形象比喻:你正在考试(运行程序),但你的脑容量不够(内存不足),每写一个字都要去翻一遍厚厚的参考书(磁盘 I/O)。结果你考试全程都在翻书,一个题也没做完。


2. 产生抖动的根本原因

抖动的本质是:分配给进程的物理块数量,少于该进程正常运行所需的最小物理块数。

主要原因包括:

  1. 多道程序度(Multiprogramming Degree)过高:为了提高 CPU 利用率,系统引入了更多进程。但每个进程分到的内存越来越少,导致所有进程都频繁缺页。
  2. 局部性原理失效:如果一个进程频繁访问的页面(称为“工作集”)大于分配给它的物理块,它就会不停地置换页面。

3. 抖动与 CPU 利用率的关系

这是一个经典的性能曲线:

  • 上升期:随着增加进程数量,CPU 利用率升高(因为一个进程等待 I/O 时,另一个可以运行)。
  • 巅峰期:内存利用率达到饱和。
  • 崩溃期(抖动):如果继续增加进程,CPU 利用率会急剧下降。因为所有的进程都在忙着处理缺页中断,CPU 此时大多处于闲置状态,等待磁盘 I/O 完成。

4. 如何预防和解决抖动?

操作系统通常采用以下策略来对抗抖动:

A. 工作集模型 (Working Set Model)

  • 概念:观察进程在一段时间内真正频繁使用的页面集合。
  • 做法:操作系统只在内存足够容纳进程的“工作集”时,才让该进程运行。如果内存不够,宁可挂起(暂停)某些进程,也不让它们都在内存里“半死不活”。

B. 缺页频率 (Page Fault Frequency, PFF) 策略

  • 这是一种动态调整的方法:
    • 如果某个进程缺页率太高,说明分配给它的内存太少,系统就多给它分配几个物理块。
    • 如果某个进程缺页率极低,说明给它的内存太多了,系统就回收一些物理块给别人。

C. L-S 算法(Load Control)

  • 当系统发现 CPU 利用率下降且缺页率上升时,主动撤销(Swap out)一些进程,释放内存,直到抖动停止。

5. 总结对比

现象产生原因后果解决方法
正常运行内存充足,符合局部性原理CPU 高效执行维持现状
轻微缺页偶尔访问新数据少量 I/O 延迟正常置换算法(LRU/CLOCK)
抖动内存严重不足/进程太多CPU 利用率崩盘,系统假死减少进程数,增加内存

一句话总结:

抖动就是因为“太贪心”,在有限的内存里塞了太多的任务,结果大家都忙着换页,谁也干不了活。

2.工作集

在操作系统(OS)的内存管理中,工作集(Working Set)是一个至关重要的概念,由 Peter Denning 在 1968 年提出。它直接关系到系统如何有效地分配内存以及如何避免“抖动”现象。


1. 什么是工作集?

工作集是指在特定的时间间隔内,进程所访问的页面(Pages)的集合。

简单来说,如果一个进程在过去的一段时间里频繁地访问某些页面,那么在不久的将来,它极有可能还会访问这些页面。为了让进程高效运行而不频繁触发缺页中断,操作系统应当尽量将这些页面保留在物理内存中。

  • 局部性原理(Locality of Reference): 这是工作集模型的理论基础。进程在执行过程中,往往在一段时间内只访问程序的一小部分代码和数据。
  • 工作集窗口(\Delta): 这是一个预定义的参数,表示考察的时间段。如果在时间 t,窗口大小为 \Delta,那么工作集 W(t, \Delta) 就是在时间间隔 (t – \Delta, t) 内被访问过的页面集合。

2. 工作集与常驻集(Resident Set)的区别

理解这两个概念的差异对掌握内存管理非常重要:

特性工作集 (Working Set)常驻集 (Resident Set)
定义进程在一段时间内实际需要使用的页面集合。进程当前实际在内存中存放的页面集合。
性质逻辑上的、动态变化的。物理上的、受系统分配策略影响。
理想状态常驻集 \supseteq 工作集如果常驻集 < 工作集,会频繁发生缺页(抖动)。

3. 工作集的大小变化

工作集的大小并不是固定的,它随程序的执行阶段而变化:

  1. 激变阶段: 当程序进入一个新的函数或处理新数据结构时,工作集会迅速增大。
  2. 稳定阶段: 当程序在某个循环或局部区域内执行时,工作集趋于稳定。

\Delta 的取值影响:

  • 如果 \Delta 太小:无法涵盖进程运行所需的全部活跃页面,导致缺页率升高。
  • 如果 \Delta 太大:会包含很多不再使用的旧页面,浪费内存资源。
  • 如果 \Delta \to \infty:工作集将变成进程自启动以来访问过的所有页面的集合。

4. 工作集模型的作用:防止抖动(Thrashing)

抖动是指系统花费在分页(换入换出)上的时间多于执行程序的时间。

操作系统利用工作集模型来实施全局内存分配策略

  • 监控工作集: OS 监测每个进程的工作集大小。
  • 准入控制: 如果所有活跃进程的工作集之和 \sum W_i 超过了物理内存的总量,OS 就会选择挂起某个进程,将其内存释放给其他进程。
  • 提高多道程序度: 如果物理内存还有大量剩余(远大于工作集之和),OS 可以调入更多进程运行。

5. 实际实现中的挑战

虽然理论很完美,但在硬件层面精确追踪每一个时钟周期的工作集开销巨大。因此,现代操作系统通常使用近似算法,例如:

  • 引用位(Reference Bit): 定期清理引用位,查看哪些页在最近一段时间被访问过。
  • 缺页频率(Page Fault Frequency, PFF): 这是一种更常见的替代方案。如果一个进程缺页率太高,说明它的常驻集小于工作集,系统增加其分配的物理块;反之则减少。

发表评论