Skip to content

操作系统笔记

复习顺序

第一优先级是六类综合应用题:

  1. 进程调度算法
  2. 银行家算法
  3. P、V操作
  4. 分页和分段地址转换
  5. FIFO、LRU、OPT页面置换
  6. FCFS、SSTF、SCAN磁盘调度

第一章 操作系统概述

1. 操作系统的定义

操作系统是控制和管理计算机系统内各种硬件和软件资源、有效组织多道程序运行的系统软件,是用户与计算机之间的接口。

可以从三方面理解:

  • 操作系统是什么:系统软件
  • 操作系统管理什么:计算机中的软硬件资源
  • 操作系统有什么作用:扩充硬件功能,方便用户使用

操作系统位于裸机之上,是计算机系统中的第一层软件。

2. 操作系统的五大功能

  1. 进程和处理机管理
  2. 存储管理
  3. 文件管理
  4. 设备管理
  5. 用户接口管理

3. 操作系统的四大特征

并发性

两个或多个事件在同一时间段内发生。

单CPU中,多个进程在宏观上同时运行,在微观上交替占用CPU。

共享性

系统中的资源可以被多个并发进程共同使用。

共享分为:

  • 互斥共享:同一时刻只能由一个进程使用
  • 同时共享:多个进程可以在同一时间段内共同使用

虚拟性

通过某种技术,把一个物理实体变成若干个逻辑上的对应物。

异步性

多个进程按照各自独立、不可预知的速度向前推进,表现为走走停停。

其中,操作系统最基本的两个特征是:

text
并发性和共享性

4. 并发与并行

概念含义
并发多个事件在同一时间段内发生
并行多个事件在同一时刻真正同时发生

单CPU可以实现并发,真正并行通常需要多核或多个处理器。

5. 多道程序设计

多道程序设计是把多个程序同时放入内存,使它们在一台处理机上并发运行。

当一个程序等待I/O时,CPU可以执行另一个程序。

作用:

  • 提高CPU利用率
  • 提高系统资源利用率
  • 提高系统吞吐量

程序道数不是越多越好。进程过多会增加调度、切换和资源竞争的开销。

批注

类比算法的"时间换空间"——并发度(资源占用)↑,开销(时间成本)也 ↑,要在此消彼长中找平衡点。三类开销分别是:

  • 调度开销:调度器本身消耗 CPU,进程越多决策越频繁
  • 切换开销:保存/恢复上下文、TLB 与 Cache 失效
  • 竞争开销:CPU、内存、I/O 争抢加剧,缺页/锁等待变多

6. 操作系统的主要类型

三者区分的主线——对响应时间的要求不同

  • 响应时间:从提交请求到第一次收到回应的等待时间(聚焦"等多久才有反馈")
  • 周转时间:从提交作业到整个任务跑完的总时间(聚焦"全部完成要多久")
  • 批处理追求吞吐量大,响应时间/周转时间长无所谓(人不在现场等);分时要把响应时间压到秒级(人在终端前);实时必须严格保证截止时间(毫秒级,错过就出事)。

多道批处理系统

特点:

  • 吞吐量较大
  • 资源利用率较高
  • 交互能力差
  • 作业周转时间较长

分时系统

多个用户共享CPU时间,每个用户轮流获得时间片。

特点:

  1. 多路性
  2. 独立性
  3. 及时性
  4. 交互性

时间片一定时,用户数量越多,响应时间通常越长。

实时系统

系统必须在规定时间内对外部事件作出响应。

常用于工业控制、航空航天、医疗监控和武器控制。

其他类型还有网络操作系统、分布式操作系统、个人机操作系统和嵌入式操作系统。

第二章 进程与线程

1. 进程的定义

进程是程序在并发环境中的一次执行过程。

进程通常由以下三部分组成:

  1. 程序段
  2. 数据段
  3. 进程控制块PCB

传统操作系统中,进程是系统进行资源分配和调度的独立单位。

2. 程序与进程的区别

项目程序进程
性质静态动态
含义指令和代码的集合程序的一次执行过程
生命周期可以长期保存有创建、运行和结束过程
状态没有运行状态有就绪、运行、阻塞等状态
资源不直接分配运行资源系统为其分配资源
组成主要是程序代码程序段、数据段和PCB

进程三部分对照

  • 程序段:指令代码,只读可共享(多进程跑同一程序时共用一份)
  • 数据段:运行时的数据(变量、栈、堆),每个进程独立一份
  • PCB:进程的"身份证/档案",含 PID、CPU 现场、调度/资源信息;PCB 是进程存在的唯一标志,销毁 PCB 即销毁进程

同一个程序多次运行,会形成多个不同的进程。

程序与进程不是一一对应的关系。

3. 进程的特性

  1. 动态性
  2. 并发性
  3. 独立性
  4. 异步性
  5. 结构性

其中,动态性和并发性是进程最基本的属性。

4. PCB

PCB是进程控制块,是进程存在的唯一标志。

操作系统通过PCB感知、管理和控制进程。

PCB的主要内容:

  1. 进程标识符
  2. 处理机状态信息
  3. 进程调度信息
  4. 进程控制信息

处理机状态信息用于保存程序计数器、寄存器等运行现场。

进程调度信息包括进程状态、优先级等信息。

5. 进程的三种基本状态

就绪态

进程已经获得除CPU以外的所有必要资源,只等待获得CPU。

运行态

进程已经获得CPU,正在运行。

阻塞态

进程正在等待某个事件或资源,暂时不能继续运行。

6. 进程状态转换

text
就绪态 ──进程调度──→ 运行态

运行态 ──时间片用完或被抢占──→ 就绪态

