处理机调度概述
处理机调度的三个层次
高级调度(作业调度、长程调度)
- 功能:从后备作业队列中选择作业调入内存,为其创建进程
- 特点:
- 调度频率较低(分钟级)
- 主要用于批处理系统
- 主要目标:提高系统吞吐量、资源利用率
- 任务:
- 决定接纳多少个作业(取决于系统多道程序度)
- 决定接纳哪些作业(取决于调度算法)
中级调度(内存调度、中程调度)
- 功能:将暂时不能运行的进程调至外存等待(挂起状态),当内存有空间时再将就绪进程重新调入内存
- 特点:
- 提高内存利用率
- 实现进程在内存和外存之间的对换
- 目的:平衡系统负载,缓解内存紧张
低级调度(进程调度、短程调度)
- 功能:从就绪队列中选择进程分配处理机
- 特点:
- 调度频率最高(毫秒级)
- 任何操作系统都必须具备
- 调度算法直接影响系统性能
- 任务:
- 保存处理机现场信息
- 按调度算法选取进程
- 把处理机分配给进程、

调度目标
10.2.1 共同目标
- 资源利用率高:使CPU、内存、I/O设备尽可能忙碌
- 公平性:每个进程获得合理的CPU份额
- 资源平衡利用:保持系统各部分资源都忙碌
- 策略强制执行:确保特定策略得到执行
10.2.2 批处理系统目标
- CPU利用率高
- 系统吞吐量高:单位时间内完成的作业数
- 周转时间短:
10.2.3 分时系统目标
- 响应时间快:从提交请求到首次响应的时间
- 均衡性:响应时间与请求复杂度相适应
10.2.4 实时系统目标
- 截止时间保证
- 可预测性
周转时间




作业调度(高级调度)
作业调度任务
- 主要决策:
- 接纳多少个作业:取决于系统多道程序度(根据系统规模、运行速度、作业大小等确定)
- 接纳哪些作业:取决于调度算法
作业调度算法
先来先服务(FCFS)

短作业优先(SJF)


优先级调度算法(PSA)


高响应比优先调度算法(HRRN)

时间片轮转调度算法
若时间片大小为5

若时间片大小为2



多级反馈队列调度(MLFQ)
- .设置多级就绪队列,各级队列优先级从高到低,时间片从小到大
- 2.新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片,若用完时间片进程还未结束,则进程进入下一级队列队尾。如果此时已经是在最下级的队列,则重新放回该队列队尾
- 3.只有第k级队列为空时,才会为k+1级队头的进程分配时间片

