【学习笔记】计算机操作系统(五)—— 虚拟存储器

第五章 虚拟存储器

文章目录

  • [第五章 虚拟存储器](#第五章 虚拟存储器)
    • [5.1 虚拟存储器概述](#5.1 虚拟存储器概述)
      • [5.1.1 常规存储管理方式的特征和局部性原理](#5.1.1 常规存储管理方式的特征和局部性原理)
      • [5.1.2 虚拟存储器的定义和特征](#5.1.2 虚拟存储器的定义和特征)
      • [5.1.3 虚拟存储器的实现方法](#5.1.3 虚拟存储器的实现方法)
    • [5.2 请求分页存储管理方式](#5.2 请求分页存储管理方式)
      • [5.2.1 请求分页中的硬件支持](#5.2.1 请求分页中的硬件支持)
      • [5.2.2 请求分页中的内存分配](#5.2.2 请求分页中的内存分配)
      • [5.2.3 页面调入策略](#5.2.3 页面调入策略)
    • [5.3 页面置换算法-决定应该换出哪个页面](#5.3 页面置换算法-决定应该换出哪个页面)
      • [5.3.1 最佳置换算法和先进先出置换算法](#5.3.1 最佳置换算法和先进先出置换算法)
      • [5.3.2 最近最久未使用和最少使用置换算法](#5.3.2 最近最久未使用和最少使用置换算法)
      • [5.3.3 Clock置换算法](#5.3.3 Clock置换算法)
      • [5.3.4 页面缓冲算法(Page Buffering Algorithm,PBA)](#5.3.4 页面缓冲算法(Page Buffering Algorithm,PBA))
      • [5.3.5 访问内存的有效时间【有效访问时间(Effective Access Time)】](#5.3.5 访问内存的有效时间【有效访问时间(Effective Access Time)】)
    • [5.4 "抖动"与工作集](#5.4 “抖动”与工作集)
      • [5.4.1 多道程序度与"抖动'](#5.4.1 多道程序度与“抖动’)
      • [5.4.2 工作集](#5.4.2 工作集)
      • [5.4.3 "抖动"的预防方法](#5.4.3 “抖动”的预防方法)
    • [5.5 请求分段存储管理方式](#5.5 请求分段存储管理方式)
      • [5.5.1 请求分段中的硬件支持](#5.5.1 请求分段中的硬件支持)
      • [5.5.2 分段的共享与保护](#5.5.2 分段的共享与保护)

5.1 虚拟存储器概述

内存容量不够大导致的情况:

  • 有的作业很大,其所要求的内存空间超过了内存总容量,作业不能全部被装入内存,致使该作业无法运行;
  • 有大量作业要求运行,但由于内存容量不足以容纳所有这些作业,只能将少数作业装入内存让它们先运行,而将其它大量的作业留在外存上等待。

解决办法:

  • 一个是从物理上增加内存容量,但会受到机器自身的限制,而且要增加系统成本,因此这种方法是受到一定限制的。
  • 另一种方法是从逻辑上扩充内存容量------虚拟存储技术。

5.1.1 常规存储管理方式的特征和局部性原理

1、常规存储器管理方式的特征

传统存储器管理方式(如连续分配、分页、分段等)具有以下两个共同特征:

  • 一次性(One-time Loading)
    • 定义 :作业必须 一次性全部装入内存 才能开始运行。
    • 问题
      • 大作业无法在小内存中运行(内存容量限制)。
      • 浪费内存空间:许多程序和数据在运行时可能根本用不到(如错误处理代码、冷门功能模块)。
      • 限制多道程序度:内存被部分无用程序占用,导致其他作业无法装入,降低了系统并发能力。
  • 驻留性(Residency)
    • 定义 :作业一旦装入内存,就 全部驻留,直到运行结束 ,即使某些部分不再使用也不会被换出。
    • 问题
      • 内存资源浪费:已运行过的代码或暂时不用的数据仍占用内存(如初始化模块)。
      • 阻塞进程占用内存:长期等待的进程(如I/O阻塞)无法释放内存供其他作业使用。

2、局部性原理

程序在执行时将呈现出局部性规律:即在一较短的时间内,程序的执行仅局限于某个部分,相应地,它所访问的存储空间也局限于某个区域。

  • 程序以顺序执行为主
    • 除了跳转和函数调用,大部分指令是顺序执行(如高级语言中的 FORTRANC 代码)。
  • 过程调用的深度有限
    • 函数调用栈的深度通常不超过 5 层(如 A→B→C→D→E),程序会在少数几个函数中反复执行。
  • 循环结构的高频执行
    • 循环体(如 for(int i=0; i<1000; i++))的指令占比小,但执行次数极多。
  • 许多对数据结构的处理往往都局限于很小的范围内
    • 数组、结构体等数据的操作往往集中在相邻内存区域

局限性又表现在下述两个方面:

  • 时间局限性。如果程序中的某条指令 ++被执行,则不久以后, 该指令可能再次执行++ ; 如果某数据 ++被访问过,则不久以后, 该数据可能再次被访问++ 。产生时间局限性的典型原因是在程序中存在着大量的循环操作
  • 空间局限性。一旦程序 ++访问了某个存储单元,在不久之后,其附近的存储单元也将被访问++ ,即程序在一段时间内所访问的地址可能集中在一定的范围之内,其典型情况便是程序的顺序执行
类型 定义 实例
时间局部性 近期访问的指令/数据可能再次被使用 循环变量 i、高频调用的函数 printf()
空间局部性 访问某个地址后,附近地址可能被访问 数组遍历 a[i]、顺序指令执行

3、虚拟存储器的基本工作情况

核心思想

利用 ++局部性原理++ ,程序运行时 无需一次性全部装入内存 ,而是 按需动态调入所需的 少量页(段) 其余部分保留在磁盘上 。当访问的页(段)不在内存时,触发 缺页(段)中断,由操作系统调入内存。

关键机制与流程

请求调页(Demand Paging)

  • 触发条件 :程序访问的页 不在内存(页表项标记为无效)。
  • 处理流程
    • CPU 生成缺页中断,OS 捕获中断。
    • OS 检查磁盘(如交换区),找到目标页。
    • 若内存有空闲:直接调入页,更新页表。
    • 若内存满 :触发页面置换

页面置换(Page Replacement)

  • 目标为新页腾出空间
  • 流程 :将内存中暂时不用的页(段)调至盘上,腾出足够的内存空间后,再将要访问的页(段)调入内存,使程序继续执行下去。

5.1.2 虚拟存储器的定义和特征

1、虚拟存储器的定义

  • 虚拟存储器,是指具有请求调入功能置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。
    【用户感觉到的内存容量会比实际内存容量大得多的错觉】
  • 逻辑容量内存容量和外存容量之和所决定,其 ++运行速度接近于内存速度++ ,而每位的 ++成本却又接近于外存++

基于局部性原理,在程序装入时,可以将程序中很快会用到的部分装入内存,暂时用不到的部分留在外存,就可以让程序开始执行。

在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。

若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存

在操作系统的管理下,在用户看来似乎有一个比实际内存大得多的内存,这就是虚拟内存

操作系统虚拟性的一个体现,实际的物理内存大小没有变,只是在逻辑上进行了扩充。

2、虚拟存储器的特征

  • 多次性 。是指一个作业中的程序和数据无需在作业运行时一次性地全部装入内存,而是允许被分成多次调入内存运行,即只需将当前要运行的那部分程序和数据装入内存即可开始运行。每当要运行到尚未调入的那部分程序时,再将它调入。
  • 对换性
    • 是指一个作业中的程序和数据,无须在作业运行时一直常驻内存,而是允许在作业的运行过程中进行换进、换出
    • 在进程运行期间,允许将那些暂不使用的代码和数据从内存调至外存的对换区(换出),待以后需要时再将它们从外存调至内存(换进)
    • 还允许将暂时不运行的进程调至外存,待它们重又具备运行条件时再调入内存
  • 虚拟性 。是指能够从逻辑上扩充内存容量,使用户所看到的内存容量远大于实际内存容量。可以改善内存的利用率,可以提高程序执行的并发程度,从而可以增加系统的吞吐量

5.1.3 虚拟存储器的实现方法

虚拟存储器的实现,建立在++离散分配++存储管理方式的基础上。

1、请求分页系统

  • 请求分页系统是在分页系统的基础上加了请求调页功能页面置换功能所形成的页式虚拟存储系统
  • 允许用户程序只装入少数页面的程序(及数据)即可启动运行。
  • 再通过 调页功能页面置换功能 陆续地把即将运行的页面调入内存,同时把暂不运行的页面换出到外存上
  • 置换是以页面为单位
  • 硬件支持:
    • 请求分页的页表机制
    • 缺页中断机构------以请求 OS 将所缺的页调入内存。
    • 地址变换机构
  • 软件支持:
    • 实现请求调页的软件
    • 实现页面置换的软件

2、请求分段系统

  • 请求分段系统是在分段系统的基础上,增加了请求调段分段置换功能后所形成的段式虚拟存储系统
  • 允许用户程序只要装入少数段的程序和数据即可启动运行。
  • 再通过 调段功能段的置换功能暂不运行的段调出,再调入即将运行的段
  • 置换是以段为单位进行的。
  • 硬件支持:
    • 请求分段的段表机制
    • 缺段中断机构------以请求 OS 将所缺的段调入内存。
    • 地址变换机构
  • 软件支持:
    • 实现请求段页的软件
    • 实现段置换的软件

5.2 请求分页存储管理方式

请求分页系统是建立**在基本分页基础上的,增加了请求调页功能和页面置换功能。**相应地,每次调入和换出的基本单位都是长度固定的页面,这使得请求分页系统在实现上要比请求分段系统简单(请求分段在换进和换出时是可变长度的段)。

5.2.1 请求分页中的硬件支持

1、请求页表机制

基本作用仍然是将用户地址空间中的逻辑地址映射为内存空间中的物理地址。

请求分页系统中的页表

页号 物理块号 状态位P 访问字段A 修改位M 外存地址
  • 状态位(存在位)P: 该字段仅有一位,故又称位字。它用于指示该页是否已调入内存++供程序访问时参考++
  • 访问字段A: 用于记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问++提供给置换算法(程序)在选择换出页面时参考++
  • 修改位M: 标识该页在调入内存后是否被修改过++供置换页面时参考++
    由于内存中的每一页都在外存上保留一份副本,在置换该页时,
    • 未被修改,就不需再将该页写回到外存上,以减少系统的开销和启动磁盘的次数;
    • 已被修改,则必须将该页重写到外存上,以保证外存中所保留的副本始终是最新的。
  • 外存地址: 用于指出该页在外存上的地址,通常是物理块号++供调入该页时参考++

2、缺页中断机构

每当所要访问的页面不在内存时,便产生一缺页中断,请求OS将所缺之页调入内存。

缺页中断

缺页中断是因为当前执行的指令想要访问的目标页面未调入内存而产生的,因此属于内中断【信号来源CPU内部】

内中断分为:

  • 陷阱、陷入(trap)【有意而为之的异常,如系统调用】、
  • 故障(fault)【由错误条件引起的,可能被故障处理程序修复,如缺页中断】、
  • 终止(abort)【不可恢复的致命错误造成的结果,终止处理程序不再将控制返回给引发终止的应用程序,如整数除0】

缺页中断属于++内中断++ 的++故障++

缺页中断和一般中断对比:

  • 相同之处:都需要经历诸如保护CPU环境、分析中断原因、转入缺页中断处理程序进行处理,以及在中断处理完成后再恢复 CPU环境等几个步骤。

  • 不同之处:两方面

    • 缺页中断:在指令执行期间,若发现所要访问的指令或数据不在内存时,产生和处理中断信号。
      一般中断:在CPU执行完一条指令后,才检查是否有中断请求到达。若有,便去响应,否则,继续执行下一条指令。
    • 一条指令在执行期间可能产生多次缺页中断。

3、地址变换机构

快表:快表中有的页面一定是在内存中的。若某个页面被换出外存,则快表中的相应表项也要删除,否则可能访问错误的页面

5.2.2 请求分页中的内存分配

1、最小物理块数

概念最小物理块数 (Minimum Number of Frames)是指**保证进程能正常运行所需的最少物理内存块(页框)数量。若系统分配的物理块数 ++少于该值,进程将因频繁缺页而无法有效执行++**,甚至导致死锁或崩溃。

最小物理块数的影响因素

最小物理块数由计算机的 硬件结构指令特性 决定,主要包括:

  1. 指令格式与长度
    • 单字节指令 vs 多字节指令(可能跨页存储)。
  2. 寻址方式
    • 直接寻址、间接寻址(需要额外访问内存)。
  3. 操作数存储位置
    • 源地址和目标地址可能分布在不同的页面中。

常见场景与最小物理块需求

硬件/指令特性 最小物理块数 原因分析
单地址指令 + 直接寻址 2 1块存指令页,1块存数据页。
支持间接寻址 3 需额外1块存储间接地址指向的页(如 LOAD @A 需访问A地址的内容)。
多字节指令 + 复杂寻址 6 指令本身跨2页,源操作数和目标操作数各跨2页(共6页),缺页时需全部调入。

2、内存分配策略

驻留集: 指请求分页存储管理中给进程分配的物理块的集合。驻留集大小一般小于进程的总大小

在请求分页系统中,可采取两种内存分配策略,即固定和可变分配策略。在进行置换时,也可采取两种策略,即全局置换和局部置换。于是可组合出以下三种适用的策略。

固定分配(Fixed Allocation)驻留集大小不变

  • 定义 :系统**预先给每个进程分配 固定数量的物理内存块, 运行期间不再改变**。
  • 缺页处理(局部置换适用):
    • 如果进程缺页,只能在自己的固定块范围内选一页换出(如LRU),再调入新页。
    • 内存总量不变(即使其他进程有空闲块,也不能借用)。

可变分配(Variable Allocation)驻留集大小可变

  • 定义 :系统初始分配一定数量的物理块,但运行期间可动态调整(根据缺页率、优先级等增减)。
    • 增加块 :若进程频繁缺页,可给它更多内存块(从空闲池或其他进程回收)。
    • 减少块 :若进程很少缺页,可回收其部分内存块给其他进程。

局部置换(Local Replacement)只换自己的

  • 定义:进程缺页时,只能从自己占用的物理块中选一页换出不能从其他进程的内存选

    • 无论用固定分配还是可变分配,只要规则是"仅置换自己的页",就属于局部置换。
  • 保证公平性 :一个进程的缺页不会影响其他进程的内存

  • 可能低效:如果进程内存不足,即使系统有空闲块也无法借用(需配合可变分配优化)。

全局置换(Global Replacement)可以换其他进程的

  • 有空闲内存时 (空闲块队列还有剩余):
    • 直接分配一块给缺页进程,把缺的页加载进来。
  • 内存全满时 (所有内存都被占用了):
    • 所有进程的内存中按某种规则选一页换出,腾出空间。
    • 🔄 换出的可能是其他进程的页(不一定是当前缺页进程的)。
    • 然后调入缺的页。
    • ❗ 关键点:置换的范围是全局的整个系统的内存),不局限于当前进程
  • 减少了内存浪费(所有空闲/非活跃内存都能使用)。
  • 可能"饿死"部分进程(某些进程的页频繁被换出,导致性能下降)。

固定分配 + 局部置换(Fixed Allocation, Local Replacement)

  • 核心特点

    • 分配方式 :进程启动时分配固定数量的物理块(页框),运行时不再调整

    • 置换方式 :缺页时,仅允许从当前进程已分配的物理块中选择一页置换

  • 优点

    • 内存隔离性各个进程的内存占用稳定,不会互相干扰

    • 实现简单:适用于批处理系统或嵌入式系统,无需动态调整分配。

  • 缺点

    • 难以确定合适的分配数

      • 分配太少 → 频繁缺页,降低吞吐量。
      • 分配太多 → 内存浪费,减少并发进程数。
    • 不够灵活:若进程访问模式变化(如突发大量数据需求),可能出现性能瓶颈。

  • 适用场景

    • 批处理系统(如早期的IBM大型机)。

    • 内存管理要求简单、无需动态调整的场景。

可变分配 + 全局置换(Variable Allocation, Global Replacement)

  • 核心特点

    • 分配方式

      • 初始分配一定数量 的物理块,进程 运行期间可动态增减
      • 缺页时优先使用系统空闲块 ,仅当 无空闲块时才全局置换
    • 置换方式

      • 若所有空闲块耗尽,OS 所有进程(包括其他进程)中选择一个未锁定的页面换出
      • 置换后,被换出的进程的物理块数可能减少,缺页率会增加
  • 优点

    • 内存利用率高:空闲块可灵活分配给需要的进程。

    • 减少全局抖动问题多个进程的物理块可以动态共享,避免局部置换导致的性能骤降。

    • 实现简单(如Unix类系统常用此策略)。

  • 缺点

    • 公平性问题:
      • "贪婪进程"问题频繁缺页的进程可能占用更多物理块,导致其他进程缺页率上升
      • 全局置换可能会降低某些低优先级进程的性能
  • 适用场景

    • 交互式系统(如Linux、Windows)。

    • 内存资源紧张但需要动态调整分配的场景。

可变分配 + 局部置换(Variable Allocation, Local Replacement)

  • 核心特点

    • 分配方式

      • 初始分配一部分物理块,并根据进程实际缺页率动态调整
        • 频繁缺页的进程增加物理块
        • 极少缺页的进程回收物理块给高需求进程
    • 置换方式 :缺页时 仅在该进程内部选页置换,不影响其他进程

  • 优点

    • 高效且公平

      • 既能适应进程的内存需求变化,又不会因全局置换导致资源抢夺。
      • 动态监测进程缺页率,调整物理块分配。
    • 降低抖动风险:全局置换可能导致某些进程被"饿死",而本地置换不会影响其他进程。

  • 缺点

    • 实现复杂
      • 需要监控每个进程的缺页率
      • 动态调整策略可能增加计算开销
  • 适用场景

    • 多任务分时系统(如VMS虚拟机系统)。

    • 需要平衡内存利用率和公平性的现代操作系统。

策略对比总结

策略 分配特点 置换特点 优点 缺点 适用场景
固定分配 + 局部置换 固定(启动时确定) 仅换出当前进程的页 简单、进程隔离性强 缺乏灵活性,易缺页或内存浪费 批处理系统
可变分配 + 全局置换 动态调整 可换出任何进程的页 内存利用率高,减少抖动 易出现"贪婪进程"抢占资源问题 通用操作系统(Linux)
可变分配 + 局部置换 基于缺页率动态调整 仅换出当前进程的页 高效且公平,减少全局干扰 实现较复杂 现代多任务系统(VMS)

3、物理块分配算法

平均分配算法:即将系统中所有可供分配的物理块平均分配给各个进程。但由于 ++未考虑到各进程本身的大小++ ,会造成实际上的不公平
按比例分配算法:即根据进程的大小按比例分配物理块。如果系统中共有个进程,每个进程的页面数为Si,则系统中各进程页面数的总和为
S = ∑ i = 1 n S i S = \sum_{i=1}^{n}S_i S=i=1∑nSi

又假定系统中可用的物理块总数为m, 则每个进程所能分到的物理块数为bi可由下式计算:
b i = S i S × m = 页数占比 × 物理块总数 b i 应该取整数且必须大于最小物理块数 b_i = \frac{S_i}{S} × m = 页数占比 × 物理块总数 \\ b_i应该取整数且必须大于最小物理块数 bi=SSi×m=页数占比×物理块总数bi应该取整数且必须大于最小物理块数
考虑优先权的分配算法

  • 通常采取的方法是把内存中可供分配的所有物理块分成两部分: 一部分按比例地分配给各进程; 另一部分则根据各进程的优先权进行分配,为高优先进程适当地增加其相应份额。
  • 在有的系统中,如重要的实时控制系统,则可能是完全按优先权为各进程分配其物理块的。

5.2.3 页面调入策略

1、何时调入页面

预调页策略 - 运行前调入

🔹 基本思想 :若进程的页在外存连续存放,将那些预计在不久之后便会被访问的页面预先调入内(基于预测或程序员的经验)。

🔹 适用场景

  1. 进程首次加载时(初始化阶段)
    • 程序员或系统可指定初始需要加载的页(如代码段、全局数据)。++【主要用于进程的首次调入,运行前调入】++
  2. 基于工作集(Working Set)的预加载
    • 每个进程维护一个工作集表,记录运行时常用的页面集合。
    • 进程被调度时,直接调入工作集中的所有页,减少运行时缺页。

🔹 优点减少缺页中断频率:若预测准确,可显著提升性能(如批处理任务)。

🔹 缺点

  • 预测不准时效率低:若预加载的页多数未被访问,反而浪费I/O和内存。
  • 成功率仅约50%:当前预测技术有限,难以保证效果。

请求调页策略 - 运行时调入

🔹 基本思想"缺页才调入" :进程运行时,仅当访问的页不在内存时 ,才触发缺页中断,由OS从外存调入该页

🔹 适用场景现代虚拟存储系统的默认策略(如Linux、Windows)。

🔹 优点

  1. 精确性 :调入的页一定被访问,无内存浪费。
  2. 实现简单:无需复杂预测逻辑。

🔹 缺点

  1. 单页调入开销大 :每次缺页都可能触发磁盘I/O,频繁中断降低性能
  2. 启动磁盘次数多 :若进程缺页率高,系统吞吐量会下降

📊 两种策略对比

策略 触发条件 调入单位 优点 缺点
预调页 预测或初始化时批量调入 多页 减少缺页中断 预测不准浪费资源,成功率仅50%
请求调页 缺页时按需调入 单页 精准利用内存,实现简单 频繁I/O,系统开销大

2、从何处调入页面

请求分页系统 中,外存(磁盘)通常分为两部分

  1. 文件区 :存放文件数据,采用离散分配,访问速度较慢。
  2. 对换区(Swap区) :存放被换出的页面,采用连续分配,访问速度快。

📋 三种调入策略

1. 系统有足够对换区空间

🔹 策略

  • 进程运行前 ,把 所有相关文件(如代码、数据)复制到对换区
  • 缺页时 全部从对换区调入(速度快)。

🔹适用场景批处理系统 或内存要求稳定的环境(如HPC计算)。

🔹优点I/O效率高(对换区连续分配,读取速度快)。

🔹缺点占用大量对换区空间,不适合高并发或小内存系统。

2. 系统缺少足够对换区空间

🔹 策略

  • 未被修改的页(静态):
    • 直接从 文件区 调入(无需写回)。
    • 换出时 直接丢弃 (因为未修改,不需要重新写回磁盘)。
  • 可能被修改的页(动态):
    • 换出时 存入对换区 (防止数据丢失)。
    • 下次调入时 从对换区调回 (读写快)。

🔹适用场景分时系统(如早期Linux),内存紧张但需要支持多进程。

🔹 优点节省对换区空间,仅存储动态修改的页。

🔹 缺点对文件区I/O压力较大(静态页多次从文件区读取)。

3. UNIX方式(混合策略)

🔹 策略

  • 首次访问的页 :从 文件区 调入。
  • 曾被换出的页 :从 对换区 调入(读写快)。
  • 共享页优化 :若其他进程已调入该页,直接共享内存,避免重复I/O(如多个进程加载相同库文件)。

🔹 适用场景现代UNIX/Linux系统(支持共享内存、按需分页)。

🔹 优点

  • 兼顾速度与空间利用率:
    • 静态数据(代码)只需文件区加载一次
    • 动态数据(堆、栈)使用高速对换区
  • 共享页减少冗余I/O

🔹 缺点管理复杂度高,需维护共享页的引用计数。


📊 三种策略对比

策略 对换区使用 调入来源 适用系统
充足对换区 完全占用 全部来自对换区(快) 批处理
不足对换区 仅存修改过的 文件区(静态)或对换区(动态) 早期分时系统
UNIX方式(共享+混合) 动态管理 文件区(首次)或对换区(换出过) 现代UNIX/Linux

3、页面调入过程

📌 1. 触发缺页中断

  • 条件 :CPU访问某页,发现其 页表项(PTE)的"存在位=0"(该页不在内存)。
  • 硬件行为:
    • 保存当前CPU现场(寄存器、程序计数器等)。
    • 进入内核态,调用缺页中断处理程序

📌 2. 中断处理流程

(1)查找页表,获取外存位置 :操作系统 查询页表 ,找到该页在 外存(磁盘)的物理块号(如Swap区或文件区)。

(2)检查内存是否已满

  • 内存有空闲帧 :直接跳转至 (4)
  • 内存已满 :需先执行页面置换(按某种算法,如LRU、FIFO):
    • 选择一页作为 牺牲页(Victim Page)
    • 检查牺牲页的修改位 (Dirty Bit):
      • 修改位=0 (未修改过):直接丢弃,无需写回磁盘(如代码段)。
      • 修改位=1 (已修改过):必须 写回磁盘(防止数据丢失)。

(3)启动磁盘I/O :换出旧页,同步写入磁盘或者丢弃

(4)调入缺页

  • 从外存读取缺页到内存的空闲帧
  • 更新页表
    • 设置 存在位=1
    • 更新 物理帧号
    • 若支持 TLB(快表),同时更新或失效对应条目。

(5)恢复执行 :缺页处理完成后,恢复CPU现场 ,重新执行引发缺页的指令。此时 页已在内存,可正常访问数据。

4、缺页率

通常,缺页率受到以下几个因素的影响:

  • 页面大小。页面划分较大,则缺页率较低。
  • 进程所分配物理块的数目。所分配的物理块数目越多,缺页率越低。
  • 页面置换算法。算法的优劣决定了进程执行过程中缺页中断的次数。
  • 程序固有特性。根据程序执行的局部性原理,程序编制的局部化程度越高,相应执行时的缺页程度越低。

缺页率计算:

假设一个进程的逻辑空间为n页,系统为其分配的内存物理块数为m(m≤n)。
f = F A 访问页面失败 ( 即所访问页面不在内存中,需要从外存调入 ) 的次数为 F 访问页面成功 ( 即所访问页面在内存中 ) 的次数为 S 该进程总的页面访问次数为 A = S + F f = \frac{F}{A} \\访问页面失败(即所访问页面不在内存中,需要从外存调入)的次数为F\\访问页面成功(即所访问页面在内存中)的次数为S\\该进程总的页面访问次数为A=S+F f=AF访问页面失败(即所访问页面不在内存中,需要从外存调入)的次数为F访问页面成功(即所访问页面在内存中)的次数为S该进程总的页面访问次数为A=S+F

假设被置换的页面被修改的概率是β, 其缺页中断处理时间为ta,被置换页面没有被修改的缺页中断时间为tb,那么,缺页中断处理时间的计算公式为
t = β × t a + ( 1 − β ) × t b t = β × t_a + (1-β) × t_b t=β×ta+(1−β)×tb

5.3 页面置换算法-决定应该换出哪个页面

5.3.1 最佳置换算法和先进先出置换算法

最佳(Optimal)置换算法

基本思想

  • 目标 :通过 淘汰未来最长时间不再被访问的页面【以后永不使用,或者在最长时间内不再被访问的页面】 ,达到最低缺页率
  • 特性
    • 是一种 理论最优算法 , 实际系统中无法提前获取页面的未来访问序列,该算法无法实现
    • 用于评价其他置换算法的优劣(如FIFO、LRU等)。

工作原理

  • 策略 :当需要置换页面时,选择满足以下条件之一的页淘汰:
    1. 未来永不使用 的页(理想情况)。
    2. 未来最长时间内不被访问 的页(次优情况)。

先进先出(FIFO)页面置换算法

基本思想

  • 目标 :通过 淘汰最早进入内存的页面,实现简单的页面置换。
  • 特性
    • 是最早出现的置换算法,实现简单(仅需队列管理)。
    • 与程序运行规律不符,可能淘汰常用页面(如全局变量、高频代码页)。
    • 无法保证最低缺页率 ,且 可能出现Belady异常Belady 异常--当为进程分配的物理块数增大时,缺页次数不减反增的异常现象。)。【只有 FIFO 算法会产生 Belady 异常

工作原理

  • 策略
    1. 维护一个 页面队列 ,记录页面的 进入内存的顺序++【队列的最大长度取决于系统为进程分配了多少个内存块】++
    2. 设置替换指针(始终指向驻留时间最长的页)。
    3. 当需要置换时,淘汰替换指针指向的页

5.3.2 最近最久未使用和最少使用置换算法

最近最久未使用LRU(Least Recently Used)置换算法

基本思想

  • 目标 :通过 淘汰最近最久未使用的的页面,实现简单的页面置换。
  • 特性
    • 基于时间局部性最近被访问的页面很可能短期内再次被访问)。
    • 访问即更新:每次访问页面时,将其标记为"最新使用"。
    • 逼近最优置换(OPT) :理论上,LRU 的缺页率接近OPT算法

工作原理

  • 策略

    组成部分 作用
    访问字段(t) 记录页面自上次被访问以来的时间,t越大表示越久未被使用
    淘汰策略 选择内存中t最大 的页面(即最久未被访问的页)进行置换
    硬件支持 寄存器和栈两类硬件之一

最少使用(Least Frequently Used,LFU)置换算法

核心目标:

  • 选择 访问频率最低 的页面作为 淘汰对象
  • 通过硬件(移位寄存器)高效 记录页面的相对访问频率 ,而非精确统计。【因为在每一时间间隔内,只是用寄存器的一位来记录页的使用情况,因此,在该时间间隔内,对某页访问一次和访问1000次是完全等效的。

移位寄存器的工作流程

  • 每个页面对应一个N位移位寄存器(如8位)。
  • 访问页面时 :将寄存器的最高位置1 (如从0000 0000变为1000 0000)。
  • 定时右移 (如每100ms):1000 00000100 00000010 0000 → ... → 0000 00010000 0000
  • 寄存器值(R)的物理意义:
    • R越大:近段时间访问越频繁。
    • R越小 (如0000 0000):长时间未被访问,优先淘汰

5.3.3 Clock置换算法

时钟置换算法是一种性能和开销较均衡的算法,又称CLOCK算法,或最近未用算法(NRU,Not Recently Used)

简单的 Clock 置换算法

实现方法:

  • 每个页面设置一个访问位------访问位为1,表示最近访问过; 访问位为0,表示最近没访问过

  • 再将内存中的页面都通过链接指针链接成一个循环队列

  • 当需要淘汰一个页面时,只需检查页的访问位

    • 如果是0,就选择该页换出

    • 如果是1,则将它置为0暂不换出继续检查下一个页面

  • 若第一轮扫描中所有页面都是1,则将这些页面的访问位依次置为0后,再进行第二轮扫描(++第二轮扫描中一定会有访问位为0的页面++ ,因此简单的CLOCK算法选择一个淘汰页面 ++最多会经过两轮扫描++ )

改进型 Clock 置换算法

在其他条件都相同时,应优先淘汰没有修改过的页面,避免I/O操作。

  • 修改位=0,表示页面没有被修改过;
  • 修改位=1,表示页面被修改过。

算法规则:

将所有可能被置换的页面排成一个循环队列

  • 第一轮【第一优先级:最近没访问且没修改的页面】:从当前位置开始扫描到第一个(0,0)的帧用于替换。本轮扫描不修改任何标志位
  • 第二轮【第二优先级:最近没访问,但修改过的页面】:若第一轮扫描失败,则重新扫描,查找第一个(0,1)的帧用于替换。本轮将所有扫描过的帧访问位设为0
  • 第三轮【第三优先级:最近访问过,但没修改的页面】:若第二轮扫描失败,则重新扫描,查找第一个(0,0)的帧用于替换。本轮扫描修改任何标志位
  • 第四轮【第四优先级:最近访问过且修改过的页面】:若第三轮扫描失败,则重新扫描,查找第一个(0,1)的帧用于替换。

由于第二轮已将所有帧的访问位设为0,因此经过第三轮、第四轮扫描定会有一个帧被选中,因此改进型CLOCK置换算法选择一个淘汰页面最多会进行四轮扫描

算法规则 优缺点
OPT 优先淘汰最长时间内不会被访问的页面 缺页率最小,性能最好,但无法实现
FIFO 优先淘汰最先进入内存的页面 实现简单;但性能很差,可能出现Belady异常
LRU 优先淘汰最近最久没访问的页面 性能很好;但需要硬件支持,算法开销大
CLOCK(NRU) 循环扫描各页面第一轮淘汰访问位=0的,并将扫描过的页面访问位改为1。若第一轮没选中,则进行第二轮扫描。 实现简单,算法开销小;但未考虑页面是否被修改过。
改进型CLOCK(改进型NRU) 若用(访问位,修改位)的形式表述,则第一轮:淘汰(00) 第二轮:淘汰(0,1),并将扫描过的页面访问位 都置为0 第三轮:淘汰(0,0) 第四轮:淘汰(0,1) 算法开销较小,性能也不错

5.3.4 页面缓冲算法(Page Buffering Algorithm,PBA)

影响页面换进换出效率的若干因素

影响页面换进换出效率的因素包括有: 对页面进行置换的算法、将已修改页面写回磁盘的频率,以及将磁盘内容读入内存的频率。

1. 页面置换算法的选择

关键影响:算法的优劣直接决定缺页率:

  • 好的算法(如LRU、Clock)能减少缺页次数,降低换入换出开销。
  • 差的算法(如FIFO)可能导致频繁抖动(Thrashing),严重影响性能。

2. 已修改页面的写回磁盘策略

问题背景

  • 换出已修改页面(脏页)必须写回磁盘,否则数据会丢失。
  • 频繁写磁盘(每页换出都触发I/O)效率极低:每次换出都需要寻道+写入,导致高延迟

优化策略:批量写回 ------"已修改换出页面链表"(Dirty Page List)

  • 延迟写入 :被换出的脏页暂不写入磁盘,而是加入链表。

  • 批量刷新 :积累一定数量(如64页)后,一次性写入磁盘

  • 优势:显著减少磁盘I/O次数(减少寻道时间)。

3. 从磁盘读入内存的频率优化

问题背景

  • 传统方式:每次缺页都需从磁盘读取(慢)。
  • 读取相同页面的重复I/O浪费资源

优化策略:缓冲换出页面 ------利用"已修改换出页面链表"缓存数据:

  • 若进程再次访问链表中的页面 ,可直接从内存重新挂回驻留集,无需磁盘I/O。
  • 显著减少换入开销(省去磁盘读取时间)。

总结对比表

影响因素 问题 优化方案
置换算法 高缺页率导致频繁换入换出 选择LRU/Clock等高效算法
写回磁盘频率 单页写回导致高I/O延迟 使用【已修改换出页面链表】批量写入
读入内存频率 重复从磁盘读取相同页面 【已修改换出页面链表】将页面缓冲,直接从内存恢复

页面缓冲算法 PBA

PBA(Page Buffering Algorithm,页面缓冲算法)是 一种通过减少频繁换入换出 来提高内存管理效率的技术。其核心特点如下:

  1. 显著减少页面换入换出的频率
    • 采用缓冲链表机制,降低磁盘IO操作次数,减少换入换出开销。
  2. 可采用简单置换策略
    • 由于换入换出开销降低,甚至可以采用 FIFO(先进先出) 等简单置换算法,无需特殊硬件支持,实现简单。

📌 VAX/VMS 中的PBA实现

VAX/VMS 采用 "可变分配 + 局部置换" 策略:

  • 每个进程分配一定数量的物理块,系统保留部分空闲物理块

  • 通过两种链表优化效率

    • 1. 空闲页面链表(Free Page List)

      📝 作用 :减少换入 时的磁盘读取开销。

      工作原理

      • 未被修改的页面换出不真正写入磁盘 ,而是挂到空闲链表末尾
      • 后续需要该页面数据时直接从链表取回无需从磁盘重新读取
      • 缺页时优先使用空闲链表的物理块装载新页,减少分配延迟。

      🔹 优点

      • 减少换入I/O(避免重复从磁盘加载相同页面)。
      • 提升物理块利用率(未被修改页面可快速回收)。
    • 2. 修改页面链表(Modified Page List)

      📝 作用 :减少换出(脏页)的磁盘写入开销

      工作原理

      • 已修改的页面换出不立即写回磁盘 ,而是挂到修改链表末尾
      • 积累一定数量(或空闲时)再批量写入磁盘(比单页写入更高效)。

      🔹 优点

      • 减少换出I/O(批量写入降低磁盘寻道时间)。
      • 防止频繁写回磁盘导致的性能下降

📌 关键策略对比

链表类型 适用页面 优化方向 I/O减少方式
空闲页面链表 未修改页 换入优化 直接取回,避免磁盘读取
修改页面链表 已修改页 换出优化 延迟批量写入磁盘

5.3.5 访问内存的有效时间【有效访问时间(Effective Access Time)】

没有考虑快表的命中率和缺页率等因素

被访问页在内存中,且其对应的页表项在快表中。

显然,此时不存在缺页中断情况,内存的有效访问时间(EAT)分为查找快表的时间(λ)和访问实际物理地址所需的时间(t):
E A T = λ + t EAT = λ + t EAT=λ+t
被访问页在内存中,且其对应的页表项不在快表中。

显然,此时也不存在缺页中断情况,但需要两次访问内存,一次读取页表,一次读取数据,另外还需要更新快表。所以,这种情况内存的有效访问时间可分为查找快表的时间、查找页表的时间、修改快表的时间和访问实际物理地址的时间:
E A T = λ + t + λ + t = 2 × ( λ + t ) EAT = λ + t + λ + t = 2 × (λ + t) EAT=λ+t+λ+t=2×(λ+t)
被访问页不在内存中

因为被访问页不在内存中,需要进行缺页中断处理,所以这种情况的内存的有效访问时间可分为查找快表的时间、查找页表的时间、处理缺页中断的时间、更新快表的时间和访问实际物理地址的时间: 假设缺页中断处理时间为ε,则
E A T = λ + t + ε + λ + t = ε + 2 × ( λ + t ) EAT = λ + t + ε + λ + t = ε + 2 × (λ + t) EAT=λ+t+ε+λ+t=ε+2×(λ+t)
考虑快表的命中率和缺页率等因素

a 表示命中率,f 表示缺页率
E A T = λ + a × t + ( 1 − a ) × [ t + f × ( ε + λ + t ) + ( 1 − f ) × ( λ + t ) ] EAT = λ + a × t + (1-a) × [t + f × (ε+λ+t) + (1-f) × (λ+t)] EAT=λ+a×t+(1−a)×[t+f×(ε+λ+t)+(1−f)×(λ+t)]

EAT = λ + 命中部分 + 未命中部分

  • λ 【 TLB查找必定发生(即无论是否命中,都要先查TLB)】

  • 命中部分 = 命中概率 * 访问实际物理地址所需的时间(t)

  • 未命中部分 = 未命中概率 *【查页表 + 缺页概率 *(处理缺页中断的时间 + 更新快表的时间 + 访问实际物理地址的时间)+ 不缺页概率 *(更新快表的时间 + 访问实际物理地址的时间)】


第一步:查TLB(必做)

  • 无论是否命中,首先花费 λ 时间 查快表(TLB)
  • 这一步是 固定的 ,所以 λ 放在最前面(不受命中率a影响)。

第二步:根据TLB命中情况选择路径

  • (1)TLB命中(概率a)
    • 直接访问物理内存,耗时 t,所以贡献 a × t。
  • (2)TLB未命中(概率1-a)
    • 需要 查页表(默认页表在内存,时间 t)。
    • 再次细分:
      • (2.1)缺页(概率f):
        • 发生缺页中断(时间 ε)
        • 更新快表TLB(时间 λ)
        • 访问物理内存(时间 t)
        • 贡献 f × (ε + λ + t)
      • (2.2)不缺页(概率1-f):
        • 更新TLB(时间 λ)
        • 访问物理内存(时间 t)
        • 贡献 (1-f) × (λ + t)

如果不考虑命中率,仅考虑缺页率,即上式中的λ=0和a=0,
E A T = t + f × ( ε + t ) + ( 1 − f ) × t EAT = t + f × (ε + t) + (1 - f) × t EAT=t+f×(ε+t)+(1−f)×t

5.4 "抖动"与工作集

5.4.1 多道程序度与"抖动'

多道程序度与处理机的利用率

产生"抖动"的原因

同时在系统中运行的进程太多,由此分配给每一个进程的物理块太少,不能满足进程正常运行的基本要求,致使每个进程在运行时,频繁地出现缺页,必须请求系统将所缺之页调入内存。这会使得在系统中排队等待页面调进/调出的进程数目增加。显然,对磁盘的有效访问时间也随之急剧增加,造成每个进程的大部分时间都用于页面的换进/换出,而几乎不能再去做任何有效的工作,从而导致发生处理机的利用率急剧下降并趋于0的情况。

抖动/颠簸:刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存,这种频繁的页面调度行为

产生抖动的主要原因是进程频繁访问的页面数目高于可用的物理块数(分配给进程的物理块不够)

5.4.2 工作集

进程发生缺页率的时间间隔与进程所获得的物理块数有关。缺页率随着所分配物理块数的增加明显地减少,当物理块数超过某个数目时,再为进程增加一物理块,对缺页率的改善已不明显。

定义

工作集(Working Set) 是指在**某时间段(Δ)内,进程实际活跃访问的页面集合,反映了进程运行时的局部性特征(Locality of Reference)**。

表示

是把某进程在时间t的工作集记为** w(t,Δ),其中的变量Δ称为工作集的 "窗口尺寸"(Windows size)**。

代表进程在时间间隔(t-Δ,t)中引用页面的集合。

  • Δ 通常是预设的,但可动态调整以适应负载。
  • t - Δ 确实随 t 增加而增加,实现窗口滑动,保证工作集始终反映"最新活跃页面"。

驻留集:当前进程实际占用的物理内存页 < 工作集频繁缺页(抖动,Thrashing)。

驻留集:当前进程实际占用的物理内存页 > 工作集内存浪费(其他进程得不到足够内存)。

5.4.3 "抖动"的预防方法

1、采取局部置换策略

⚡ 可变分配+局部置换

优点 缺点
✅ 抖动影响被限制在单个进程内,避免全局性能下降 ❌ 抖动进程的缺页处理时间变长(需排队等待磁盘I/O)
✅ 实现简单(无需跨进程协调) ❌ 磁盘I/O队列增长,间接影响其他进程的缺页中断处理时间
✅ 适用于低耦合的多任务系统 ❌ 无法真正解决抖动,只是"容忍"抖动

📌 关键问题:为什么局部置换无法根治抖动?

  1. 抖动进程的驻留集【驻留集:指请求分页存储管理中给进程分配的物理块的集合】不足
    • 若进程工作集突然增大(如加载新数据),但驻留集无法动态扩展(局部置换限制),则 缺页率飙升,频繁触发磁盘I/O。
  2. 磁盘I/O队列拥堵
    • 抖动进程的缺页请求堆积在磁盘队列中,导致 其他进程的缺页响应延迟,形成隐性连锁反应。
    • 案例:进程A抖动 → 高频率请求换页 → 磁盘队列满 → 进程B的缺页被迫等待 → 整体吞吐量下降。
  3. 长期低效运行
    • 抖动进程可能长期处于"缺页-换页-再缺页"循环,浪费CPU和磁盘资源,但因其驻留集隔离,OS难以主动干预。

2、把工作集算法融入到处理机调度中

📌 关键机制

  1. CPU 利用率低时的策略
    • 工作集优化:先检查现有进程的驻留集(RS)是否足够,避免盲目调入导致抖动。
  2. 工作集检查逻辑
    • 📊 检查驻留页是否"足够多" (即RS ≈ WS):
      • 足够 (缺页率低):允许调入新作业提升 CPU 利用率
      • 不足 (缺页率高):优先扩充缺页率高的进程的物理块拒绝调入新作业,防止恶化系统性能。
    • ⚖️ 目标 :平衡 CPU 利用率内存稳定性

3、利用"L=S"准则调节缺页率

L(缺页间隔时间)

  • 定义系统平均两次缺页(Page Fault)之间的时间间隔
  • 意义 :反映进程的缺页频率。L↑ → 缺页率低;L↓ → 缺页率高。

S(缺页服务时间)

  • 定义处理一次缺页(置换页面)所需的平均时间(包括磁盘I/O)
  • 意义 :反映磁盘的处理能力。S↓ → 磁盘响应快;S↑ → 磁盘负载高。

⚖️ "L=S"准则的核心思想

Denning 提出,理想的多道程序度(内存中并发进程数)应使 L ≈ S,此时:

  • 磁盘利用率CPU利用率同时达到最优(无空闲、无过载)。
  • 系统处于平衡状态,避免因过度并发导致抖动(Thrashing)。

📌 三种情况分析

条件 物理意义 系统状态 优化措施
L ≫ S 缺页间隔远大于磁盘处理时间 磁盘闲置,CPU利用率低 【现象: 缺页很少发生(例如每100ms缺页一次,但磁盘处理一次缺页仅需5ms)。 磁盘长期处于空闲状态,CPU可能因等待数据而闲置。】 增加多道程序度(调入更多进程)
L ≪ S 缺页间隔远小于磁盘处理时间 磁盘过载,抖动风险高 【 现象: 缺页频繁发生(例如每1ms缺页一次,但磁盘处理一次缺页需10ms)。 磁盘请求 积压,形成I/O队列,CPU因等缺页而挂起。】 减少多道程序度(暂停部分进程)
L ≈ S 缺页速度与磁盘处理速度匹配 CPU和磁盘均高效运行 【 现象: 缺页间隔时间 ≈ 磁盘处理时间(例如L=5ms, S=5ms)。 磁盘刚处理完一个缺页,新缺页恰好到达,形成 流水线式处理。】 保持当前并发度

4、选择暂停的进程

通过**挂起(Suspend)部分进程**释放内存,优先保障缺页率高的进程运行

📌 进程挂起选择策略

系统通常按**优先级+资源需求**综合选择被挂起的进程:

策略 具体规则 适用场景
最低优先级优先 先暂停优先级最低的进程(与CPU调度策略一致)。 系统明确区分任务重要性时(如实时系统)。
占用内存大的进程优先 挂起占用物理块较多的进程,快速释放内存。 内存严重不足需立即缓解拥堵时。
剩余执行时间长的进程优先 选择剩余CPU时间(或周转时间)最长的进程挂起。 避免短任务饥饿,提高整体响应速度。
缺页率低的进程优先 暂停缺页率低的进程(因其对内存依赖较小)。 需精细化平衡 L/S 时。

5.5 请求分段存储管理方式

5.5.1 请求分段中的硬件支持

1、请求段表机制

段名 段长 段基址 存取方式 访问字段A 修改位M 存在位P 增补位 外存始址
  • 存取方式。如果该字段为两位,则存取属性是只执行、只读和允许读/写【由于应用程序中的段是信息的逻辑单位,可根据该信息的属性对它实施保护】。
  • 访问字段 A。其含义与请求分页的相应字段相同,用于记录该段被访问的频繁程度。提供给置换算法选择换出页面时参考。
  • 修改位M。该字段用于表示该页在进入内存后是否已被修改过,供置换页面时参考。
  • 存在位P。该字段用于指示本段是否已调入内存,供程序访问时参考。
  • 增补位。这是请求分段式管理中所特有的字段,用于表示本段在运行过程中是否做过动态增长
  • 外存始址。指示本段在外存中的起始地址,即起始盘块号

2、缺段中断机构

由于段不是定长的,这使对缺段中断的处理要比对缺页中断的处理复杂。

  • 在请求分段系统中,每当发现运行进程所要访问的段尚未调入内存时,便由缺段中断机构产生一缺段中断信号,进入OS后由缺段中断处理程序将所需的段调入内存
  • 缺段中断同样需要在一条指令的执行期间,产生和处理中断,以及在一条指令执行期间可能产生数次缺段中断。但 ++不会出现一条指令被分割在两个分段中或一组信息被分割在两个分段中的情况++

3、地址变换机构

是在分段系统地址变换机构的基础上形成的。因为被访问的段并非全在内存,所以在地址变换时,若发现所要访问的段不在内存,必须先将所缺的段调入内存,并修改段表,然后才能再利用段表进行地址变换。

5.5.2 分段的共享与保护

1、共享段表

共享段表的每个表项包含两类信息:

  1. 共享段全局信息(描述段本身的属性)。
  2. 共享进程信息(记录哪些进程在使用该段)。

(1)共享段全局信息字段

字段名 说明
段名 段的名字
段长(Length) 段的大小,用于越界检查。
内存始址(Base Address) 段在物理内存中的起始地址。
状态位(Present Bit) 1=段在内存中,0=段在外存(触发缺段中断)。
外存始址(Disk Address) 段在外存(如磁盘)中的位置,用于换出后重新加载。
共享计数(Count) 记录当前共享该段的进程数。Count=0 时,系统回收该段内存。

(2)共享进程信息字段

字段名 说明
进程名 进程的名字
进程号 进程ID
段号 共享段的逻辑编号(不同进程中段号可能不同,但指向同一物理段)。
存取控制(Access Control) 该进程设置的权限(如读、写、执行)。【不同进程设置不同权限】

共享进程计数count

  • 非共享段仅为一个进程所需要。当进程不再需要该段时,可立即释放该段,并由系统回收该段所占用的空间。
  • 共享段是为多个进程所需要的,为记录有多少进程正在共享该分段, 须设置共享进程计数count。
    • 当某进程不再需要而释放它时,系统并不立即回收该段所占内存区,而是检查count是否为0,若不是0,则表示还有进程需要它
    • 仅当所有共享该段的进程全都不再需要它时,此时count为0,才由系统回收该段 所占内存区

存取控制字段。对于一个共享段,应为不同的进程赋予不同的存取权限

例如,对于文件主,通常允许他读和写; 而对其它进程,则可能只允许读,甚至只允许执行。

段号。对于一个共享段,在不同的进程中可以具有不同的段号每个进程可用自已进程的段号去访问该共享段

2、共享段的分配与回收

分配

(1)首次分配(由第一个进程触发)

  1. 请求阶段:进程首次请求访问共享段(如调用共享库代码)。
  2. 内存分配
    • 物理区分配 :系统为该共享段分配物理内存
    • 加载数据:从外存(如磁盘)将共享段内容调入内存。
  3. 更新表项
    • 进程段表:该进程的段表中添加段表项。
    • 共享段表 :创建新表项:Count=1且状态位=1,并附加进程私有信息:进程的 进程名进程号私有段号存取控制

(2)后续共享(其他进程加入)

  1. 请求阶段:新进程请求访问同一共享段。
  2. 检查共享段表 :共享段已加载(状态位=1),无需重复分配内存
  3. 更新表项
    • 进程段表 :在新进程的段表中添加条目,指向共享段的 同一物理地址
    • 共享段表
      • 新增该进程的私有信息(进程名进程号私有段号存取控制)。
      • 共享计数递增Count = Count + 1

回收

当共享此段的某进程不再需要该段时:

  • 撤消在该进程段表中共享段所对应的表项

  • 执行count=count-1操作。

    • count此时结果为0,则须由系统回收该共享段的物理内存,并取消在共享段表中该段所对应的表项,表明此时己没有进程使用该段
    • count此时结果不为0,只是取消调用者进程在共享段表中的有关记录

3、分段保护

越界检查

越界检查是利用地址变换机构来完成的。段表寄存器存放段表始址和段表长度信息。

在进行地址变换时,

(1)段号越界检查

  • 步骤 :比较逻辑地址的段号S与段表长度:
    • S ≥ 段表长度 → 触发 地址越界中断 (如SIGSEGV)。
    • S < 段表长度 → 合法段号。
  • 意义:防止进程访问未分配的段(如进程只有3个段,却访问段号4)。

(2)段内偏移越界检查

  • 步骤
    • 通过段号 S 在段表中找到对应段表项,读取该段的段长
    • 比较逻辑地址的段内偏移W段长L
      • W ≥ Limit → 触发 地址越界中断
      • W < Limit→ 合法偏移,生成物理地址:
  • 意义:防止进程访问段内超出范围的内存(如段长4KB,但访问偏移5000)。
检查类型 比较对象 中断触发条件 保护目标
段号越界 段号 vs 段表长度 段号 ≥ 段表长度 防止访问非法段
段内偏移越界 偏移量 vs 段长字段 偏移量 ≥ 段长 防止访问段外内存

存取控制检查

存取控制检查(基于硬件实现的,无法被软件绕过,安全性高)是以段为基本单位进行的。通过段表的每个表项中的"存取控制"字段
通常的访问方式有:

权限类型 符号表示 允许操作 典型应用场景
只读 R 只允许进程对该段中的程序或数据进行读访问; 共享常量、配置文件
只执行 X 即只允许进程调用该段去执行禁止读取内容或写入 可执行程序段(如libc.text
读/写 RW 允许进程对该段进行读/写访问。 进程堆栈、堆内存

环保护机构

🔍 1. 核心概念

  • 特权级分层:系统按权限从高到低划分为多个环形特权等级(Ring),环的编号越小,特权越高
    • Ring 0:操作系统内核(最高权限,直接访问硬件)。
    • Ring 1-2:重要的系统服务或驱动程序(部分操作系统)。
    • Ring 3:用户应用程序(最低权限)。
  • 设计目标++隔离不同权限的代码,防止低权限程序破坏高特权资源++

⚙️ 2. 访问与调用规则

在环形保护机制中,权限控制遵循以下硬件级规则

(1)数据访问规则(读/写)

  • 允许:程序 可以访问*同一环或更低特权环(外环)数据例如:Ring 1 的代码可以读取 Ring 3 的数据,但反之不可。
  • 禁止:低特权环(外环)不能直接访问高特权环(内环)的数据。

(2)服务调用规则(执行)

  • 允许:程序 可以调用同一环或更高特权环(内环)服务例如:应用程序(Ring 3)通过系统调用请求内核(Ring 0)服务。
  • 禁止:高特权环不能随意调用低特权环的代码(防止恶意跳转)。

参考:

教材:

计算机操作系统(第四版) (汤小丹) (Z-Library).pdf

视频:

王道计算机考研 操作系统

相关推荐
猫咪-95272 个月前
面试计算机操作系统解析(一中)
面试·计算机操作系统
猫咪-95272 个月前
常考计算机操作系统面试习题(三下)
计算机操作系统
猫咪-95272 个月前
常考计算机操作系统面试习题(二)(上)
计算机操作系统
猫咪-95274 个月前
vim使用指南
linux·计算机操作系统
墨染青竹梦悠然9 个月前
《计算机操作系统》(第4版)考研真题
考研·计算机操作系统
墨染青竹梦悠然9 个月前
《计算机操作系统》(第4版)第2章 进程的描述与控制 复习笔记
笔记·计算机操作系统
YuCaiH9 个月前
【计算机操作系统】内存管理的概念
笔记·计算机操作系统
YuCaiH10 个月前
2.1(4) 线程
笔记·计算机操作系统
dreamer'~10 个月前
【面试八股文】计算机操作系统
面试·操作系统·八股文·计算机操作系统