崇左市网站建设_网站建设公司_SSL证书_seo优化
2025/12/26 23:59:54 网站建设 项目流程

1.页面缓冲算法

页面缓冲算法(Page Buffering Algorithm, PBA) 并不是一种独立的页面置换算法,而是一种对现有置换算法(如 FIFO 或 LRU)的优化策略

它的核心思想是:不再直接丢弃被换出的页面,而是将它们暂时缓存在内存中一段时间。 这种策略最早在 VAX/VMS 操作系统中取得成功,现代操作系统(如 Windows)也广泛采用了类似的机制。


1. 核心机制:两个核心链表

当一个页面被选为“牺牲者”(Victim Page)准备换出时,PBA 并不立即将其内容擦除或写回磁盘,而是根据该页面的状态将其挂在以下两个链表之一:

1.1 空闲页链表 (Free Page List)

  • 对象: 未被修改过的页面(干净页,Clean Pages)。
  • 操作: 页面虽然从进程的页表中移除,但其内容仍保留在物理内存的帧中。
  • 用途: 如果进程稍后再次访问该页,可以直接从该链表中“救回来”,只需修改页表指向即可,无需磁盘 I/O。

1.2 修改页链表 (Modified Page List)

  • 对象: 曾被修改过的页面(脏页,Dirty Pages)。
  • 操作: 这些页面暂时不写回磁盘,而是集中缓存在链表中。
  • 用途: 只有当链表长度达到一定阈值,或者系统磁盘 I/O 空闲时,才批量(Batching)将它们写回磁盘。写回后,这些页面会转入“空闲页链表”。

2. 页面缓冲算法的优势

相比于传统的“换出即消失”策略,页面缓冲具有以下显著优点:

  1. 实现“软缺页中断”(Soft Page Fault):

    如果被置换出的页面很快又被访问(这在程序具有局部性时非常常见),系统可以从缓冲链表中直接找回。这种操作的开销远小于从磁盘读取的“硬缺页中断”。

  2. 大幅减少磁盘 I/O 次数:

    修改页链表通过批量写回的方式,将多次零散的随机写入转化为一次连续的顺序写入。这对于机械硬盘(HDD)的寻道优化至关重要,也能延长固态硬盘(SSD)的寿命。

  3. 降低进程等待时间:

    当发生缺页需要新帧时,系统可以立即从“空闲页链表”中拿出一个帧给进程,而不需要等待旧的脏页写回磁盘。这显著缩短了进程在缺页中断时的阻塞时间。


3. 典型应用场景:FIFO 的“救星”

传统的 FIFO(先进先出) 算法因为性能较差(可能换出活跃页面,甚至出现 Belady 异常)在现代系统中很少单独使用。

但是,FIFO + 页面缓冲 的组合却非常高效:

  • FIFO 负责决定谁该离开(实现简单,开销极低)。
  • 页面缓冲负责“兜底”,防止错杀活跃页面。

注: Windows 操作系统中的“备用列表(Standby List)”和“已修改列表(Modified List)”本质上就是页面缓冲算法的变体。


4. 与普通置换算法的对比

特性 普通页面置换 (如纯 LRU/FIFO) 带缓冲的页面置换 (PBA)
换出操作 立即写回磁盘或丢弃内容 放入缓冲链表,保留内容
错误惩罚 极高(必须再次读取磁盘) 很低(内存内找回,软缺页)
磁盘写入 逐页写回,随机 I/O 多 批量写回,顺序 I/O 优化
系统开销 较高(涉及驱动和硬件等待) 较低(主要是链表指针操作)

2.页框回收

在操作系统中,页框(Page Frame)是物理内存被分割成的固定大小单元,而页框回收是内存管理中极其关键的一个环节。

简单来说,当系统运行一段时间后,物理内存(RAM)会被填满。为了给新的进程或数据腾出空间,操作系统必须决定哪些内存不再紧急,并将其“回收”。


1. 为什么要进行页框回收?

物理内存是有限的资源。如果没有有效的回收机制,系统很快就会因为内存耗尽(OOM, Out of Memory)而崩溃。回收的核心目标是:保持系统始终有一定的空闲物理页框,以应对突发的内存需求。


2. 哪些内容可以被回收?

操作系统将内存中的内容分为几类,回收时的优先级和处理方式各不相同:

类型 内容示例 回收方式
文件缓存 (File-backed Pages) 读取的磁盘文件、程序代码段。 如果没被修改过,直接丢弃;如果修改过(脏页),写回磁盘后丢弃。
匿名页 (Anonymous Pages) 进程的堆(Heap)、栈(Stack)、数据段。 不能直接丢弃,必须先写入 交换分区(Swap),再次使用时再换入。
内核缓存 (Slab Cache) 目录项缓存(dentry)、索引节点缓存(inode)。 根据内核定义的收缩函数(Shrinker)进行释放。

3. 触发回收的时机(以 Linux 为例)

Linux 系统不会等到内存完全为 0 才开始回收,而是设立了“水位线”(Watermarks):

  1. 后台回收(Background Reclamation):

    当空闲内存低于 低水位(Low Watermark) 时,内核线程(如 kswapd)会被唤醒,在后台异步地回收内存,直到内存回到高水位。

  2. 直接回收(Direct Reclamation):

    如果内存消耗太快,降到了 最小水位(Min Watermark) 以下,此时进程在申请内存时会被阻塞,必须亲自原地进行回收工作,完成后才能获得内存。这会导致明显的系统卡顿。

  3. OOM Killer:

    如果上述方法都无法释放出内存,系统会祭出最后的手段:强制杀掉一个得分最高(占用内存多且不那么重要)的进程。


4. 常见的回收算法

回收时,系统需要挑选哪些页框最“不常用”,通常基于以下算法:

  • 最近最少使用算法 (LRU): 维护两个链表:活跃(Active)和非活跃(Inactive)。回收时优先从非活跃链表的尾部开始。
  • 二次机会算法 / Clock 算法: 检查页面的引用位(Reference Bit),给最近被访问过的页面“第二次机会”。
  • 反向映射 (Reverse Mapping): 这是回收中最难的一步。一个物理页框可能被多个进程的虚拟地址映射,回收前必须通过反向映射找到所有相关的页表项,并解除映射。

5. 页框回收与你之前提到的概念

  • 与工作集的关系: 页框回收算法会尽量避免回收属于进程“工作集”内的页面,否则会引发抖动。
  • 与页面缓冲的关系: 页面缓冲算法实际上是为回收提供了一个“缓冲区”。被回收的页先进入缓冲链表,如果进程马上又要用,可以快速找回,从而降低回收带来的性能损失。

总结

页框回收是操作系统的“清洁工”。它平衡了内存利用率系统响应速度。如果回收太积极,会浪费 CPU 资源并导致频繁 I/O;如果回收太消极,系统则面临崩溃风险。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询