进程调度(低级调度)
进程调度任务与机制
进程调度任务
- 保存处理机现场信息:寄存器、程序计数器等
- 按调度算法选取进程:从就绪队列中选择
- 分配处理机给进程:设置现场信息,移交控制权
进程调度机制
- 将新就绪进程按一定策略插入就绪队列合适位置
- 将选中进程从就绪队列取出,进行上下文切换
- 完成两对上下文切换:保存当前进程现场,恢复选中进程现场
调度时机与方式
调度时机
- 非抢占式调度:
- 运行完毕或终止运行
- 等待I/O操作
- 执行了某种原语操作(P操作、阻塞原语)
- 抢占式调度(额外时机):
4. 时间片用完
5. 优先级更高的进程就绪
调度方式
- 非抢占式(Non-preemptive Mode)
- 不允许抢占已分配的处理机
- 优点:实现简单,系统开销小
- 缺点:响应时间可能较长
- 适用场景:批处理系统
- 抢占式(Preemptive Mode)
- 允许根据原则暂停正在执行的进程
- 抢占原则:
- 优先权原则:高优先级进程可抢占低优先级
- 短进程优先原则:短进程可抢占长进程(最短剩余时间优先SRT)
- 时间片原则:时间片用完即被抢占
- 优点:响应快,适合交互式系统
- 缺点:实现复杂,开销大
进程调度算法
| 调度算法 | 抢占性 | 优点 | 缺点 | 可能饥饿 | 适用场景 | 用于作业/进程调度 |
|---|---|---|---|---|---|---|
| FCFS | 非抢占 | 实现简单,公平,对长作业有利 | 平均等待时间长,对短作业不利 | 否 | 批处理(按照作业/进程到达的先后顺序进行服务) | 作业调度:考虑的是哪个作业先到达后备队列;进程调度:考虑的是哪个进程先到达就绪队列 |
| SJF/SPF | 均可 | 平均等待/周转时间最短,对短作业有利 | 不公平,需要预知运行时间,对长作业不利 | 是 | 批处理(最短的作业/进程优先得到服务) | 都可用 |
| 优先级 | 均可 | 灵活,可处理紧急任务 | 低优先级可能长期等待 | 是 | 实时、批处理 | |
| RR | 抢占 | 公平,响应快 | 时间片大小影响性能 | 否 | 分时(按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片。若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾重新排队。) | 用于进程调度 |
| MLQ | 均可 | 灵活,可分类处理 | 低优先级队列可能饥饿 | 是 | 通用 | |
| MLFQ | 抢占 | 综合多种优点,适应性强 | 实现复杂 | 是 | 通用(每次先计算各个作业/进程的响应比,选择响应比最高的作业/进程) | |
| HRRN | 非抢占 | 兼顾长短作业(兼备SJF/FCFS的优点) | 需计算响应比,开销大 | 否 | 批处理 |
实时系统调度
13.1 实时调度基本条件
13.1.1 提供必要信息
- 开始/完成截止时间
- 就绪时间
- 处理时间
- 资源要求
- 优先级
13.1.2 系统处理能力强
- 可调度条件:对于m个周期性硬实时任务,处理时间为Ci,周期时间为Pi
- 单处理机:$\sum_{i=1}^{m} \frac{C_i}{P_i} \leq 1$
- 多处理机(N个):$\sum_{i=1}^{m} \frac{C_i}{P_i} \leq N$
- 提高处理能力方法:
- 提高处理机速度
- 采用多处理机系统
- 改进算法,减少上下文切换开销
13.1.3 采用抢占式调度机制
- 硬实时系统必须采用抢占式调度
13.1.4 具有快速切换机制
- 对外部中断的快速响应能力:要求快速硬件中断机构
- 快速的任务分派能力:系统中的每个运行功能单位适当小
13.2 实时调度算法分类
- 按任务性质:硬实时调度、软实时调度
- 按调度方式:非抢占调度、抢占调度
- 按调度时间:静态调度、动态调度
- 按多处理机情况:集中式调度、分布式调度
13.3 实时调度算法
13.3.1 非抢占式调度算法
- 非抢占式轮转调度
- 响应时间:几秒到数十秒
- 应用:不太严格的实时控制系统(如工业群控系统)
- 非抢占式优先调度
- 响应时间:数百毫秒
- 应用:较为严格的实时控制系统
13.3.2 抢占式调度算法
- 基于时钟中断的抢占式优先权调度
- 响应时间:几到数十毫秒
- 应用:较严格的实时系统
- 立即抢占的优先权调度
- 响应时间:100微秒到几毫秒
- 要求:系统必须具有快速响应外部中断能力
13.3.3 最早截止时间优先(EDF)
- 算法思想:根据任务的开始截止时间确定优先级,截止时间越早优先级越高
- 可用于:抢占式和非抢占式调度
13.3.4 最低松弛度优先(LLF)
- 松弛度公式:松弛度 = 必须完成时间 – 还需运行时间 – 当前时间
- 算法思想:根据任务的紧急程度(松弛度)确定优先级,松弛度越小优先级越高
- 主要用于:可抢占式调度
- 特点:松弛度动态变化,调度灵活
十四、多处理机调度
14.1 多处理机系统类型