运行态 ──等待事件或资源──→ 阻塞态

阻塞态 ──等待事件完成──→ 就绪态

阻塞态不能直接转为运行态,必须先进入就绪态。

进程的阻塞通常是进程自身的主动行为。

进程等待的事件完成后,由唤醒原语将其转为就绪态。

7. 单CPU中各状态的进程数量

系统中共有N个进程:

状态最小值最大值
运行态01
阻塞态0N
就绪态0N-1

8. 为什么引入线程

进程的创建、撤销和切换开销较大。

我的理解

引入线程之前是一个进程就是一个任务,创建、撤销、切换只要次数上来累计开销都挺大。引入线程之后,能共享同一组资源的不同任务可以在一个进程下被 CPU 调度,比频繁以进程作为调度对象节省开销。

引入线程可以:

  • 减少创建和切换开销
  • 提高系统并发程度
  • 方便同一进程中的任务共享资源

9. 线程的定义

线程是进程中的一个执行单元,是CPU调度和分派的基本单位。

三层关系

  • 进程管资源(占内存、开文件、拥有独立地址空间)
  • 线程用 CPU(被调度器分配时间片)
  • 同进程内的线程共享资源、轮流上 CPU

引入线程后:

text
进程:资源分配的基本单位
线程:CPU调度和分派的基本单位

10. 进程与线程的区别

项目进程线程
基本作用资源分配的基本单位CPU调度的基本单位
地址空间不同进程相互独立同一进程中的线程共享
系统资源拥有独立资源共享所属进程的资源
创建和切换开销较大较小
通信需要进程通信机制同一进程内可直接共享数据
独立性较强较弱

每个线程拥有自己的程序计数器、寄存器、栈和运行状态。

11. 进程通信

进程间的三种高级通信方式:

  1. 共享内存
  2. 管道文件
  3. 消息传递

第三章 进程同步、互斥与PV操作

1. 进程同步

进程同步是多个相互合作的进程之间存在执行顺序上的制约关系。

简单理解:

text
同步是协作,强调先后顺序

例如:

text
进程A产生数据
→ 进程B才能使用数据

2. 进程互斥

进程互斥是多个进程不能同时访问同一个临界资源。

简单理解:

text
互斥是竞争,同一时刻只能有一个进程使用资源

3. 临界资源与临界区

临界资源是一次只允许一个进程使用的资源。

例如:

  • 打印机
  • 共享变量
  • 共享文件

临界区是进程中访问临界资源的程序段。

text
临界资源:被访问的资源
临界区:访问资源的程序代码

我的理解

临界 = 不能被不同进程在同一时刻共同使用(是其本身的属性,不是"当前正在被用")。判断标准:改了会出错 + 多人想同时改 = 临界资源;只读资源、进程私有资源则不是。临界区就是访问临界资源的代码段。

4. 互斥访问的四个原则

空闲让进

临界区空闲时,应允许申请进入的进程进入。

忙则等待

临界区已有进程时,其他进程必须等待。

有限等待

进程申请进入临界区后,应在有限时间内获得进入机会。

让权等待

进程不能进入临界区时,应释放CPU,而不是一直占用CPU等待。

5. 原语

原语是操作系统中不可中断、不可分割执行的操作。

P、V操作属于原语。

6. 信号量

信号量用于实现进程同步和互斥,通常用S表示。

text
S >= 0:表示可用资源数量
S < 0:|S|表示等待该资源的进程数量

如果有m个进程竞争一个互斥资源,信号量初值为1,则取值范围为:

text
[-(m-1), 1]

7. P操作

P操作表示申请资源。

c
S = S - 1;

if (S < 0) {
    阻塞当前进程;
}

执行P操作后,如果S < 0,当前进程进入阻塞态。

一句话本质

每个 P 都是 --,每个 V 都是 ++,操作的对象是计数器。

8. V操作

V操作表示释放资源。

c
S = S + 1;

if (S <= 0) {
    唤醒一个等待进程;
}

被唤醒的进程从阻塞态转为就绪态。

9. 使用PV操作实现互斥

设互斥信号量:

c
semaphore mutex = 1;

进程结构:

c
P(mutex);

访问临界资源;

V(mutex);

P、V操作应分别放在临界区的入口和出口。

互斥一句话

mutex 是计数器(初值=1),P 拿资源、释放后 V 还资源。mutex=1 空闲,mutex=0 占用,负数表示有进程在等。

10. 使用PV操作实现同步

要求A执行完成后,B才能执行:

c
semaphore S = 0;

进程A:

c
执行A;
V(S);

进程B:

c
P(S);
执行B;

