目录

处理机调度概述

处理机调度的三个层次

高级调度(作业调度、长程调度)

  • 功能:从后备作业队列中选择作业调入内存,为其创建进程
  • 特点
    • 调度频率较低(分钟级)
    • 主要用于批处理系统
    • 主要目标:提高系统吞吐量、资源利用率
  • 任务
    • 决定接纳多少个作业(取决于系统多道程序度)
    • 决定接纳哪些作业(取决于调度算法)

中级调度(内存调度、中程调度)

  • 功能:将暂时不能运行的进程调至外存等待(挂起状态),当内存有空间时再将就绪进程重新调入内存
  • 特点
    • 提高内存利用率
    • 实现进程在内存和外存之间的对换
  • 目的:平衡系统负载,缓解内存紧张

低级调度(进程调度、短程调度)

  • 功能:从就绪队列中选择进程分配处理机
  • 特点
    • 调度频率最高(毫秒级)
    • 任何操作系统都必须具备
    • 调度算法直接影响系统性能
  • 任务
    • 保存处理机现场信息
    • 按调度算法选取进程
    • 把处理机分配给进程、

调度目标

10.2.1 共同目标

  1. 资源利用率高:使CPU、内存、I/O设备尽可能忙碌
  2. 公平性:每个进程获得合理的CPU份额
  3. 资源平衡利用:保持系统各部分资源都忙碌
  4. 策略强制执行:确保特定策略得到执行

10.2.2 批处理系统目标

  1. CPU利用率高
  2. 系统吞吐量高:单位时间内完成的作业数
  3. 周转时间短

10.2.3 分时系统目标

  1. 响应时间快:从提交请求到首次响应的时间
  2. 均衡性:响应时间与请求复杂度相适应

10.2.4 实时系统目标

  1. 截止时间保证
  2. 可预测性

周转时间

作业调度(高级调度)

作业调度任务

  • 主要决策
    1. 接纳多少个作业:取决于系统多道程序度(根据系统规模、运行速度、作业大小等确定)
    2. 接纳哪些作业:取决于调度算法

作业调度算法

先来先服务(FCFS)

短作业优先(SJF)

优先级调度算法(PSA)

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

时间片轮转调度算法

若时间片大小为5

若时间片大小为2

多级反馈队列调度(MLFQ)

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

进程调度(低级调度)

进程调度任务与机制

进程调度任务

  1. 保存处理机现场信息:寄存器、程序计数器等
  2. 按调度算法选取进程:从就绪队列中选择
  3. 分配处理机给进程:设置现场信息,移交控制权

进程调度机制

  • 将新就绪进程按一定策略插入就绪队列合适位置
  • 将选中进程从就绪队列取出,进行上下文切换
  • 完成两对上下文切换:保存当前进程现场,恢复选中进程现场

调度时机与方式

调度时机

  • 非抢占式调度
    1. 运行完毕或终止运行
    2. 等待I/O操作
    3. 执行了某种原语操作(P操作、阻塞原语)
  • 抢占式调度(额外时机):
    4. 时间片用完
    5. 优先级更高的进程就绪

