什么是 Thrash?

2025年06月13日 | 阅读 6 分钟

在计算机科学中,thrash(抖动)是指虚拟内存(或分页)系统性能低下,当由于缺乏主内存来容纳它们而导致相同的页面被反复加载时。根据配置和算法的不同,系统的实际吞吐量可能会降低多个数量级。

在计算机科学中,当计算机的虚拟内存资源被过度使用时,就会发生thrashing(抖动),导致系统处于持续的分页和页面错误状态,抑制了大多数应用程序级别的处理。它会导致计算机性能下降或崩溃。这种情况会无限期地持续下去,直到用户关闭一些正在运行的应用程序或活动进程释放更多虚拟内存资源。

为了更清楚地了解抖动,首先我们需要了解页面错误和交换。

  • 页面错误:我们知道每个程序都被分成一些页面。当程序尝试访问其地址空间中的数据或代码,但这些数据或代码当前不在系统 RAM 中时,就会发生页面错误。
  • 交换:每当发生页面错误时,操作系统都会尝试从二级存储器中获取该页面,并尝试将其与 RAM 中的某个页面进行交换。这个过程称为交换。

Thrashing(抖动)是指页面错误和交换以非常高的速率频繁发生,然后操作系统必须花费更多时间来交换这些页面。操作系统中的这种状态称为抖动。由于抖动,CPU 的利用率会降低或可以忽略不计。

What is Thrash

所涉及的基本概念是,如果一个进程分配到的帧太少,那么就会发生太多、太频繁的页面错误。结果是,CPU 不会执行有价值的工作,CPU 利用率会急剧下降。

然后,长期调度程序会尝试通过将更多进程加载到内存中来提高 CPU 利用率,从而提高多道程序设计的程度。不幸的是,这会导致 CPU 利用率的进一步下降,触发页面错误增加然后多道程序设计程度增加的连锁反应,称为抖动。

抖动期间的算法

一旦开始抖动,操作系统会尝试应用全局页面替换算法或局部页面替换算法。

1. 全局页面替换

由于全局页面替换可以调入任何页面,因此它会尝试在发现抖动时调入更多页面。但实际发生的情况是,没有一个进程获得足够的帧,结果,抖动会越来越严重。因此,全局页面替换算法不适用于抖动发生时。

2. 局部页面替换

与全局页面替换算法不同,局部页面替换只会选择属于该进程的页面。因此,有可能减少抖动。但事实证明,使用局部页面替换有很多缺点。因此,在抖动场景中,局部页面替换只是全局页面替换的一种替代方案。

抖动的原因

程序或工作负载可能导致抖动,并导致严重的性能问题,例如:

  • 如果 CPU 利用率过低,我们会通过引入新系统来提高多道程序设计的程度。使用全局页面替换算法。CPU 调度器看到 CPU 利用率下降并增加多道程序设计的程度。
  • CPU 利用率与多道程序设计的程度绘制成图。
  • 随着多道程序设计程度的增加,CPU 利用率也随之增加。
  • 如果进一步增加多道程序设计的程度,就会发生抖动,CPU 利用率会急剧下降。
  • 因此,在这一点上,为了提高 CPU 利用率并阻止抖动,我们必须降低多道程序设计的程度。

如何消除抖动

抖动对硬盘健康和系统性能有一些负面影响。因此,有必要采取一些措施来避免它。要解决抖动问题,以下是一些方法,例如:

  • 调整交换文件大小:如果系统的交换文件未正确配置,也可能发生磁盘抖动。
  • 增加 RAM 量:由于内存不足可能导致磁盘抖动,一种解决方案是为笔记本电脑添加更多 RAM。有了更多的内存,您的计算机就可以轻松处理任务,而无需过度工作。通常,这是最佳的长期解决方案。
  • 减少计算机上运行的应用程序数量:如果后台运行的应用程序太多,您的系统资源将消耗大量。剩余的系统资源缓慢,可能导致抖动。因此,在关闭一些应用程序时,可以释放一些资源,以便在一定程度上避免抖动。
  • 替换程序:用内存占用少的等效程序替换占用大量内存的程序。

防止抖动的技术

局部页面替换优于全局页面替换,但局部页面替换有很多缺点,因此有时没有帮助。因此,以下是一些用于处理抖动的其他技术:

1. 局部性模型

局部性是指一组一起被积极使用的页面。局部性模型表明,当进程执行时,它会从一个局部性移动到另一个局部性。因此,程序通常由几个不同的局部性组成,这些局部性可能重叠。

例如,当调用一个函数时,它定义了一个新的局部性,其中内存引用被指向函数调用指令、局部和全局变量等。同样,当函数退出时,进程将离开这个局部性。

2. 工作集模型

该模型基于上述局部性模型的概念。

基本原理是,如果我们为一个进程分配足够的帧来容纳其当前局部性,那么只有当它移动到新的局部性时才会发生故障。但是,如果分配的帧少于当前局部性的大小,则进程一定会抖动。

根据此模型,基于参数 A,工作集定义为最近 'A' 次页面引用中的页面集。因此,所有活动使用的页面最终都会成为工作集的一部分。

工作集的准确性取决于参数 A 的值。如果 A 太大,那么工作集可能会重叠。另一方面,对于较小的 A 值,局部性可能无法完全覆盖。

如果 D 是帧的总需求量,WSSi 是进程 i 的工作集大小,

D = ⅀ WSSi

现在,如果 'm' 是内存中可用的帧数,则有两种可能性:

  • D>m,即总需求超过了帧数,那么就会发生抖动,因为某些进程将无法获得足够的帧。
  • D<=m,那么就不会发生抖动。

如果有多余的帧,那么可以加载更多进程到内存中。另一方面,如果工作集大小的总和超过了帧的可用性,则必须挂起一些进程(将其从内存中换出)。

此技术可防止抖动,同时确保尽可能高的多道程序设计程度。因此,它优化了 CPU 利用率。

3. 页面错误频率

处理抖动的一种更直接的方法是使用页面错误频率概念。

What is Thrash

与抖动相关的问题是高页面错误率,因此,这里的概念是控制页面错误率。

如果页面错误率过高,则表示分配给该进程的帧太少。相反,低页面错误率表明该进程拥有过多的帧。

可以为所需的页面错误率设置上限和下限,如图所示。

如果页面错误率低于下限,可以从进程中删除帧。同样,如果页面错误率超过上限,可以为进程分配更多帧。

换句话说,系统的图形状态应保持在给定图中所形成的矩形区域内。

如果页面错误率很高但没有可用帧,可以将一些进程挂起,并将分配给它们的帧重新分配给其他进程。挂起的进程稍后可以重新启动。