互斥 vs 同步的本质区别

  • 初值不同:互斥 mutex = 1(一开始就有 1 把钥匙,谁都能拿);同步 S = 0(一开始没通行证,必须等 A 的 V 才会有
  • 顺序不同:互斥谁都能直接 P;同步必须先有 V,才能 P——A 的 V 是给 B 的"开工许可"

一句话:互斥是"抢资源",同步是"等开工"

11. 生产者—消费者模型

有n个缓冲区时:

c
semaphore empty = n;
semaphore full = 0;
semaphore mutex = 1;

生产者:

c
P(empty);
P(mutex);

放入数据;

V(mutex);
V(full);

消费者:

c
P(full);
P(mutex);

取出数据;

V(mutex);
V(empty);

含义:

  • empty:空缓冲区数量
  • full:已有数据的缓冲区数量
  • mutex:保证对缓冲区的互斥访问

生产者-消费者模型的本质

  • 目的:解决速度不匹配、实现解耦并发
  • 缓冲区:内存里分成 n 个段,每段存 1 个数据
  • 三变量empty(空段数)、full(满段数)、mutex(使用权)
  • 核心:生产者把"空"变"满"(empty--, full++),消费者反之;empty + full = n 恒成立

12. PV应用题分析步骤

  1. 确定有几个进程或几类进程
  2. 判断进程之间是同步还是互斥
  3. 设置信号量并写明含义
  4. 确定信号量初值
  5. 将P、V放在正确位置
  6. 检查不同执行顺序下能否满足题目要求

第四章 处理机调度

1. 作业调度与进程调度

核心理解

  • 作业调度 = 把作业从外存调入内存、建立进程(管"进程从无到有")
  • 进程调度 = 从就绪队列选进程、分配 CPU(管"谁上 CPU")
  • 流程:作业(外存)→ 作业调度 → 进程(内存)→ 进程调度 → CPU

作业调度

从外存的后备作业队列中选择作业,将其调入内存并建立进程。

作业调度也称高级调度。

进程调度

从就绪队列中选择一个进程,将CPU分配给它。

进程调度也称低级调度。

text
后备作业
→ 作业调度
→ 调入内存并建立进程
→ 就绪队列
→ 进程调度
→ 获得CPU

作业被调入内存后,不代表立即获得CPU。

2. 调度评价指标

周转时间

text
周转时间 = 完成时间 - 到达时间

带权周转时间

text
带权周转时间 = 周转时间 ÷ 运行时间

平均周转时间

text
平均周转时间
= 所有进程周转时间之和 ÷ 进程数量

平均带权周转时间

text
平均带权周转时间
= 所有进程带权周转时间之和 ÷ 进程数量

只考虑CPU调度时:

text
等待时间 = 周转时间 - 运行时间

响应比

text
响应比
=(等待时间 + 运行时间)÷ 运行时间
= 1 + 等待时间 ÷ 运行时间

3. 先来先服务算法FCFS

按照进程到达的先后顺序调度。

特点:

  • 非抢占式
  • 算法简单、公平
  • 对短进程不利
  • 长进程可能使后面的短进程等待较长时间

4. 非抢占式短进程优先SJF

每次CPU空闲时,从已经到达的进程中选择运行时间最短的进程。

进程一旦开始运行,就一直运行到结束。

特点:

  • 可以降低平均周转时间
  • 长进程可能产生饥饿
  • 只能从已经到达的进程中选择

5. 抢占式短进程优先SRTF

也称最短剩余时间优先。

系统选择剩余运行时间最短的进程。

如果新到达进程的运行时间小于当前进程的剩余时间,新进程会抢占CPU。

6. 优先级调度算法

优先级调度

优先级调度 = 优先级规则(看数值大还是小代表优先)+ 抢占/非抢占(高优先级新进程到时是否抢当前 CPU)。做题前先确认题目的优先级规则

系统选择优先级最高的进程运行。

抢占式优先级调度中,如果新到达进程的优先级更高,会抢占当前进程。

计算前必须确认题目规定:

text
数值越大优先级越高

数值越小优先级越高

7. 高响应比优先算法HRRN

每次选择响应比最高的进程运行。

该算法同时考虑:

  • 进程运行时间
  • 进程等待时间

因此可以减少长进程长期等待的问题。

8. 时间片轮转算法RR

时间片本质

调度器给每个进程分配的固定时长 CPU 使用权;时间一到调度器强制剥夺(不是进程主动让出),切换给下一个进程。所以 RR 是抢占式调度。

系统为每个进程分配一个固定时间片。

时间片用完后,进程尚未结束:

text
运行态 → 就绪态

然后进入就绪队列末尾。

特点:

  • 属于抢占式调度
  • 适用于分时系统
  • 时间片过大时接近FCFS
  • 时间片过小时切换开销过大

6 个算法精简对比

算法选择谁抢占一句话
FCFS先到先跑排队
SJF最短的谁短谁先
SRTF剩余最短抢最短的
优先级优先级最高可选看优先级 + 规则
HRRN响应比最高算响应比
RR时间片轮转轮流来

判断抢占:新进程到达时检查要不要换 → 抢占;当前跑完才选 → 非抢占 判断优先级:题目没说时默认"数值大 = 高",但必看题目规定

9. 调度计算步骤

计算开始/完成时间的核心

开始时间 = max(到达时间, 上一进程完成时间) —— 只有两个条件都满足才能开始跑 完成时间 = 开始时间 + 运行时间

计算开始时间需要结合:

  1. 调度原则(FCFS 按到达,SJF 按最短…)
  2. 到达时间(还没到的进程不能选)
  3. 前一个进程的完成时间(CPU 还在忙就不能开始)
  1. 根据时间判断已经到达的进程
  2. 根据调度算法选择进程
  3. 画出执行时间线或甘特图
  4. 计算开始时间和完成时间
  5. 计算周转时间和带权周转时间
  6. 计算平均值

第五章 死锁

1. 死锁的定义

死锁是多个进程因竞争资源而相互等待,导致这些进程都无法继续执行的状态。

2. 死锁产生的原因

  1. 系统资源数量有限
  2. 进程申请和释放资源的顺序不合理

3. 死锁的四个必要条件

互斥条件

资源同一时刻只能由一个进程使用。

占有且申请条件

进程已经占有部分资源,又申请新的资源,并且在等待时不释放已有资源。

也称请求和保持条件。

不可抢占条件

进程已经获得的资源,在使用完成前不能被其他进程强行夺走。

循环等待条件

多个进程之间形成首尾相连的循环等待关系。

四个条件必须同时成立,才可能产生死锁。

4. 处理死锁的四种方法

  1. 预防死锁
  2. 避免死锁
  3. 检测死锁
  4. 解除死锁

5. 死锁预防

死锁预防 = 破坏四个必要条件

  • 破坏互斥 → 让资源可共享
  • 破坏占有且申请 → 要么一次拿完,要么先放后拿
  • 破坏不可抢占 → 申请不到就释放已有资源
  • 破坏循环等待 → 资源编号,按序申请

只需记住破坏哪一个,具体实现不考

破坏互斥条件

使资源可以共享。

缺点:打印机等资源本身无法同时共享。

破坏占有且申请条件

要求进程一次性申请全部资源,或者申请新资源前释放已有资源。

缺点:

  • 资源利用率低
  • 进程可能长期等待
  • 可能产生饥饿

破坏不可抢占条件

进程申请新资源失败时,释放已经占有的资源。

缺点:

  • 实现复杂
  • 已完成的工作可能失效
  • 并非所有资源都适合抢占

破坏循环等待条件

对资源统一编号,进程必须按照编号递增顺序申请资源。

缺点:

  • 限制资源申请顺序
  • 使用不灵活
  • 可能降低资源利用率

6. 死锁避免与安全状态

死锁避免是在分配资源前进行判断,只允许系统进入安全状态。

银行家算法属于死锁避免算法。

text
安全状态:一定不会发生死锁
不安全状态:可能发生死锁,但不等于已经死锁

安全 vs 不安全

  • 安全:存在一个安全序列,按这个顺序跑完所有进程都不会卡住
  • 不安全:找不到这样的序列——但不等于已死锁,只是"有死锁风险"

银行家算法的核心就是:只在安全时才分配资源

7. 银行家算法的数据

银行家算法总览

银行家算法 = 数据准备(第 7 节)+ 安全性检查(第 8 节)+ 资源请求判断(第 9 节)

题型 1:判断系统是否安全(直接跑安全性检查)
题型 2:判断能否批准资源请求(5 步流程:检查条件 → 试分配 → 安全性检查 → 决定)

核心思想:分配前先推演——按某种顺序能不能让所有进程跑完?能 → 安全,分配;不能 → 不安全,拒绝

text
Max:进程的最大资源需求量

Allocation:已经分配给进程的资源量

Need:进程还需要的资源量

Available:系统当前可用资源量
text
Need = Max - Allocation

8. 安全性检查

安全性检查 = 反复找一个能跑完的进程

  1. 初始:Work = Available
  2. :谁 Need ≤ Work?(能跑完的)
  3. 假设它跑完:Work += Allocation(资源还回来)
  4. 重复:直到所有人都跑完 → 安全(记下安全序列);卡住找不到 → 不安全

判不安全的深入理解:有多个选择时(分叉),如果每一条分支都跑不通(所有路径都卡住)→ 才算真正不安全 考试技巧:随便挑一个分支往下做;草稿要干净,标清每一步的 Work 值,方便回溯换分支

设置:

text
Work = Available

寻找满足以下条件的进程:

text
Need[i] <= Work

假设该进程能够完成并释放资源:

text
Work = Work + Allocation[i]

继续寻找下一个进程。

如果所有进程最终都能完成,则系统处于安全状态,完成顺序就是安全序列。

银行家算法做题模板(4 步法)

Step 1 算 NeedNeed = Max - Allocation(每行单独算) Step 2 算 AvailableAvailable = 总资源 - 所有 Allocation 加起来Step 3 设 WorkWork = Available,写在草稿最上面 Step 4 反复找Need ≤ Work 的进程 → 让它跑完 → Work += Allocation注意:加的是 Allocation,不是 Need

关键:模拟"进程跑完还资源"时,系统增加的是这个进程原本已经占有的(Allocation),不是它还需要多少(Need)

判安全:所有进程都跑完 → 安全(写下安全序列) 判不安全:卡住 / 第一步就找不到能跑的 → 不安全 分支回溯:多个选择时随便挑一个,卡了就换下一个;所有分支都卡 → 真正不安全

草稿要点

  • 每步标清 Work 的值
  • 用箭头画清资源流转
  • 选完的进程打勾,避免重复选

9. 处理进程资源请求

请求 = 加到 Pi 的 Allocation 上

试分配就是 Request 加到 Pi 原本的 Allocation 上,Pi 的 Need 减少,系统 Available 减少。

进程Pi提出请求Request[i]

先检查:

text
Request[i] <= Need[i]
text
Request[i] <= Available

满足后进行试分配:

text
Available = Available - Request[i]

Allocation[i] = Allocation[i] + Request[i]

Need[i] = Need[i] - Request[i]

再进行安全性检查。

  • 系统安全:正式分配
  • 系统不安全:撤销试分配,让进程等待

10. 保证不死锁的资源数量

有n个进程,每个进程最多需要k个同类资源。

保证系统不会因为该类资源发生死锁,需要:

text
资源总数R >= n × (k - 1) + 1

11. 解除死锁的方法

死锁已经发生,只能"收拾残局"

  1. 杀进程(撤销死锁进程)
  2. 抢资源(剥夺资源给别的进程)
  3. 回退(让进程回到之前的安全状态)

口诀:杀、抢、退——理解就好,不深究。

第六章 存储管理

1. 逻辑地址与物理地址

逻辑地址是程序中使用的地址,也称相对地址。

物理地址是内存中存储单元的实际地址,也称绝对地址。

2. 重定位

逻辑地址转换为物理地址的过程称为重定位或地址转换。

静态重定位

程序装入内存时,一次性完成全部地址转换。

特点:

  • 实现简单
  • 程序运行过程中不能随意移动

动态重定位

程序运行过程中,每次访问指令或数据时进行地址转换。

特点:

  • 需要硬件支持
  • 程序运行过程中可以移动
  • 更适合现代存储管理

3. 固定分区与可变分区

固定分区

系统预先把内存划分为若干固定分区。

特点:

  • 分区大小预先确定
  • 可以支持多道程序
  • 容易产生内部碎片

可变分区

系统根据作业大小动态划分连续内存空间。

特点:

  • 分区大小适合作业需要
  • 容易产生外部碎片

4. 内部碎片与外部碎片

类型含义常见方式
内部碎片已分配区域内部没有使用的空间固定分区、分页
外部碎片已分配区域之间分散的小空闲区可变分区、分段

5. 可变分区分配算法

首次适应算法FF

从空闲分区表开头开始,选择第一个满足要求的分区。

空闲分区一般按地址递增排列。

循环首次适应算法NF

从上一次查找结束的位置继续向后寻找。

查找到末尾后,再从表头继续查找。

最佳适应算法BF

选择能够满足要求的最小空闲分区。

空闲分区一般按容量递增排列。

容易产生大量很小的外部碎片。

最差适应算法WF

选择当前最大的空闲分区。

空闲分区一般按容量递减排列。

会不断消耗系统中的大空闲分区。

6. 可变分区回收

回收一个分区时:

text
上下都不是空闲区
→ 新增一个空闲分区
text
只有上方是空闲区
→ 与上方空闲区合并
text
只有下方是空闲区
→ 与下方空闲区合并
text
上下都是空闲区
→ 三个区域合并
→ 空闲分区数量减少1

7. 紧凑技术

紧凑技术通过移动已分配区域,把分散的外部碎片集中成一个较大的连续空闲区。

紧凑不会增加内存容量,通常需要动态重定位支持。

可变分区 · 三件套

  • 分配 = 4 个算法(FF/NF/BF/WF)选策略
  • 回收 = 看上下是否空闲,决定合并/新增
  • 紧凑 = 物理移动已分配区域,需要动态重定位支持

共同目的:减少/消除外部碎片

8. 分页存储管理

分页把逻辑地址空间划分为大小相同的页面,把内存划分为同样大小的物理块。

页表保存:

text
页号 → 物理块号

每个进程通常有自己的页表。

逻辑地址由两部分组成:

text
逻辑地址 = 页号 + 页内偏移量

9. 分页地址转换

分页单位换算(必背)

换算规则:1KB = 1024 = 2¹⁰,每升一级 × 2¹⁰

单位字节数2 的幂
1B12⁰
1KB10242¹⁰
1MB1024×10242²⁰
1GB1024³2³⁰

页面大小计算规则nKB = 1024 × n = 2⁽¹⁰⁺ᵏ⁾(k = log₂n)

页面大小字节数2 的幂n(位数)
1KB10242¹⁰10
2KB20482¹¹11
4KB40962¹²12(最常考)
8KB81922¹³13
16KB163842¹⁴14
32KB327682¹⁵15

计算技巧:页面大小 = 2ⁿ → n 就是页内偏移的位数(后面地址位数题要用)

已知逻辑地址A和页面大小L

text
页号 = A ÷ L的整数部分
text
页内偏移量 = A mod L

查页表获得物理块号后:

text
物理地址
= 物理块号 × 页面大小 + 页内偏移量

如果题目给出用户区起始地址:

text
物理地址
= 用户区起始地址
+ 物理块号 × 页面大小
+ 页内偏移量

10. 分页地址位数

如果页面大小为:

text
2^n字节

则页内偏移量占n位。

如果逻辑空间有:

text
2^m页

则页号占m位。

text
逻辑地址位数 = 页号位数 + 页内偏移位数

算对的自检

页内偏移(余数)必然 < 页大小(除数)——算完用它验证一下,不等就算错了

11. 分段存储管理

分段按照程序的逻辑结构划分程序。

逻辑地址表示为:

text
(段号,段内偏移量)

段表项通常包括:

  • 段始址
  • 段长
  • 状态信息

地址转换时先判断:

text
段内偏移量 < 段长

分段越界判断

判断依据:段内偏移量 < 段长(偏移必须小于段大小,否则越界报错) 物理地址公式:段始址 + 段内偏移量(仅一个加法)

合法时:

text
物理地址 = 段始址 + 段内偏移量

12. 地址越界、缺页和缺段

地址越界

页号或段号超过程序合法范围,或者段内偏移量超过段长。

缺页

页号合法,但页面当前不在内存中,产生缺页中断。

缺段

段号合法,但该段当前没有装入内存,产生缺段中断。

地址越界:访问的地址本身不合法 缺页或缺段:地址合法,只是内容当前不在内存

三种异常的本质区别

  • 地址越界:地址本身不合法(程序员 bug,超出了段长/页号范围)
  • 缺页/缺段:地址合法,但内容当前不在内存(需要从磁盘调入)

第七章 虚拟存储器与页面置换

1. 虚拟存储器的定义

虚拟存储器是操作系统为用户提供的、比实际物理内存更大的逻辑地址空间

虚拟存储器的容量不是无限的,主要受到以下因素限制:

  • 地址字长
  • 外存容量

内存 vs 外存

  • 内外不是按物理位置分的——是按 CPU 能不能直接访问分的
  • 内存(RAM):CPU 能直接访问,快但小
  • 外存(硬盘/SSD/U盘):CPU 不能直接访问,要先搬到内存;慢但大
  • 硬盘虽然在电脑里,但因为 CPU 不能直接读,也叫"外存"

2. 虚拟存储器的三个特征

虚拟存储器的本质

  • 虚拟存储器 = 内存(真)+ 外存(假装)——OS 让程序以为内存很大
  • 把外存幻觉成内存,要用时搬上来
  • 容量上限受两个限制
    • 外存容量(仓库要够大)
    • 地址字长(CPU 编址能力,位数越多能指向越大内存)
    • 取两者中较小的那个

地址字长举例

  • 32 位地址 → 最多 2³² = 4GB
  • 64 位地址 → 最多 2⁶⁴ ≈ 1.8 × 10¹⁹ 字节
  • 即使有 1TB 硬盘,32 位 CPU 也只能"指向" 4GB 范围

多次性

程序不需要一次全部装入内存,可以分多次调入。

对换性

程序运行过程中,页面可以在内存和外存之间换入、换出。

虚拟性

用户看到的逻辑存储空间大于实际物理内存。

3. 请求分页


普通分页 vs 请求分页

  • 普通分页一次性把所有页面都装入内存,程序才能跑
  • 请求分页用到才装——用到哪页才从外存调入哪页,没用到就放外存
  • 请求分页会产生缺页中断(访问不在内存的页时)
  • ⭐️请求分页是虚拟存储器的实现方式

"装入"的对象:程序的页面(4KB 一小块)—— 里面装的是代码段 / 数据段 / 栈 / 堆等程序内容

请求分页的本质:当前要用的代码和数据放进内存,其他暂时放在外存(用到时再调)

请求分页是在普通分页基础上增加虚拟存储功能。****

程序开始运行时,只装入当前需要的页面。

访问未装入内存的页面时:

text
产生缺页中断
→ 从外存调入页面
→ 更新页表
→ 重新执行被中断的指令

请求分页需要:

  1. 页表机制
  2. 缺页中断机构
  3. 地址转换机构
  4. 一定容量的内存和外存

请求分页的 4 个需求

  • 页表机制:记录每个页面在不在内存(状态位)
  • 缺页中断机构:发现页面不在内存时自动处理(暂停 + 调入 + 继续)
  • 地址转换机构:把逻辑地址变成物理地址
  • 内存 + 外存:硬件基础(内存放当前在用的,外存放暂时不用的)

4. 页表项

请求分页中的页表项通常包括:

  1. 物理块号
  2. 存在位或状态位
  3. 访问字段
  4. 修改位
  5. 外存地址

页表项 5 字段

  • 物理块号:页面在内存的块号
  • 存在位:页面是否在内存(1 在,0 不在)
  • 访问字段:记录访问情况,供置换算法用
  • 修改位:页面是否被修改过(淘汰时决定是否写回硬盘)
  • 外存地址:页面在硬盘的位置,缺页时调入用

存在位:

text
存在位为1:页面在内存中
存在位为0:页面不在内存中

5. 缺页次数与置换次数

缺页 vs 页面置换

  • 缺页:要用的页面不在内存(必发生)
  • 页面置换:内存满 + 缺页 → 淘汰一个旧页面,腾出位置
  • 关系内存有空块 → 只缺页不置换;内存无空块 → 缺页 + 置换
  • 因此缺页次数 ≥ 置换次数

页面不在内存时,发生缺页。

如果内存还有空闲物理块:

text
发生缺页
但不发生页面置换

如果内存已经没有空闲物理块:

text
发生缺页
同时需要淘汰一个页面

因此:

text
缺页次数通常大于或等于置换次数

6. FIFO页面置换算法

淘汰最早进入内存的页面。

特点:

  • 实现简单
  • 不考虑页面实际使用情况
  • 可能出现Belady异常

Belady异常是:

text
分配的物理块数量增加
缺页次数反而增加

7. OPT页面置换算法

淘汰未来最长时间不会被访问,或者以后不再访问的页面。

特点:

  • 理论上缺页次数最少
  • 实际系统无法预知未来
  • 常用于评价其他置换算法

8. LRU页面置换算法

淘汰过去最长时间没有被访问的页面。

判断时,从当前位置向前看,哪个页面最久没有使用,就淘汰哪个页面。

特点:

  • 符合程序局部性
  • 性能较好
  • 实现开销较大

三个置换算法对比

算法淘汰谁一句话
FIFO最早进入内存的页面谁先来谁先走
OPT未来最久不被访问的页面谁将来最没用
LRU过去最久没被访问的页面谁过去最没用

FIFO = 看"最早";OPT = 看"未来";LRU = 看"过去最久没用"

关键:FIFO 按"第一次进来"的时间算(用了多少次都不更新),这就是 Belady 异常的根源

LRU 本质:找"最近一次使用位置最远的"淘汰——即"过去最久没用"的。两个候选使用次数相同时,也是用这个规则判断谁离当前更远

多候选时的处理:FIFO / OPT / LRU 都有可能出现多个"符合规则"的候选——任选一个即可,都给分

9. 页面置换题步骤

  1. 写出页面访问序列
  2. 画出物理块
  3. 从左到右逐个访问页面
  4. 页面已在内存中,不缺页
  5. 页面不在内存中,发生缺页
  6. 没有空闲块时,按照算法淘汰页面
  7. 记录缺页次数和淘汰序列
text
缺页率
= 缺页次数 ÷ 页面访问总次数 × 100%

10. 抖动

抖动是进程频繁发生缺页,大部分时间用于页面换入、换出,CPU利用率很低的现象。

常见原因:

  • 分配给进程的物理块太少
  • 同时运行的进程过多
  • 页面置换策略不合理

抖动 - 考试导向

  • 这是什么:频繁换页导致 CPU 利用率低的现象
  • 怎么考:⭐ 选择/填空(解释什么是抖动 + 原因)
  • 不考:大题
  • 学到什么程度理解现象 + 记住 3 个原因就够了

第八章 设备管理

1. 设备管理的主要功能

  1. 监视设备状态
  2. 分配和回收设备
  3. 控制和完成I/O操作
  4. 管理缓冲区
  5. 实现设备独立性
  6. 提高设备利用率

2. 按资源分配方式分类

独占设备

一段时间内只能由一个进程使用。

例如打印机。

共享设备

可以被多个进程交替使用。

例如磁盘。

虚拟设备

通过技术把独占设备改造成逻辑上可以共享的设备。

3. 按信息交换单位分类

块设备

以数据块为单位传送数据。

例如磁盘。

字符设备

以字符为单位传送数据。

例如键盘、打印机和终端。

4. 设备独立性

设备独立性是用户程序与实际使用的物理设备无关。

用户程序使用逻辑设备名,操作系统负责将其映射到具体的物理设备。

5. 设备驱动程序

设备驱动程序是直接控制设备打开、关闭、读、写和数据传输的核心模块。

它位于操作系统和设备控制器之间。

6. I/O控制方式

程序查询方式

CPU不断查询设备状态,CPU利用率较低。

中断方式

CPU启动设备后执行其他程序,设备完成后通过中断通知CPU。

DMA方式

DMA控制器负责设备和内存之间的成批数据传送,不需要CPU逐个传送数据。

通道方式

通道是I/O专用处理器,可以执行通道程序并控制多个设备。

需要CPU干预最少的是通道方式。

I/O 控制方式 · 三个核心解惑点

  • 核心问题:让 CPU 少等设备,演进:查询 → 中断 → DMA → 通道
  • OS vs 计组:OS 看效率和利用,计组看硬件实现
  • DMA vs 通道:通道 = DMA 超集。区别就一条——通道有指令集能跑程序、可独立决策、能管多设备;DMA 只能听 CPU 指挥搬数据

7. 通道瓶颈

多个设备共用数量有限的通道时,通道可能限制I/O系统的并行能力。

改善方法:

  • 增加通道数量
  • 增加设备与通道之间的连接路径

8. 引入缓冲区的原因

  1. 缓解CPU与I/O设备之间速度不匹配
  2. 减少CPU中断次数
  3. 放宽CPU对中断响应时间的要求
  4. 解决数据传送单位大小不一致
  5. 提高CPU与设备并行工作的程度

缓冲区位于主存中。

缓冲区是什么

缓冲区 = 内存里的小池子,连接设备和磁盘/打印机,做中转和速度匹配。

9. 单缓冲、双缓冲和环形缓冲

单缓冲

只设置一个缓冲区。

实现简单,但设备和进程仍可能相互等待。

双缓冲

设置两个缓冲区交替使用。

text
设备向一个缓冲区输入数据
同时进程处理另一个缓冲区中的数据

双缓冲的并行程度高于单缓冲。

双缓冲精髓:轮换

A 装 + B 用 → 切到 B 装 + A 用 → CPU 和设备同时干活、各不耽误

环形缓冲

多个缓冲区首尾相接组成环形。

适合连续、高速的数据传送,需要管理空缓冲区、满缓冲区以及读写位置。

环形缓冲精髓

池子数固定 + 循环复用(不释放)→ 减少"申请/释放"开销 → 提高效率。适合数据流特别大且连续的场景。

缓冲区 · 核心要点

  • 本质:内存里开一块中转站
  • 核心问题CPU 不等 I/O 设备(不是设备等 CPU)—— CPU 启动 I/O 后干别的,I/O 慢慢塞缓冲区
  • 5 个原因都围绕"速度差":解决 CPU 与 I/O 速度不匹配、提高并行
  • 三种缓冲演进:单(1 个,相互等)→ 双(2 个,并行)→ 环形(多个连续流)

10. SPOOLing技术

SPOOLing也称假脱机技术。

它利用磁盘空间和常驻内存进程,把独占设备改造成逻辑上的共享设备

11. SPOOLing系统的组成

  1. 输入井
  2. 输出井
  3. 输入缓冲区
  4. 输出缓冲区
  5. 输入进程
  6. 输出进程

输入井和输出井位于磁盘中。

输入缓冲区和输出缓冲区位于主存中。

6 组件对应到打印流程(打印只用"输出"那 3 个)

  • ① 用户提交 → 数据在用户内存
  • ② 搬中转 → 输出缓冲区(内存)搬数据
  • ③ 写仓库 → 输出井(磁盘)长期存 + 排队
  • ④ 取任务 → 输出进程按队列取出
  • ⑤ 再中转 → 输出缓冲区(内存)喂打印机
  • ⑥ 打印 → 打印机

3 输入 + 3 输出 = 对称结构;考试重点是输出(打印),输入理解"对称"即可。

12. SPOOLing打印过程

用户提交打印数据 → 系统在输出井申请磁盘空间 → 将打印数据写入输出井 → 填写打印请求表 → 将请求挂入打印请求队列 → 打印机空闲时,输出进程取出请求 → 将数据送入内存输出缓冲区 → 控制打印机打印

13. SPOOLing的优点

  • 将独占设备改造成虚拟共享设备
  • 提高设备利用率
  • 提高CPU与设备并行工作的程度
  • 减少进程等待低速设备的时间
  • 属于以空间换时间的技术

SPOOLing · 核心要点

  • 本质:用磁盘当中转站,把独占设备"假共享"
  • 核心机制:进门(写磁盘,快)+ 出门(按队列打印,慢)= 解耦
  • 6 组成:输入/输出井(磁盘)+ 输入/输出缓冲区(内存)+ 输入/输出进程
  • 打印流程:提交 → 入输出井 → 排队 → 输出进程取出 → 送输出缓冲区 → 打印机
  • 特点以空间换时间——磁盘换 CPU 和设备的等待时间

SPOOLing 简答模板(2 道最常考)

模板 1:简述 SPOOLing 工作过程

  1. 用户提交数据,系统在输出井(磁盘)申请空间
  2. 数据写入输出井,形成打印请求队列
  3. 打印机空闲时,输出进程按队列取出
  4. 数据送入内存的输出缓冲区
  5. 控制打印机打印

模板 2:如何把独占设备改造成共享

  • 核心思路:磁盘当中转
  • 进程不直接用打印机,数据先写入磁盘的输出井排队
  • 输出进程按队列取出,送给打印机
  • 实质是以磁盘空间换时间

第九章 磁盘调度

1. 磁盘访问时间

text
磁盘访问时间
= 寻道时间
+ 旋转延迟时间
+ 数据传输时间

寻道时间

磁头移动到目标柱面所需的时间。

旋转延迟时间

等待目标扇区旋转到磁头下方所需的时间。

数据传输时间

实际读取或写入数据所需的时间。

磁盘调度的主要目的是缩短寻道时间。

2. 先来先服务算法FCFS

按照磁盘请求到达的先后顺序进行处理。

特点:

  • 简单、公平
  • 不会产生饥饿
  • 磁头可能频繁来回移动
  • 总寻道距离可能较大

3. 最短寻道时间优先SSTF

每次选择距离当前磁头位置最近的请求。

特点:

  • 通常可以减少寻道距离
  • 远处请求可能长期得不到处理
  • 可能产生饥饿

4. 扫描算法SCAN

磁头先沿一个方向移动,依次处理该方向上的请求,到达端点后反向处理。

也称电梯算法。

特点:

  • 磁头移动比较有规律
  • 性能比较稳定
  • 不容易产生长期等待
  • 必须先判断磁头当前移动方向

严格SCAN会移动到磁盘端点后再反向。

部分题目中的“电梯算法”可能按LOOK处理,即到当前方向最后一个请求后直接反向,考试时按照题目和老师例题口径计算。

磁盘调度 · 3 算法例题对比

例题:磁头在 50,请求 30、100、20、150、80,方向向大,范围 0~200

算法走法总距离
FCFS50→30→100→20→150→8020+70+80+130+70 = 370
SSTF50→30→20→80→100→15020+10+60+20+50 = 160
SCAN50→80→100→150→200→30→2030+20+50+50+170+10 = 330

计算口诀:相邻柱面号取绝对值相加(不是首尾相减)

算法取舍

  • SSTF 距离最优(160)但会饿死远端请求
  • SCAN 距离次之(330)但公平稳定——像电梯
  • 实际系统多采用 SCAN/LOOK(牺牲距离换公平)

5. 磁盘调度计算步骤

  1. 写出磁头初始位置
  2. 判断磁头移动方向
  3. 根据算法排列请求顺序
  4. 写出完整移动路径
  5. 计算相邻柱面差的绝对值
  6. 将所有移动距离相加
  7. 题目给出每移动一个柱面的时间时,再计算寻道时间
text
总寻道时间
= 总移动柱面数 × 每柱面移动时间

磁盘调度做题 · 4 个易错点

  • 取绝对值:|A-B|,不是 A-B
  • 相邻求和:按顺序一段段加,不是首尾相减
  • 看方向:SCAN 必须先判断磁头移动方向
  • SCAN vs LOOK:严格 SCAN 到端点;LOOK 到最大请求就反

答题套路:初始位置 → 方向 → 排序(按算法)→ 算距离(|相邻|相加)→ × 每柱面时间

第十章 客观题补充

这部分优先级低于前面的简答题和综合题,只需要掌握基本结论。

1. 用户态与内核态

设置用户态和内核态的目的是保护操作系统内核和系统资源,不是为了提高运行速度。

用户程序通常在用户态下运行。

操作系统内核和原语通常在内核态下运行。

2. 系统调用

系统调用是操作系统提供给应用程序的接口。

用户程序通过系统调用请求操作系统服务。

3. 中断处理过程

text
保存现场
→ 分析中断原因
→ 执行中断处理程序
→ 恢复现场
→ 中断返回

CPU通常在执行完一条指令后检查是否有中断。

4. 快表TLB

快表是保存部分页表项的高速缓存。

text
先查询快表

快表命中
→ 直接得到物理块号

快表未命中
→ 再访问内存中的页表

忽略快表查询时间时:

  • 快表命中:访问一次内存
  • 快表未命中:访问页表一次,再访问数据一次,共两次内存访问

5. 段页式管理

段页式先分段,再对每一段分页。

不使用快表时,访问一次数据通常需要:

text
访问段表
→ 访问页表
→ 访问数据

即访问三次内存。

6. 文件系统

从用户角度看,文件系统的主要作用是:

text
实现文件的按名存取

多级目录通过路径名和文件名访问文件。

位示图用于管理磁盘空闲空间。

逻辑文件通常分为:

  1. 流式文件
  2. 记录式文件

7. 文件物理分配

连续分配

支持顺序访问和直接访问,速度快,但容易产生外部碎片,文件扩展困难。

链接分配

文件容易扩展,不产生外部碎片,但不适合直接访问。

索引分配

通过索引块保存文件数据块地址,支持直接访问,但需要额外索引空间。

8. 覆盖与交换

覆盖和交换技术的主要目的是节省主存空间,不是物理增加内存容量。

交换是把暂时不能运行的进程换出到外存,需要运行时再换回内存。