调度方式

  1. 非抢占式(Non-preemptive Mode)
    • 不允许抢占已分配的处理机
    • 优点:实现简单,系统开销小
    • 缺点:响应时间可能较长
    • 适用场景:批处理系统
  2. 抢占式(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$
  • 提高处理能力方法
    1. 提高处理机速度
    2. 采用多处理机系统
    3. 改进算法,减少上下文切换开销

13.1.3 采用抢占式调度机制

  • 硬实时系统必须采用抢占式调度

13.1.4 具有快速切换机制

  1. 对外部中断的快速响应能力:要求快速硬件中断机构
  2. 快速的任务分派能力:系统中的每个运行功能单位适当小

13.2 实时调度算法分类

  • 按任务性质:硬实时调度、软实时调度
  • 按调度方式:非抢占调度、抢占调度
  • 按调度时间:静态调度、动态调度
  • 按多处理机情况:集中式调度、分布式调度

13.3 实时调度算法

13.3.1 非抢占式调度算法

  1. 非抢占式轮转调度
    • 响应时间:几秒到数十秒
    • 应用:不太严格的实时控制系统(如工业群控系统)
  2. 非抢占式优先调度
    • 响应时间:数百毫秒
    • 应用:较为严格的实时控制系统

13.3.2 抢占式调度算法

  1. 基于时钟中断的抢占式优先权调度
    • 响应时间:几到数十毫秒
    • 应用:较严格的实时系统
  2. 立即抢占的优先权调度
    • 响应时间:100微秒到几毫秒
    • 要求:系统必须具有快速响应外部中断能力

13.3.3 最早截止时间优先(EDF)

  • 算法思想:根据任务的开始截止时间确定优先级,截止时间越早优先级越高
  • 可用于:抢占式和非抢占式调度

13.3.4 最低松弛度优先(LLF)

  • 松弛度公式:松弛度 = 必须完成时间 – 还需运行时间 – 当前时间
  • 算法思想:根据任务的紧急程度(松弛度)确定优先级,松弛度越小优先级越高
  • 主要用于:可抢占式调度
  • 特点:松弛度动态变化,调度灵活

十四、多处理机调度

14.1 多处理机系统类型

14.2 进程分配方式

14.2.1 对称多处理器系统分配方式

  1. 静态分配方式
    • 进程固定分配到一个处理器执行
    • 每个处理器设置专用就绪队列
    • 问题:处理器忙闲不均
  2. 动态分配方式
    • 设置公共就绪队列,进程可分配到任一处理器
    • 优点:解决忙闲不均
    • 缺点:增加调度开销(特别是松散耦合系统)
  3. 主/从式分配方式
    • OS核心驻留主机,从机执行用户程序
    • 进程调度由主机完成
    • 优点:简单,不会忙闲不均
    • 缺点:不可靠(主机故障则系统瘫痪)

14.2.2 非对称多处理器系统分配方式

  • 主处理器运行操作系统,调度从处理器
  • 从处理器执行用户进程

14.3 进程(线程)调度方式

14.3.1 自调度方式(Self-Scheduling)

  • 实现:设置公共就绪队列,空闲处理器自行取进程/线程
  • 调度算法:可采用FCFS等单处理机算法
  • 优点
    • 简单,可使用单处理机调度算法
    • 只要有任务,处理器就不会空闲
  • 缺点
    • 瓶颈问题(公共队列可能成为瓶颈)
    • 低效性(线程切换频繁)
    • 不能保证相关线程同时运行

14.3.2 成组调度方式(Gang Scheduling)

  • 算法思想:将一组相关线程同时分配到一组处理器上执行
  • 分配策略
    1. 面向所有应用程序平均分配:每个应用至多可占有N个处理器的1/M时间(M为应用数)
    2. 面向所有线程平均分配:每个线程至多可占有N个处理器的1/L时间(L为线程总数)
  • 优点
    • 相关线程能并行执行,减少阻塞和切换
    • 减少调度频率,降低开销

14.3.3 专用处理器分配方式(Dedicated Processor Assignment)

  • 算法思想:为应用程序分配一组专用处理器,每个线程一个处理器,直至应用完成
  • 适用场景:高度并行系统,处理器利用率不是首要考虑
  • 要求:同时执行的多道应用程序,其线程总数不超过系统中处理器数目
  • 特点:可能造成处理器严重浪费,但简化了调度

进程互斥的软件实现方法

进程互斥的硬件实现方法

死锁

死锁的基本概念

死锁的预防

15.3 死锁的避免(银行家算法)

15.3.1 安全状态与安全序列

  • 安全状态:系统能按某种顺序为每个进程依次分配所需资源,直至所有进程完成
  • 安全序列:能使系统安全执行的进程顺序
  • 不安全状态:不存在安全序列的状态
  • 重要关系
    • 安全状态一定不会死锁
    • 不安全状态不一定会死锁
    • 系统应避免进入不安全状态

15.3.2 银行家算法数据结构

  1. 最大需求矩阵Max:n×m矩阵,n个进程对m类资源的最大需求
  2. 分配矩阵Allocation:n×m矩阵,每个进程已分配的每类资源数
  3. 需求矩阵Need:n×m矩阵,每个进程还需要各类资源数(Need = Max – Allocation)
  4. 可用资源向量Available:m个元素,每类资源可用数目

15.3.3 银行家算法步骤

当进程Pi提出资源请求Requesti[j]时:

  1. 检查合法性:若Requesti[j] ≤ Need[i,j],转2;否则错误
  2. 检查可用性:若Requesti[j] ≤ Available[j],转3;否则进程等待
  3. 试分配
    • Available[j] := Available[j] – Requesti[j]
    • Allocation[i,j] := Allocation[i,j] + Requesti[j]
    • Need[i,j] := Need[i,j] – Requesti[j]
  4. 安全性检查:执行安全性算法
    • 若新状态安全,则正式分配
    • 若新状态不安全,则恢复原状态,进程等待

15.3.4 安全性算法

  1. 初始化
    • Work := Available(当前可用资源)
    • Finish[i] := false(所有进程未完成)
  2. 查找进程:查找满足Finish[i]=false且Need[i] ≤ Work的进程Pi
  3. 若找到
    • Work := Work + Allocation[i](假设Pi完成,释放资源)
    • Finish[i] := true
    • 重复步骤2
  4. 检查:若所有Finish[i]=true,则系统安全;否则不安全

死锁的检测与解除

死锁检测

  • 检测时机
    1. 定时检测
    2. 当进程阻塞时检测
    3. 系统资源利用率下降时检测
  • 资源分配图法
    1. 图表示:G=
      • V:结点集,分为进程结点P和资源结点R
      • E:边集,<pi,rj>为申请边,<rj,pi>为分配边
    2. 资源表示
      • 资源类:方框表示
      • 资源实例:方框中黑圆点
      • 进程:圆圈加进程名
    3. 死锁定理
      • 若无环路,则无死锁
      • 若有环路且每类资源只有一个实例,则环路是死锁的充要条件
    4. 资源分配图化简
      • 找一个只有分配边的非孤立进程结点,去掉分配边使其孤立
      • 将相应资源分配给等待该资源的进程(申请边变分配边)
      • 重复直至所有进程孤立(可完全简化)或无进程可简化(不可完全简化)
      • 死锁充分条件:资源分配图不可完全简化

15.4.2 死锁解除

  • 目标:以最小代价恢复系统运行
  • 方法
    1. 撤销所有死锁进程:代价最大
    2. 逐个撤销死锁进程:直到死锁解除
    3. 逐个剥夺资源:直到死锁解除
    4. 进程回退:将进程回退到前面某个检查点,重新执行

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. 保护操作系统不被用户程序破坏
  2. 保护用户进程之间互不干扰
  3. 保护共享数据的完整性和一致性

1.3.2 硬件支持方案

  • 界地址寄存器方案:基址寄存器 + 限长寄存器
  • 存储键方案:为每个内存块设置保护键
  • 环保护机制:多级特权保护(如0环为内核,3环为用户)

1.3.3 保护实现

  • 越界检查:硬件自动比较,越界则触发中断
  • 权限检查:通过页表/段表中的保护位实现

1.4 虚拟内存原理

1.4.1 局部性原理

  • 时间局部性:刚被访问的存储单元很可能近期再次被访问
  • 空间局部性:被访问存储单元的邻近单元很可能被访问

1.4.2 虚拟存储基本思想

  1. 部分装入:只将当前需要的部分装入内存
  2. 按需调页:访问不在内存的页面时产生缺页中断,调入所需页面
  3. 页面置换:内存满时选择合适的页面换出到外存

第二章:程序装入与链接

2.1 程序执行三步骤

  1. 编译:源程序 → 多个目标模块
  2. 链接:目标模块 + 库函数 → 装入模块
  3. 装入:装入模块 → 内存

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 解决方案

  1. 紧凑技术:移动程序合并空闲区
    • 需要动态重定位支持
    • 系统开销大
  2. 可重定位分区:定期紧凑碎片
  3. 离散分配:分页/分段从根本上避免外部碎片

第四章:分页存储管理

4.1 基本概念

4.1.1 地址划分

  • 逻辑地址 = 页号P + 页内偏移W
  • 物理地址 = 块号b + 页内偏移W
  • 页大小:通常为2的幂(如4KB)

4.1.2 关键数据结构

  • 页表:每个进程一个,存储页号到块号的映射
  • 物理块表:系统全局,记录物理块使用情况

4.2 地址映射过程

4.2.1 基本映射步骤

  1. 分离逻辑地址为页号P和页内偏移W
  2. 以P为索引查页表,得物理块号b
  3. 物理地址 = 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 地址转换

  1. 根据进程ID和虚拟页号在倒排页表中查找
  2. 找到对应表项即得物理帧号
  3. 未找到则产生缺页异常

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 共享实现

  • 代码共享:只读页面可多进程共享
  • 写时复制
    1. 初始时共享同一物理页(只读)
    2. 任一进程写入时触发保护异常
    3. 操作系统复制页面,修改权限为可写
  • 共享数据结构:页表指向相同物理帧

第五章:分段存储管理

5.1 基本概念

5.1.1 分段与分页对比

特性分页分段
划分单位固定大小页逻辑意义段
用户透明性透明可见
地址空间一维二维(段号+段内偏移)
碎片类型内部碎片外部碎片
共享难度困难容易
动态链接不支持支持
保护粒度页级别段级别

5.1.2 分段优势

  1. 逻辑清晰:按功能模块组织
  2. 便于共享:以段为单位共享
  3. 动态链接:需要时再链接模块
  4. 动态增长:数据段、栈段可动态扩展

5.2 地址映射

5.2.1 段表结构

  • 段基址:段在内存中的起始地址
  • 段长度:段的长度限制
  • 保护位:读/写/执行权限
  • 状态位:是否在内存、是否被修改等

5.2.2 映射过程

  1. 从逻辑地址提取段号S和段内偏移D
  2. 以S为索引查段表,得段基址B和段长L
  3. 检查D < L(越界检查)
  4. 物理地址 = B + D

5.2.3 保护机制

  • 越界检查:D必须小于段长L
  • 权限检查:根据保护位检查访问合法性
  • 环保护:多级特权保护机制

5.3 分段系统的共享

5.3.1 共享段表

  • 系统维护:全局共享段表
  • 表项内容
    • 段名/段号
    • 段长
    • 内存地址
    • 共享进程计数
    • 其他管理信息

5.3.2 共享过程

  1. 首次共享
    • 分配内存空间
    • 创建共享段表项
    • count=1
  2. 后续共享
    • 不分配新空间
    • 修改进程段表指向共享段
    • count++
  3. 回收共享
    • count–
    • 若count=0,释放内存

5.4 段页式存储管理

5.4.1 设计思想

  • 用户视角:分段(二维地址)
  • 系统视角:每段再分页(一维管理)
  • 地址结构:段号S + 页号P + 页内偏移W

5.4.2 地址映射过程

  1. 根据段号S查段表,得页表基址
  2. 根据页号P查页表,得物理块号
  3. 物理地址 = 物理块号 × 页大小 + W

5.4.3 访存次数分析

  • 无快表:3次访存(段表→页表→数据)
  • 有快表
    • 命中:1次访存
    • 未命中:3次访存

5.4.4 优缺点

  • 优点
    • 结合分段和分页优点
    • 便于共享和保护
    • 无外部碎片
  • 缺点
    • 地址转换复杂
    • 管理开销大
分类: 未分类