14.2 进程分配方式
14.2.1 对称多处理器系统分配方式
- 静态分配方式:
- 进程固定分配到一个处理器执行
- 每个处理器设置专用就绪队列
- 问题:处理器忙闲不均
- 动态分配方式:
- 设置公共就绪队列,进程可分配到任一处理器
- 优点:解决忙闲不均
- 缺点:增加调度开销(特别是松散耦合系统)
- 主/从式分配方式:
- OS核心驻留主机,从机执行用户程序
- 进程调度由主机完成
- 优点:简单,不会忙闲不均
- 缺点:不可靠(主机故障则系统瘫痪)
14.2.2 非对称多处理器系统分配方式
- 主处理器运行操作系统,调度从处理器
- 从处理器执行用户进程
14.3 进程(线程)调度方式
14.3.1 自调度方式(Self-Scheduling)
- 实现:设置公共就绪队列,空闲处理器自行取进程/线程
- 调度算法:可采用FCFS等单处理机算法
- 优点:
- 简单,可使用单处理机调度算法
- 只要有任务,处理器就不会空闲
- 缺点:
- 瓶颈问题(公共队列可能成为瓶颈)
- 低效性(线程切换频繁)
- 不能保证相关线程同时运行
14.3.2 成组调度方式(Gang Scheduling)
- 算法思想:将一组相关线程同时分配到一组处理器上执行
- 分配策略:
- 面向所有应用程序平均分配:每个应用至多可占有N个处理器的1/M时间(M为应用数)
- 面向所有线程平均分配:每个线程至多可占有N个处理器的1/L时间(L为线程总数)
- 优点:
- 相关线程能并行执行,减少阻塞和切换
- 减少调度频率,降低开销
14.3.3 专用处理器分配方式(Dedicated Processor Assignment)
- 算法思想:为应用程序分配一组专用处理器,每个线程一个处理器,直至应用完成
- 适用场景:高度并行系统,处理器利用率不是首要考虑
- 要求:同时执行的多道应用程序,其线程总数不超过系统中处理器数目
- 特点:可能造成处理器严重浪费,但简化了调度
进程互斥的软件实现方法

进程互斥的硬件实现方法
死锁
死锁的基本概念


死锁的预防

15.3 死锁的避免(银行家算法)
15.3.1 安全状态与安全序列
- 安全状态:系统能按某种顺序为每个进程依次分配所需资源,直至所有进程完成
- 安全序列:能使系统安全执行的进程顺序
- 不安全状态:不存在安全序列的状态
- 重要关系:
- 安全状态一定不会死锁
- 不安全状态不一定会死锁
- 系统应避免进入不安全状态
15.3.2 银行家算法数据结构
- 最大需求矩阵Max:n×m矩阵,n个进程对m类资源的最大需求
- 分配矩阵Allocation:n×m矩阵,每个进程已分配的每类资源数
- 需求矩阵Need:n×m矩阵,每个进程还需要各类资源数(Need = Max – Allocation)
- 可用资源向量Available:m个元素,每类资源可用数目
15.3.3 银行家算法步骤
当进程Pi提出资源请求Requesti[j]时:
- 检查合法性:若Requesti[j] ≤ Need[i,j],转2;否则错误
- 检查可用性:若Requesti[j] ≤ Available[j],转3;否则进程等待
- 试分配:
- Available[j] := Available[j] – Requesti[j]
- Allocation[i,j] := Allocation[i,j] + Requesti[j]
- Need[i,j] := Need[i,j] – Requesti[j]
- 安全性检查:执行安全性算法
- 若新状态安全,则正式分配
- 若新状态不安全,则恢复原状态,进程等待
15.3.4 安全性算法
- 初始化:
- Work := Available(当前可用资源)
- Finish[i] := false(所有进程未完成)
- 查找进程:查找满足Finish[i]=false且Need[i] ≤ Work的进程Pi
- 若找到:
- Work := Work + Allocation[i](假设Pi完成,释放资源)
- Finish[i] := true
- 重复步骤2
- 检查:若所有Finish[i]=true,则系统安全;否则不安全
死锁的检测与解除

死锁检测

- 检测时机:
- 定时检测
- 当进程阻塞时检测
- 系统资源利用率下降时检测
- 资源分配图法:
- 图表示:G=
- V:结点集,分为进程结点P和资源结点R
- E:边集,<pi,rj>为申请边,<rj,pi>为分配边
- 资源表示:
- 资源类:方框表示
- 资源实例:方框中黑圆点
- 进程:圆圈加进程名
- 死锁定理:
- 若无环路,则无死锁
- 若有环路且每类资源只有一个实例,则环路是死锁的充要条件
- 资源分配图化简:
- 找一个只有分配边的非孤立进程结点,去掉分配边使其孤立
- 将相应资源分配给等待该资源的进程(申请边变分配边)
- 重复直至所有进程孤立(可完全简化)或无进程可简化(不可完全简化)
- 死锁充分条件:资源分配图不可完全简化
- 图表示:G=
15.4.2 死锁解除
- 目标:以最小代价恢复系统运行
- 方法:
- 撤销所有死锁进程:代价最大
- 逐个撤销死锁进程:直到死锁解除
- 逐个剥夺资源:直到死锁解除
- 进程回退:将进程回退到前面某个检查点,重新执行
15.5 死锁相关问题
15.5.1 资源分配计算
- 问题类型:N个进程共享某类资源,每个进程最多需要k个,问至少需要多少资源才不会死锁
- 计算公式:最少资源数 = N × (k-1) + 1
- 原理:最坏情况下,每个进程都获得(k-1)个资源并等待最后一个资源,此时只需再多一个资源就可让一个进程完成并释放资源
15.5.2 死锁避免计算
- 银行家算法应用:判断系统是否安全,能否分配资源
- 安全序列查找:通过安全性算法寻找安全序列
调度算法对比
16.2 死锁处理策略对比
| 策略 | 原理 | 资源利用率 | 系统吞吐量 | 实现难度 |
|---|---|---|---|---|
| 预防 | 破坏必要条件 | 低 | 低 | 易 |
| 避免 | 动态检查,避免不安全 | 高 | 高 | 难 |
| 检测与解除 | 允许发生,定期检测解除 | 高 | 高 | 中 |
| 忽略 | 假装没有死锁 | 高 | 高 | 易 |
存储管理基础
内存

