3.2.2 请求分页管理方式

1.页表机制

在请求分页系统中,页表机制是实现虚拟存储最基础的数据结构。它不仅负责逻辑地址到物理地址的映射,还记录了页面在内存中的状态,为“调页”和“置换”提供依据。

相比于基本分页系统,请求分页系统的页表项(Page Table Entry)增加了几个非常关键的字段

一个典型的请求分页页表项结构如下:

页号物理块号状态位 (P)访问字段 (A)修改位 (M)外存地址

各个字段的作用详解:

1. 状态位 (Present/Absent bit, P)

  • 作用: 标识该页当前是否已经在内存中。
  • 逻辑: * 1:在内存中,地址转换机构可以直接读取物理块号。
    • 0:不在内存中,此时会触发缺页中断,请求操作系统从磁盘调入。

2. 访问字段 (Access bit, A)

  • 作用: 记录该页在一段时间内被访问的次数,或者记录上次被访问的时间。
  • 用途: 为页面置换算法(如 LRU)提供参考。当内存满时,系统会查看这个字段,挑出那些“不常被访问”的页面换出到外存。

3. 修改位 (Dirty bit, M)

  • 作用: 标识该页在调入内存后是否被修改过(即是否写过该页的内容)。
  • 意义: 提高效率。
    • 如果 M=0(未修改):页面被换出时,直接覆盖即可,不需要写回磁盘。
    • 如果 M=1(已修改):页面被换出前,必须先写回磁盘,以保证数据一致性。

4. 外存地址

  • 作用: 指出该页在磁盘上的物理地址(通常在交换区/Swap Space)。
  • 用途: 当发生缺页中断时,系统根据这个地址去磁盘上找到该页的内容并调入内存。

页表在地址变换中的工作流程:

当进程访问某个逻辑地址时,地址变换机构的操作如下:

  1. 查快表(TLB): 首先在高速缓存中找,如果命中,直接得到物理地址。
  2. 查页表: 如果快表没中,去内存查页表。
  3. 检查状态位:
    • 如果状态位为 1:说明在内存,将页表中的物理块号与页内偏移量拼接,得到物理地址。同时更新“访问字段”和“修改位”。
    • 如果状态位为 0:产生缺页中断。CPU 转去执行缺页处理程序:
      • 检查内存是否有空闲块。
      • 若无空闲块,根据置换算法(利用“访问字段”)选出一页换出。
      • 若换出的页“修改位”为 1,则需写回磁盘。
      • 根据“外存地址”将新页调入内存,更新页表中的状态位和物理块号。

总结:

请求分页的页表就像是一个“动态追踪表”,它不仅告诉你“去哪里找这个数据”,还告诉 CPU “这个数据现在在不在家”、“你有没有改过它”以及“我们要不要把它踢走”。

2.缺页中断机构

在请求分页系统中,缺页中断机构是实现“虚实转换”最关键的动力源泉。当程序试图访问一个当前不在内存中的页面时,这个机构就会“跳”出来,通知操作系统去搬运数据。

以下是关于缺页中断机构的深度解析:


1. 什么是缺页中断?

缺页中断是一种内部中断(也称为“异常”或“陷阱”)。

当 CPU 执行指令并进行地址变换时,如果发现要访问的页面在页表中的状态位为 0(不在内存中),硬件就会立即产生一个缺页中断信号。


2. 缺页中断的处理全过程

处理缺页中断不仅需要硬件(MMU)的侦测,更需要操作系统内核的介入。流程如下:

  1. 保护现场: CPU 暂停当前进程,保存通用寄存器和指令计数器(PC)的值。
  2. 查表定位: OS 检查该虚拟地址是否合法。如果合法,则从页表中找到该页在外存(磁盘)的具体位置。
  3. 寻找空闲块:
    • 如果有空闲内存块,直接分配。
    • 如果没有空闲块,则调用页面置换算法(如 LRU),选出一个“牺牲页”。如果该页被修改过,还需先写回磁盘。
  4. 启动 I/O 调页: 操作系统发出磁盘读取请求,将缺失的页面装入空闲内存块。此时进程进入阻塞状态,等待磁盘搬运数据。
  5. 修改页表: 数据搬完后,修改页表项:
    • 填入新的物理块号。
    • 状态位改为 1。
  6. 恢复现场并重新执行: 进程回到就绪队列。当再次获得 CPU 时,重新执行那条曾经引起缺页的指令