存储管理的四大功能
| 功能 | 描述 | 关键技术 |
|---|---|---|
| 主存分配与回收 | 管理内存空间的分配和释放 | 分配策略(首次适应、最佳适应等)、分配结构(位示图、空闲链表) |
| 地址映射(重定位) | 将逻辑地址转换为物理地址 | 静态重定位、动态重定位 |
| 存储保护 | 防止进程越界访问和非法操作 | 界地址寄存器、访问权限控制 |
| 主存扩充(虚拟内存) | 逻辑上扩展内存容量 | 请求分页、请求分段 |
1.2 地址重定位详解
1.2.1 地址类型
- 逻辑地址(虚地址):编译链接后生成的地址,从0开始编址
- 物理地址(实地址):内存单元的实际地址
1.2.2 重定位方式对比
| 特性 | 静态重定位 | 动态重定位 |
|---|---|---|
| 时机 | 程序装入时一次性完成 | 程序执行期间动态进行 |
| 硬件需求 | 不需要特殊硬件 | 需要重定位寄存器 |
| 程序移动性 | 装入后不能移动 | 可以移动,支持内存紧凑 |
| 实现复杂度 | 简单 | 复杂 |
| 适用场景 | 早期多道系统 | 现代虚拟存储系统 |
1.2.3 动态重定位实现
- 基址寄存器:存放程序在内存中的起始地址
- 地址转换公式:物理地址 = 基址 + 逻辑地址
- 越界检查:逻辑地址 < 限长寄存器值
1.3 存储保护机制
1.3.1 保护目的
- 保护操作系统不被用户程序破坏
- 保护用户进程之间互不干扰
- 保护共享数据的完整性和一致性
1.3.2 硬件支持方案
- 界地址寄存器方案:基址寄存器 + 限长寄存器
- 存储键方案:为每个内存块设置保护键
- 环保护机制:多级特权保护(如0环为内核,3环为用户)
1.3.3 保护实现
- 越界检查:硬件自动比较,越界则触发中断
- 权限检查:通过页表/段表中的保护位实现
1.4 虚拟内存原理
1.4.1 局部性原理
- 时间局部性:刚被访问的存储单元很可能近期再次被访问
- 空间局部性:被访问存储单元的邻近单元很可能被访问
1.4.2 虚拟存储基本思想
- 部分装入:只将当前需要的部分装入内存
- 按需调页:访问不在内存的页面时产生缺页中断,调入所需页面
- 页面置换:内存满时选择合适的页面换出到外存
第二章:程序装入与链接
2.1 程序执行三步骤
- 编译:源程序 → 多个目标模块
- 链接:目标模块 + 库函数 → 装入模块
- 装入:装入模块 → 内存
2.2 装入方式详解
2.2.1 绝对装入方式
- 特点:程序必须装入指定内存位置
- 适用:单道程序系统
- 缺点:不灵活,不支持多道程序
2.2.2 可重定位装入方式
- 重定位表:记录需要修改的地址位置
- 装入时修改:根据实际装入地址修改所有重定位项
- 优缺点:
- 优点:支持多道程序
- 缺点:程序不能移动,需要连续存储空间
2.2.3 动态运行时装入方式
- 重定位寄存器:运行时动态计算物理地址
- 支持特性:
- 程序可移动
- 支持不连续存储
- 支持虚拟存储
- 硬件需求:地址转换硬件(MMU)
2.3 链接方式对比

2.3.1 静态链接
- 时机:运行前
- 特点:生成完整的可执行文件
- 缺点:
- 占用内存大
- 更新困难
- 共享困难
2.3.2 动态链接
- 装入时动态链接:
- 装入时完成链接
- 支持代码共享
- 便于更新
- 运行时动态链接:
- 需要时再链接
- 节省内存
- 支持插件式功能扩展
2.3.3 动态链接库(DLL)
- 优点:
- 多进程共享,节省内存
- 便于升级(接口不变即可)
- 支持模块化开发
- 缺点:
- 增加运行时开销
- 存在DLL版本冲突问题
连续分配存储管理

3.1 四种连续分配方式
| 方式 | 分区特点 | 分配特点 | 适用场景 |
|---|---|---|---|
| 单一连续 | 系统区+用户区 | 实现简单,无外部碎片,全部装入 | 单用户系统 |
| 固定分区 | 固定大小分区,分区说明表 | 按分区分配 | 早期多道系统 |
| 动态分区 | 不会预先分区,动态划分分区 | 按需(进程大小)分配 | 多道批处理 |
| 可重定位分区 | 动态分区+紧凑 | 可移动程序 | 需要解决碎片 |
3.2 动态分区分配算法
3.2.1 分配算法比较
| 算法 | 策略 | 优点 | 缺点 |
|---|---|---|---|
| 首次适应 | 从低地址找第一个满足的空闲区 | 简单、快速 | 低地址碎片多 |
| 最佳适应 | 找大小最接近需求的空闲区 | 减少大空闲区被切割 | 产生小碎片 |
| 最坏适应 | 找最大的空闲区 | 减少小碎片 | 大分区被破坏 |
3.2.2 数据结构
- 空闲分区表:记录空闲分区信息
- 空闲分区链:双向链表组织空闲区
3.3 碎片问题与解决
3.3.1 碎片类型
- 内部碎片:分配给进程但未使用的部分(固定分区)
- 外部碎片:太小而无法分配的空闲区(动态分区)
3.3.2 解决方案
- 紧凑技术:移动程序合并空闲区
- 需要动态重定位支持
- 系统开销大
- 可重定位分区:定期紧凑碎片
- 离散分配:分页/分段从根本上避免外部碎片
第四章:分页存储管理
4.1 基本概念
4.1.1 地址划分
- 逻辑地址 = 页号P + 页内偏移W
- 物理地址 = 块号b + 页内偏移W
- 页大小:通常为2的幂(如4KB)
4.1.2 关键数据结构
- 页表:每个进程一个,存储页号到块号的映射
- 物理块表:系统全局,记录物理块使用情况
4.2 地址映射过程
4.2.1 基本映射步骤
- 分离逻辑地址为页号P和页内偏移W
- 以P为索引查页表,得物理块号b
- 物理地址 = b × 页大小 + W
4.2.2 地址映射实例
text复制下载
例:页大小1KB,逻辑地址2500 2500 / 1024 = 2余452 → P=2, W=452 若页表显示2号页对应7号块 物理地址 = 7×1024 + 452 = 7620
4.3 快表(TLB)技术
4.3.1 TLB原理
- 作用:缓存最近使用的页表项
- 组成:页号、块号、有效位等
- 查找方式:并行查找,速度快
4.3.2 性能分析
- 有效访问时间公式:text复制下载EAT = λ + (2 – a) × t 其中:λ为TLB访问时间,a为命中率,t为内存访问时间
- 实例计算:text复制下载给定:t=1μs,λ=0.2μs,a=85% EAT = 0.2 + (2-0.85)×1 = 0.2 + 1.15 = 1.35μs
4.3.3 TLB管理
- 替换算法:LRU、随机等
- 一致性:当页表项修改时需要更新或无效化TLB
4.4 多级页表
4.4.1 解决大页表问题
- 问题:32位系统,4KB页 → 2²⁰个页表项,每个进程需4MB页表
- 解决方案:页表分页,建立页目录
4.4.2 二级页表示例
text复制下载
32位地址:10位页目录索引 + 10位页表索引 + 12位页内偏移 访问过程: 1. 用页目录索引查页目录表,得页表物理地址 2. 用页表索引查页表,得物理块号 3. 合成物理地址
4.4.3 多级页表优缺点
- 优点:
- 页表不必连续存储
- 可以只分配需要的部分
- 缺点:
- 增加访存次数
- 地址转换复杂
4.5 倒排页表
4.5.1 设计思想
- 传统页表:每个虚拟页一个表项
- 倒排页表:每个物理帧一个表项
- 表项内容:进程ID + 虚拟页号
4.5.2 地址转换
- 根据进程ID和虚拟页号在倒排页表中查找
- 找到对应表项即得物理帧号
- 未找到则产生缺页异常
4.5.3 优化技术
- 哈希表加速:用虚拟地址哈希快速定位
- TLB配合:频繁访问页面通过TLB直接转换
4.5.4 优缺点对比
| 方面 | 传统页表 | 倒排页表 |
|---|---|---|
| 表项数 | 虚拟页数 | 物理帧数 |
| 空间开销 | 大(尤其64位) | 小(与物理内存成比例) |
| 查找速度 | 快(直接索引) | 慢(需要搜索) |
| 实现复杂度 | 简单 | 复杂 |
4.6 页大小选择
4.6.1 影响因素
- 内部碎片:页越大,内部碎片可能越大
- 页表大小:页越小,页表越大
- 局部性:页大小影响空间局部性利用
- I/O效率:大页减少缺页次数但增加传输时间
4.6.2 典型页大小
- 早期系统:512字节、1KB
- 现代系统:4KB(x86)、8KB(SPARC)、16KB(ARM)
- 大页支持:2MB、1GB(用于数据库等特殊应用)
4.7 分页系统的保护与共享
4.7.1 保护机制
- 越界保护:检查页号是否有效
- 权限保护:通过页表项中的保护位控制
- R(读)、W(写)、X(执行)
- U/S(用户/系统)权限
4.7.2 共享实现
- 代码共享:只读页面可多进程共享
- 写时复制:
- 初始时共享同一物理页(只读)
- 任一进程写入时触发保护异常
- 操作系统复制页面,修改权限为可写
- 共享数据结构:页表指向相同物理帧
第五章:分段存储管理
5.1 基本概念
5.1.1 分段与分页对比
| 特性 | 分页 | 分段 |
|---|---|---|
| 划分单位 | 固定大小页 | 逻辑意义段 |
| 用户透明性 | 透明 | 可见 |
| 地址空间 | 一维 | 二维(段号+段内偏移) |
| 碎片类型 | 内部碎片 | 外部碎片 |
| 共享难度 | 困难 | 容易 |
| 动态链接 | 不支持 | 支持 |
| 保护粒度 | 页级别 | 段级别 |
5.1.2 分段优势
- 逻辑清晰:按功能模块组织
- 便于共享:以段为单位共享
- 动态链接:需要时再链接模块
- 动态增长:数据段、栈段可动态扩展
5.2 地址映射
5.2.1 段表结构
- 段基址:段在内存中的起始地址
- 段长度:段的长度限制
- 保护位:读/写/执行权限
- 状态位:是否在内存、是否被修改等
5.2.2 映射过程
- 从逻辑地址提取段号S和段内偏移D
- 以S为索引查段表,得段基址B和段长L
- 检查D < L(越界检查)
- 物理地址 = B + D
5.2.3 保护机制
- 越界检查:D必须小于段长L
- 权限检查:根据保护位检查访问合法性
- 环保护:多级特权保护机制
5.3 分段系统的共享
5.3.1 共享段表
- 系统维护:全局共享段表
- 表项内容:
- 段名/段号
- 段长
- 内存地址
- 共享进程计数
- 其他管理信息
5.3.2 共享过程
- 首次共享:
- 分配内存空间
- 创建共享段表项
- count=1
- 后续共享:
- 不分配新空间
- 修改进程段表指向共享段
- count++
- 回收共享:
- count–
- 若count=0,释放内存
5.4 段页式存储管理
5.4.1 设计思想
- 用户视角:分段(二维地址)
- 系统视角:每段再分页(一维管理)
- 地址结构:段号S + 页号P + 页内偏移W
5.4.2 地址映射过程
- 根据段号S查段表,得页表基址
- 根据页号P查页表,得物理块号
- 物理地址 = 物理块号 × 页大小 + W
5.4.3 访存次数分析
- 无快表:3次访存(段表→页表→数据)
- 有快表:
- 命中:1次访存
- 未命中:3次访存
5.4.4 优缺点
- 优点:
- 结合分段和分页优点
- 便于共享和保护
- 无外部碎片
- 缺点:
- 地址转换复杂
- 管理开销大