3. 缺页中断的“三大特性” (与一般中断的区别)

缺页中断是一类非常特殊的中断,它有三个显著特征:

  • 在指令执行期间产生: 普通中断(如 I/O 完成)通常在一条指令执行完后才去检查处理;而缺页中断是在指令执行过程中,因为拿不到数据被迫中断。
  • 一条指令可能触发多次: 如果一条指令需要访问多个内存地址(比如双操作数指令),且这些地址分布在不同的页面,那么执行这一条指令可能连着跳出多次缺页中断。
  • 指令复执: 普通中断处理完后通常执行下一条指令;缺页中断处理完后,必须重新执行被中断的那一条指令,因为上次失败是因为没数据,现在数据有了,得重试。

4. 对性能的影响

缺页中断是一个“极其沉重”的操作。

  • CPU 速度是纳秒(ns)级别的。
  • 磁盘访问是毫秒(ms)级别的。

由于两者速度相差数万倍,如果程序频繁缺页(这种现象称为抖动/置换),系统的效率会呈断崖式下跌。因此,设计好的页面置换算法和保持适当的驻留集大小至关重要。

3.地址变换机构

在操作系统中,请求分页管理方式是在基本分页管理的基础上,增加了“请求调页”和“页面置换”功能。其地址变换机构是实现虚拟存储器的核心。

相比于基本分页,请求分页的地址变换过程更加复杂,因为它需要处理页面不在内存中的情况。


1. 核心流程图解

请求分页的地址变换主要分为以下几个关键阶段:

2. 详细变换步骤

假设 CPU 给出一个逻辑地址(由页号 P页内偏移量 W 组成):

  1. 检索快表 (TLB):
    • 首先在快表中查找该页号 P。
    • 若命中: 直接从快表中取出物理块号 b,与偏移量 W 拼接形成物理地址。同时修改页表项中的“访问位”(用于置换算法)。
    • 若未命中: 进入下一步,查找内存中的页表。
  2. 检索页表 (Page Table):
    • 根据页表始址和页号 P 找到对应的页表项。
    • 检查状态位 (P): 查看该页是否已调入内存。
      • 状态位为 1: 表示在内存中。读取物理块号 b,拼装物理地址,并更新快表
      • 状态位为 0: 表示不在内存中,触发缺页中断 (Page Fault)
  3. 处理缺页中断:
    • 操作系统接管 CPU,进入缺页中断处理程序。
    • 检查内存是否有空闲块:
      • 有空闲块:从外存将目标页调入,写入页表。
      • 无空闲块:通过页面置换算法(如 LRU、FIFO)选择一页换出。如果被换出的页在内存中被修改过(查看“修改位”),需写回外存。
    • 更新页表项(填入物理块号,状态位置 1)。
  4. 重新执行指令:
    • 页面调入后,CPU 重新执行刚才导致中断的指令。此时,页号 P 已在内存中,地址变换成功。

3. 页表项结构的差异

请求分页的页表项比基本分页多了几个关键字段,以支持虚拟存储:

字段名作用
页号 / 物理块号地址映射的基础。
状态位 (P)指示该页是否已调入内存。
访问字段 (A)记录该页被访问的次数或时间,供置换算法参考。
修改位 (M)标识该页调入内存后是否被修改过(决定换出时是否要写回磁盘)。
外存地址该页在外存(通常是磁盘 Swap 分区)的存放位置。

4. 关键特点总结

  • 两次查表: 第一次查 TLB,第二次查内存页表。
  • 异常处理: 增加了“缺页中断”处理逻辑,涉及 I/O 操作(从磁盘读页),这是地址变换中最耗时的部分。
  • 动态更新: 随着页面的换入换出,页表和快表的内容在频繁动态变化。

发表评论