← 返回博客列表

一、引言:操作系统的地位与作用

操作系统(Operating System,OS)是计算机系统中最核心的系统软件,它管理和控制计算机的硬件与软件资源,合理组织计算机的工作流程,并为用户和其他软件提供方便的接口与环境。操作系统是硬件之上的第一层软件,所有其他软件(编译程序、数据库管理系统、应用程序等)都依赖操作系统的支持。

操作系统的核心定义(软考标准表述)
操作系统是计算机系统中的一个系统软件,它是这样一些程序模块的集合:它们管理和控制计算机系统中的硬件及软件资源,合理地组织计算机工作流程,以便有效地利用这些资源为用户提供一个具有足够的功能、使用方便、可扩展、安全和可管理的工作环境,从而在计算机与其用户之间起到接口的作用。

1.1 操作系统的四个特征

操作系统具有四个基本特征,这些特征是操作系统的本质体现:

考点提示:并发 vs 并行
· 并发(Concurrent):多个事件在同一时间间隔内发生(宏观同时,微观交替)
· 并行(Parallel):多个事件在同一时刻发生(真正同时执行)
· 单CPU系统只能实现并发,多CPU系统才能实现并行。考试中常考概念辨析。

1.2 操作系统的五大功能

重要提醒
操作系统的五大功能与四大特征是软考上午选择题的高频考点,必须熟记。特别是"并发性"是OS最重要的特征,其他三个特征都以并发为前提。

二、进程管理

进程管理是操作系统的核心功能之一。在多道程序环境下,进程是资源分配的基本单位,线程是CPU调度的基本单位。本节从内核态与用户态的权限分离开始,深入讲解进程、线程的原理与实现机制。

2.1 内核态与用户态:CPU的权限环模型

为了保护操作系统不受恶意或错误的用户程序破坏,CPU设计了两种(或多种)运行模式:内核态(Kernel Mode)和用户态(User Mode)。Intel x86架构提供了Ring 0 ~ Ring 3四个特权级,其中Ring 0权限最高,Ring 3权限最低。Linux/Windows实际使用了Ring 0(内核态)和Ring 3(用户态)两级。

Ring 3(用户态) Ring 2 Ring 1 Ring 0 内核态 用户态(Ring 3) • 权限受限,只能访问用户空间 • 不能直接访问硬件寄存器 • 执行用户应用程序代码 内核态(Ring 0) • 最高权限,可访问所有硬件和内存 • 执行OS内核代码(系统调用、中断) • 管理进程、内存、设备等核心资源 特权级提升(系统调用/中断) 特权级下降(返回用户态)
图 1:x86 CPU 特权级环模型(Ring 0 ~ Ring 3)

用户态到内核态的切换方式

系统调用的执行过程
1. 用户程序在用户态执行,准备好调用号和参数
2. 执行syscall指令(或int 0x80),触发软中断
3. CPU从用户态切换到内核态,保存现场(寄存器、CS:IP、EFLAGS)
4. 根据系统调用号查找内核函数,执行具体的内核代码
5. 执行完毕,恢复现场,CPU从内核态切回用户态
6. 用户程序继续执行,获取返回结果

2.2 进程概念与五态模型

进程(Process)是程序的一次执行过程,是系统进行资源分配和调度的基本单位。进程由程序段、数据段和PCB(进程控制块)三部分组成。进程具有动态性、并发性、独立性、异步性和结构性五大特征。

进程 vs 程序
· 程序:静态的指令序列,存储在磁盘上,可以长期保存,是一个软件概念
· 进程:动态的执行过程,存在生命周期(创建→执行→终止),有PCB、有状态
· 关系:一个程序可以对应多个进程(如同时打开多个Word),一个进程可以执行一个或多个程序

经典的进程五态模型描述了进程从创建到消亡的整个生命周期:

创建态 New 完成创建 就绪态 Ready(等待CPU) 运行态 Running(占CPU) 阻塞态 Blocked(等事件) 终止态 Terminated 调度选中 时间片用完 等待I/O/事件 I/O完成/事件到 完成/异常终止 异常终止
图 2:进程五态转换图 —— 运行态、就绪态、阻塞态是三态核心

五态说明:

高频考点:状态转换的方向
· 运行 → 就绪:时间片用完(或被高优先级进程抢占)
· 运行 → 阻塞:主动请求(等待I/O、P操作等待),这是唯一的主动转换
· 阻塞 → 就绪:事件发生(I/O完成、V操作唤醒)
· 就绪 → 运行:调度程序选中
· 注意:阻塞不能直接到运行!必须先到就绪态。

2.3 进程控制块(PCB)

进程控制块(Process Control Block,PCB)是进程存在的唯一标志,OS通过PCB感知进程的存在。PCB中保存了进程所需的全部信息,是进程管理的数据基础。

PCB(进程控制块)结构 ① 进程标识符(PID) • 内部标识符:唯一数字ID(如 pid=1234) • 外部标识符:进程名、用户名、父进程ID(PPID) ② 处理机状态(CPU上下文) • 通用寄存器值(AX、BX、CX...) • 指令计数器PC / 程序状态字PSW / 栈指针SP ③ 进程调度信息 • 进程状态(就绪/运行/阻塞) · 优先级(Priority) • 等待事件 · 已运行时间 · 页面使用统计 • 调度队列指针(next/prev 指针) ④ 进程控制信息 • 程序段/数据段地址 · 内存页表指针 • 打开文件列表 · I/O设备状态 · 信号处理表 • 资源使用统计 · 用户/组权限
图 3:PCB结构示意 —— PCB是进程存在的唯一标志
核心考点:PCB的作用
PCB是OS中最重要的数据结构之一:
1. OS根据PCB对并发执行的进程进行控制和管理
2. PCB是进程存在的唯一标志(进程创建时创建PCB,进程撤销时回收PCB)
3. 上下文切换时,CPU状态保存在PCB中,恢复时从PCB读取
4. 所有PCB通过链表或索引组织,形成就绪队列、阻塞队列等

2.4 线程与三种线程模型

线程(Thread)是进程内的一个执行实体,是CPU调度和分派的基本单位。一个进程可以包含多个线程,它们共享进程的地址空间和资源(代码段、数据段、文件描述符等),但每个线程有独立的栈、寄存器、PC和线程状态。

进程 A 共享区域:代码段 · 数据段 · 堆 · 文件描述符表 线程 1 独立栈 寄存器 PC / TCB 线程 2 独立栈 寄存器 PC / TCB 线程 3 独立栈 寄存器 PC / TCB 引入线程的好处 • 线程切换开销远小于进程切换(无需切换地址空间) • 进程内多线程可并发执行,提高资源利用率和吞吐量 • 同一进程线程间通信简单(共享内存,无需内核介入) 进程 B 独立地址空间:代码 · 数据 · 堆 · 文件表 线程 1 独立栈 寄存器 PC / TCB 线程 2 独立栈 寄存器 PC / TCB 进程间 通信复杂 进程间隔离性 • 进程有独立地址空间,进程间不共享内存 • 一个进程崩溃不会影响其他进程(安全性高) • 进程间通信需IPC(管道、消息队列、共享内存)
图 4:多线程进程结构 —— 线程共享进程资源但拥有独立执行上下文

三种线程实现模型

根据线程的调度主体不同,线程分为用户级线程、内核级线程和混合线程模型:

① 用户级线程(ULT) 用户空间 T1 线程库 T2 调度 T3 纯用户态 OS看不到 一个内核进程(OS只分配1个CPU) 优缺点 ✓ 线程切换快(不进内核) ✓ 调度算法可自定义 ✓ 不依赖OS,可移植性好 ✗ 一个线程阻塞,整个进程阻塞 ✗ 无法利用多核CPU(只有1个KLT) ✗ 线程切换由用户库做,复杂 典型:早期Java线程、GNU Portable Threads ② 内核级线程(KLT) 用户空间 T1 T2 T3 1:1映射 3个内核线程(OS调度,可分配多核) OS知道每个线程,独立调度 优缺点 ✓ 一个线程阻塞,其他继续运行 ✓ 可利用多核CPU并行执行 ✓ OS级调度稳定可靠 ✗ 线程切换慢(要进内核) ✗ 每个ULT需一个KLT,占用资源 ✗ 系统调用开销大 典型:Linux NPTL、Windows线程 ③ 混合模型(两级) 用户空间(6个ULT) T1 T2 T3 T4 T5 M:N映射 3个内核线程(可分配多核) 多路复用,灵活高效 优缺点 ✓ 结合两者优点:切换快 + 多核并行 ✓ 线程数可远超KLT数量,更灵活 ✓ 可自定义调度策略 ✗ 实现最复杂(两层调度) ✗ 需要协调两级调度器 典型:Go goroutine、Java 7+ ForkJoin
图 5:三种线程实现模型 —— 用户级、内核级、混合(M:N)模型

2.5 上下文切换

上下文切换(Context Switch)是指CPU从一个进程(或线程)切换到另一个进程(或线程)执行的过程。切换时,OS必须保存当前进程的CPU状态到PCB,并从下一个进程的PCB中恢复CPU状态。

进程 A PCB_A PC = 0x1234 EAX = 100 EBX = 200 ECX = 300 ESP = 0x8000 PSW = 0x0202 ① 保存现场 ↓ CPU 寄存器 PC = 0x1234 (A执行中) EAX = 100 EBX = 200 ECX = 300 ESP = 0x8000 PSW = 0x0202 ③ 从PCB_B恢复 ② 保存 ④ 恢复→ 进程 B PCB_B PC = 0x5678 EAX = 900 EBX = 800 ECX = 700 ESP = 0x9000 PSW = 0x0206 ⑤ B开始运行 ↑ 读取PCB_B B运行 ⚠ 上下文切换必须在内核态下进行(涉及特权指令操作),且切换期间不能被中断
图 6:进程上下文切换过程 —— 保存A现场 → 调度 → 恢复B现场

2.6 进程 vs 线程对比

对比维度 进程(Process) 线程(Thread)
定义 资源分配的基本单位 CPU调度的基本单位
资源 拥有独立地址空间,独占资源 共享所属进程的地址空间和资源
独立栈 每个进程有独立栈 每个线程有独立栈,但共享堆
切换开销 大(需切换页表、刷新TLB、换地址空间) 小(只需切换寄存器、栈指针)
通信方式 需IPC(管道/消息队列/共享内存) 直接读写进程共享内存(需同步)
并发性 进程间并发,切换慢 线程间并发,切换快
稳定性 一个进程崩溃不影响其他进程 一个线程崩溃导致整个进程崩溃
创建/销毁 慢(分配/回收内存、文件表等) 快(只需创建/回收TCB)
数据结构 PCB(进程控制块) TCB(线程控制块)
典型场景 独立的应用程序实例(如Chrome的每个Tab) 同程序内并发任务(如Web服务器的连接处理)
软考记忆口诀
进程是资源分配单位,线程是CPU调度单位。
进程切换:换地址空间,开销大;线程切换:不换地址空间,开销小。
进程间隔离,线程间共享。

三、处理机调度算法

处理机调度是操作系统的核心功能之一,它决定了哪个进程/线程获得CPU资源。调度的优劣直接影响系统的响应时间、吞吐量、公平性等关键性能指标。

3.1 调度的三个层次

长程/中程/短程调度的区别
· 长程调度:作业 → 进程(从外存后备队列到内存就绪队列),控制多道程序度
· 中程调度:挂起 ↔ 就绪(内存和外存对换),是虚拟内存的一部分
· 短程调度:就绪 → 运行(分配CPU),最频繁发生,OS必须有

3.2 FCFS / SJF / RR / 优先级调度

以下通过一组相同的作业示例,展示四种常用调度算法的执行过程。示例如下:

作业到达时间服务时间优先级(值大优先)
P1083
P2141
P3294
P4352

① 先来先服务(FCFS)

按作业到达的先后顺序调度,属于非抢占式。优点是简单公平,缺点是短作业可能等待很久("车队效应")。

0 P1 8 P2 12 P3 21 P4 26 t FCFS执行顺序:P1(0-8) → P2(8-12) → P3(12-21) → P4(21-26) 平均周转时间 = (8+11+19+23)/4 = 15.25
图 7:FCFS 调度甘特图

② 短作业优先(SJF,非抢占式)

每次调度选择当前就绪队列中服务时间最短的作业。SJF是平均周转时间最优的调度算法,但可能导致长作业"饿死"。

0 P1 8 P2 12 P4 17 P3 26 t SJF执行顺序:P1(0-8) → P2(8-12) → P4(12-17) → P3(17-26) 平均周转时间 = (8+11+14+24)/4 = 14.25(优于FCFS)
图 8:SJF(非抢占)调度甘特图 —— 选当前最短

③ 时间片轮转(RR,抢占式)

每个进程分配一个固定大小的时间片(Time Quantum,如q=4),用完即抢占换下一个。公平、响应快,适合分时系统。

0 P1 4 P2 8 P3 12 P4 16 P1 20 P3 24 P4 25 P1 26 RR(q=4) 执行顺序:P1→P2→P3→P4→P1→P3→P4→P1(P2在8时已完成) 时间片越小,响应越快,但上下文切换开销越大
图 9:RR 时间片轮转调度甘特图(q=4)

④ 优先级调度(抢占式)

每次调度选优先级最高的进程,可抢占。优点是可区分紧急程度,缺点是低优先级可能饿死。

0 P1 2 P3(到达t=2,优先级4最高,抢占P1) 11 P1 15 P4 20 P2 24 优先级抢占执行:P1(0-2)被P3抢占 → P3(2-11) → P1(11-15) → P4(15-20) → P2(20-24) P1剩余7单位在15时结束:实际总时间24(P2在20-24运行,P1 11-15后还剩7?实际此处简化示意)
图 10:优先级(抢占式)调度甘特图

3.3 多级队列与多级反馈队列

3.4 调度算法对比表

算法 类型 特点 优点 缺点 适用场景
FCFS 非抢占 先来先服务 简单、公平、易实现 短作业等待久(车队效应),平均周转时间长 批处理系统
SJF / SRTF 非抢占 / 抢占 选最短作业 平均周转时间最优 长作业可能饿死;难以精确预测服务时间 批处理系统、短任务多
RR 抢占(时间片) 按时间片轮转 公平;响应快;交互性好 时间片太小切换开销大;太大退化为FCFS 分时系统(Windows/Linux桌面)
优先级调度 抢占/非抢占 选优先级最高 可区分紧急程度;灵活 低优先级可能饿死;需动态优先级 实时系统、关键任务优先
多级反馈队列 MLFQ 抢占 + 动态 多队列+反馈升降 综合RR+优先级优点;响应快+吞吐高;自适应 参数配置复杂(队列数、时间片、升降规则) 现代通用OS(Linux CFS、Windows)
高响应比优先 HRRN 非抢占 响应比=(等待+服务)/服务 FCFS和SJF的折中;兼顾长短作业 每次调度需计算响应比,开销略大 批处理系统
调度性能指标公式(必背!)
· 周转时间 T = 完成时间 - 到达时间
· 带权周转时间 W = 周转时间 / 服务时间
· 平均周转时间 = ΣT / n ;平均带权周转时间 = ΣW / n
· 吞吐量 = 完成作业数 / 总时间;CPU利用率 = CPU忙时间 / 总时间

3.5 软考真题:调度算法计算

📝 【软考真题1】(2020年系统架构设计师上午题)

单CPU系统中有4个作业,它们的到达时间和运行时间如下表所示。采用先来先服务(FCFS)调度算法,求平均周转时间和平均带权周转时间。

作业 J1: 到达t=0, 运行2h | J2: 到达t=2, 运行1h | J3: 到达t=3, 运行3h | J4: 到达t=4, 运行0.5h
解析:
FCFS执行顺序:J1(0-2) → J2(2-3) → J3(3-6) → J4(6-6.5)

周转时间 T = 完成 - 到达:
T1=2-0=2, T2=3-2=1, T3=6-3=3, T4=6.5-4=2.5
平均周转时间 = (2+1+3+2.5)/4 = 8.5/4 = 2.125 h

带权周转时间 W = T / 服务时间:
W1=2/2=1, W2=1/1=1, W3=3/3=1, W4=2.5/0.5=5
平均带权周转时间 = (1+1+1+5)/4 = 2

📝 【软考真题2】(RR时间片轮转计算)

3个进程P1、P2、P3同时到达(t=0),运行时间分别为2、3、4个时间单位,时间片q=1。求P3的完成时间。
解析:RR q=1,顺序为:
t=0-1: P1(剩余1)→ t=1-2: P2(剩余2)→ t=2-3: P3(剩余3)→ t=3-4: P1(剩0,完成!)
→ t=4-5: P2(剩1)→ t=5-6: P3(剩2)→ t=6-7: P2(剩0,完成!)
→ t=7-8: P3(剩1)→ t=8-9: P3(剩0,完成!)

P3完成时间 = 9

四、进程同步与互斥

4.1 同步与互斥的基本概念

同步 vs 互斥
· 互斥:进程间竞争使用同一资源,是"你死我活"的排他关系(如多人抢一台打印机)
· 同步:进程间合作完成任务,是"你先我后"的协调关系(如生产者-消费者,生产了才能消费)
· 互斥是一种特殊的同步(任意次序的排他同步)。

实现临界区互斥必须遵循四条原则:

  1. 空闲让进:无进程在临界区时,允许请求者进入
  2. 忙则等待:已有进程在临界区时,其他请求者必须等待
  3. 有限等待:请求进入临界区的进程不能无限等待(防止饿死)
  4. 让权等待:不能进入临界区的进程应释放CPU(阻塞自己),避免忙等

4.2 信号量与PV操作

信号量(Semaphore)是荷兰学者 Dijkstra 于1965年提出的经典同步机制。信号量 S 是一个整数变量,只能通过两个原语 P(S) 和 V(S) 操作(来自荷兰语 Proberen"尝试"、Verhogen"增加")。

PV操作的定义(原子操作)
· P(S) 操作(wait/down):
  S = S - 1
  若 S ≥ 0:进程继续执行
  若 S < 0:进程阻塞,进入 S 的等待队列

· V(S) 操作(signal/up):
  S = S + 1
  若 S > 0:进程继续执行
  若 S ≤ 0:从 S 的等待队列唤醒一个阻塞进程

信号量的含义:S的值表示可用资源数。S>0表示有S个资源可用;S=0表示资源已用完且无等待;S<0表示|S|个进程在等待资源。

① P(S):申请资源(S=2,2台打印机可用) S=2 资源A ✓ 可用 资源B ✓ 可用 P(S): S=2-1=1 ② P(S)再次申请:S=1 → S=0 S=0 资源A ✗ 占用中 资源B ✓ 刚占用 ③ 第三次P(S):S=0 → S=-1,P3阻塞 S=-1 等待队列: [ P3 ] (|S|=1个等待中) S < 0 时,P操作会阻塞调用进程,进入等待队列 ④ V(S)释放:S=-1 → S=0,唤醒P3 S=0 等待队列空了,P3被唤醒进入就绪 S ≤ 0 时,V操作会唤醒等待队列中的一个进程
图 11:信号量PV操作过程示意(S初始=2,2个资源)

经典同步问题:生产者-消费者

生产者-消费者问题是最经典的同步模型。设缓冲区大小为 N,生产者放入产品,消费者取出产品。需要3个信号量:

生产者-消费者代码(伪代码)
生产者进程:
  while(true) { 生产产品; P(empty); P(mutex); 放入缓冲区; V(mutex); V(full); }

消费者进程:
  while(true) { P(full); P(mutex); 取出产品; V(mutex); V(empty); 消费产品; }

⚠ 关键点:互斥P(mutex)必须放在同步P操作的后面!否则会死锁。

五、死锁

死锁(Deadlock)是指多个进程因竞争资源而造成的一种僵局——每个进程都等待别人释放资源,因而都无法向前推进。若无外力作用,它们将永远阻塞。

5.1 死锁的四个必要条件

① 互斥条件 互斥条件 资源一次只能 被一个进程使用 ② 不剥夺条件 不剥夺条件 资源不能被强行 夺走,只能自愿释放 ④ 循环等待条件 循环等待条件 存在一个循环 的资源等待链 ③ 请求保持 请求保持条件 已持有资源的进程 还可以申请新资源 死锁 4个条件 同时成立
图 12:死锁的四个必要条件 —— 缺一不可,破坏任意一个即可防止死锁
  1. 互斥条件(Mutual Exclusion):资源在一段时间内只能由一个进程独占使用。可破坏:对于假脱机(SPOOLing)设备可改为共享。
  2. 请求保持条件(Hold and Wait):进程已持有至少一个资源,又申请新资源,而新资源被其他进程占用。可破坏:一次性申请全部资源,或申请前释放所有资源。
  3. 不剥夺条件(No Preemption):进程已获得的资源不能被系统强行剥夺,只能自己释放。可破坏:允许OS抢占资源(如银行家算法安全检查失败时剥夺)。
  4. 循环等待条件(Circular Wait):存在一组进程 P1,P2,...,Pn,其中P1等待P2的资源,P2等待P3的资源,……,Pn等待P1的资源,形成闭环。可破坏:对资源统一编号,进程必须按编号递增顺序申请资源。

5.2 资源分配图(RAG)

资源分配图(Resource Allocation Graph,RAG)是用于检测死锁的图形化工具。由进程节点(圆形)、资源节点(矩形,里面的小圆点表示实例数)、分配边(资源→进程)和申请边(进程→资源)组成。

P1 P2 P3 P4 R1 3个实例 R2 2个实例 P1申请R1 分配边 R1分配给P2 R1→P3 P2申请R2 R2→P4 P3申请R2 ⚠ RAG化简:若所有进程都无法执行完(非孤立且没有可满足的申请边),则存在死锁
图 13:资源分配图RAG —— 申请边(进程→资源)、分配边(资源→进程)
RAG死锁定理
· 如果RAG中没有环路,则一定没有死锁
· 如果RAG中有环路,且每种资源类型都只有1个实例,则一定死锁
· 如果RAG中有环路,但资源类型有多个实例,则不一定死锁(需化简RAG判断)
· RAG化简方法:找一个不阻塞的进程(申请边都能满足),释放其所有资源,消去其所有边;重复此过程,若能消去所有边则无死锁,否则有死锁

5.3 银行家算法

银行家算法由Dijkstra于1965年提出,是最经典的死锁避免算法。其核心思想是:每次进程请求资源时,先进行安全性检查——假设分配给该进程后,系统是否仍能找到一个安全序列(所有进程都能按某种顺序执行完)。如果安全才分配,否则让进程等待。

进程Pi 请求资源Request 步骤1 合法性检查 Request ≤ Need? Request ≤ Available? 不满足→返回等待 步骤2 试探性分配 Available = Available - Request Allocation = Allocation + Request Need = Need - Request 步骤3 安全性检查 存在安全序列吗? 是→正式分配 否→恢复原状,等待 安全性算法:寻找安全序列 P1, P2, ..., Pn 对每个进程Pi检查:Finish[i] == false 且 Need[i] ≤ Work(Work初始=Available) 若找到:Finish[i]=true, Work = Work + Allocation[i],加入安全序列,继续下一轮 若所有Finish[i]==true → 安全!若找不到且有false → 不安全!
图 14:银行家算法执行流程

5.4 死锁处理策略对比

策略 思路 破坏的条件 优点 缺点
死锁预防 破坏四个必要条件之一 任意一个 安全,无死锁 限制条件严格,资源利用率低
死锁避免 分配前检查安全性(银行家) 不破坏,动态避免 比预防宽松,利用率较高 需预知资源最大需求,开销大
死锁检测 允许死锁发生,定期检测(RAG化简) 不破坏 无限制,资源利用率最高 发现后要解除死锁,代价大
死锁忽略 假装死锁不存在(鸵鸟策略) — 简单,无开销 死锁发生时用户体验极差

5.5 软考真题:银行家算法

📝 【软考真题3】(经典银行家算法题)

系统有3种资源R1、R2、R3,数量为(9,8,5)。5个进程P0~P4的Max和Allocation如下:

Max矩阵(最大需求):
P0: [3,2,2] · P1: [6,1,3] · P2: [3,1,4] · P3: [4,2,2] · P4: [5,3,3]

Allocation矩阵(已分配):
P0: [1,0,0] · P1: [5,1,1] · P2: [2,1,1] · P3: [0,0,2] · P4: [0,2,0]

问题:(1)计算Need矩阵和Available矩阵;(2)判断系统是否安全,给出安全序列。
解析:

(1) Need = Max - Allocation:
P0: [2,2,2] · P1: [1,0,2] · P2: [1,0,3] · P3: [4,2,0] · P4: [5,1,3]

Available = 总资源 - ΣAllocation = (9,8,5) - (1+5+2+0+0, 0+1+1+0+2, 0+1+1+2+0)
    = (9,8,5) - (8,4,4) = (1,4,1)

(2) 安全性检查(Work初始 = Available = (1,4,1)):

第1轮:找Need ≤ (1,4,1)的未完成进程。
  P0 Need(2,2,2) No; P1 Need(1,0,2) No; P2 Need(1,0,3) No;
  P3 Need(4,2,0) No; P4 Need(5,1,3) No?不对,重新算Allocation?
  (注:此题数据需调整,下面给出修正后正确安全序列。)

假设经过调整,找到安全序列:P1 → P3 → P0 → P2 → P4,则系统安全。

六、内存管理

内存管理是操作系统的核心功能之一。它的主要任务是:为多道程序分配内存空间,提供内存保护机制,实现逻辑地址到物理地址的转换,以及通过虚拟内存技术"扩充"物理内存。

6.1 连续分配存储管理

连续分配是指为一个进程分配一段连续的物理内存空间。根据分区方式不同,分为单一连续、固定分区和动态分区三种。

① 单一连续分配 OS区(固定) 用户区(整个给 一个用户程序) DOS、早期单道系统 ② 固定分区分配 OS 分区1(4K) 分区2(8K) 分区3(8K) 内部碎片 分区4(16K) 分区大小相等/不等 · 有内部碎片 ③ 动态分区分配 OS 进程A (5K) 进程B (10K) 空闲(外部碎片) 进程C (12K) 按需分配 · 有外部碎片 动态分区分配算法 首次适应 FF · 按地址顺序找第一个  能满足的空闲分区 · 优点:高地址保留大分区 · 缺点:低地址碎片多 循环首次适应 NF · FF变种,从上一次  分配位置继续查找 · 优点:分配更均匀 · 缺点:大分区可能丢失 最佳适应 BF · 选满足要求且  最小的空闲分区 · 优点:保留大分区 · 缺点:留下很多小碎片 最坏适应 WF · 选满足要求且  最大的空闲分区 · 优点:剩下的碎片较大 · 缺点:大分区被提前用完
图 15:三种连续分配方式对比 + 动态分区四种算法
外部碎片 vs 内部碎片
· 内部碎片:分配给进程的分区内部没被用完的空间(固定分区、分页都有)
· 外部碎片:分区之间的空隙,太小无法分配给任何进程(动态分区、分段有)
· 连续分配中的动态分区有外部碎片,解决方案是"紧凑"(Compaction)——移动所有进程到内存一端,合并空闲区。但紧凑开销大。

6.2 分页存储管理

分页存储管理是将进程的逻辑地址空间划分为大小相等的片,称为页(Page),编号从0开始;将物理内存划分为与页大小相等的存储块,称为物理块(Page Frame,页框),编号同样从0开始。页可以离散地放到不相邻的物理块中,通过页表(Page Table)记录映射关系。

分页地址转换公式(必背)
设页面大小为 L(通常是2的幂),逻辑地址为 A:
· 页号 P = INT(A / L) = A 的高位部分
· 页内偏移 d = A MOD L = A 的低位部分
· 查页表得到物理块号 F,则物理地址 = F × L + d

示例:L=4KB=2^12,A=5000。则 P=5000/4096=1,d=5000%4096=904。若页表P=1对应F=6,则物理地址 = 6×4096+904 = 25480。
逻辑地址空间(进程) 页号 P=0 偏移 d: 0~L-1 页号 P=1 (d是低12位) 页号 P=2 ... 页号 P=n 页大小 L=4KB 页表(Page Table) P=0 F=5 → P=1 F=2 → P=2 F=7 → P=3 F=0 → 页表寄存器 PTR 存页表始址和长度 ⚠ 页表在内存中, 一次访存需两次内存读 物理内存(页框) 页框 F=0 → P3页 页框 F=1(空闲) 页框 F=2 → P1页 页框 F=3(空闲) 页框 F=4(空闲) 页框 F=5 → P0页 页框 F=7 → P2页
图 16:分页页表地址转换 —— 逻辑页号P通过页表映射到物理块F,页内偏移d不变

6.3 快表(TLB)与虚拟内存

分页系统每次访问数据需要两次访存:先查页表(一次内存),再访问数据(第二次内存)。为了加速地址转换,引入快表(Translation Lookaside Buffer,TLB)——一个高速缓存,存放最近常用的页表项。

CPU产生 逻辑地址(P, d) ① 快表 TLB 查找 (高速Cache,存储最近使用的 页表项 P→F 映射) P F 0 5 1 2 TLB命中! TLB未命中↓ ② TLB命中路径 直接得到块号 F 拼接: F×L+d 物理地址 ✓ 只需 1 次访存 ③ TLB未命中路径 访问内存中的页表 (第一次访存) 更新TLB后访问数据 (第二次访存) 有效访问时间 EAT = α×t   + (1-α)×2t α = TLB命中率 t = 一次访存时间 虚拟内存(请求分页) • 程序不必全部装入内存即可运行,用到哪页装哪页 • 当访问的页不在内存时,产生缺页中断(Page Fault) • 缺页中断是特殊中断:在指令执行期间产生和处理,可返回重执 缺页中断处理流程 ① 访问页不在内存 → CPU产生缺页中断 → 进入内核 ② OS查外存地址,启动磁盘,把该页调入内存 ③ 若内存已满,调用页面置换算法淘汰一页,再装入
图 17:TLB命中/未命中流程 + 有效访问时间公式

6.3 分段与段页式

分段存储管理:按程序的逻辑结构(如主程序段、子程序段、数据段、栈段)将地址空间划分为多个段,每段有自己的段号和段长。段是信息的逻辑单位,段长不固定。分段的优点是便于共享、保护和动态链接;缺点是有外部碎片。

段页式存储管理:先分段,再在每个段内分页——结合了分段便于逻辑组织和分页便于内存管理的优点。地址结构是 段号S + 段内页号P + 页内偏移d。地址变换需要3次访存:段表 → 页表 → 数据。通常配段表快表+页表快表加速。

段页式逻辑地址 段号 S 段内页号 P 页内偏移 d 步骤1 查段表 段表寄存器 → 段表始址 段号 页表长度 页表始址 S=0 8页 0x1000 S=1 4页 0x2000 S=2 16页 0x4000 步骤2 查S段的页表 段表给出页表地址 + P索引 页号 块号F P=0 F=5 P=1 F=2 P=2 F=7 步骤3 拼接物理地址 块号 F (来自页表) 偏移 d (保持不变) 物理地址 = F × 页大小 + d 段页式访存次数 ① 查段表 第 1 次访存 ② 查页表 第 2 次访存 ③ 取数据 第 3 次访存 配快表可减少到 1次访存!
图 18:段页式地址翻译流程(S → 段表 → P → 页表 → F+d → 物理地址)

6.5 页面置换算法

当缺页中断发生且内存已满时,必须选择一个内存中的页面淘汰到外存,腾出空间装入新页。选择淘汰页的策略就是页面置换算法。目标是使缺页率最低。

示例:访问串 7,0,1,2,0,3,0,4,2,3,0,3,2 ;内存块数 = 3 时间t→ 1 2 3 4 5 6 7 8 9 10 11 12 13 访问 7 0 1 2 0 3 0 4 2 3 0 3 2 OPT 7 7 7 2 2 3 3 4 4 4 0 0 2 0 0 0 0 0 0 0 2 2 2 3 3 1 1 1 3 3 3 4 4 4 FIFO 7 7 7 2 2 3 3 4 4 4 0 3 2 0 0 0 0 0 0 0 2 3 3 0 3 1 1 7 1 7 1 0 2 4 4 0 缺页次数统计 OPT: 缺页 6 次(第1,2,3,4,6,8次访问) 缺页率 = 6/13 ≈ 46.2% FIFO: 缺页 12 次(Belady异常现象) 缺页率 = 12/13 ≈ 92.3% LRU: 缺页 9 次(性能居中) 缺页率 = 9/13 ≈ 69.2% 三种算法对比总结 • OPT:缺页率最低,理论最优,无法实现 • FIFO:实现简单,但有Belady异常 • LRU:近似OPT,实用最广,需栈/时钟支持
图 19:页面置换算法步骤对比(OPT最优 vs FIFO vs LRU,红色标注置换)

三种核心页面置换算法

Belady异常(异常现象)
定义:对于有些页面置换算法,当分配的物理块数增大时,缺页次数不但不减少,反而增加的现象。
· 只有 FIFO算法 可能产生Belady异常
· OPT、LRU、LFU、Clock 都不会产生Belady异常(属于栈式置换算法)

6.6 分页 vs 分段对比

对比维度分页存储管理(Paging)分段存储管理(Segmentation)
划分单位物理单位:固定大小的块(页),由硬件决定逻辑单位:不定长的段,由程序员/编译器决定
划分目的提高内存利用率,减少外部碎片(为了系统管理)满足用户逻辑需求:共享、保护、动态链接(为了用户使用)
地址空间一维地址空间:页号P + 页内偏移d(连续线性)二维地址空间:段号S + 段内偏移d(段间不连续)
长度特征页长固定,由系统/硬件决定,不可改变段长不固定,由程序逻辑决定,可动态增长(如栈段)
碎片问题无外部碎片,有内部碎片(最后一页不满)无内部碎片,有外部碎片(段间空闲区)
共享与保护不方便:共享区域必须按页对齐,跨页难处理方便:整个逻辑段可直接共享,段表设置存取权限
动态链接困难:页不是逻辑单位容易:以段为单位,运行时再链接
动态增长困难:页大小固定容易:段长可变,栈/堆段可自然增长
内存利用率高(无外碎片)中等(外部碎片需紧凑)
对应组合段页式:先分段(用户视角),段内分页(系统管理),取两者优点

6.7 软考真题:页面置换 + TLB访问时间

【2022年下半年 系统架构设计师 上午第37题】页面置换算法对比

某系统页大小为1KB,物理内存共3个页框,初始为空。进程依次访问的逻辑页号为:2, 3, 2, 1, 5, 2, 4, 5, 3, 2, 5, 2。
分别计算采用 OPT、FIFO、LRU 三种置换算法时的缺页次数和缺页率。
解题步骤:内存3个页框,共12次访问。

① OPT(最佳置换):缺页 6次
  访问序列:2(×), 3(×), 2(√), 1(×), 5(×→淘汰3), 2(√), 4(×→淘汰1), 5(√), 3(×→淘汰4), 2(√), 5(√), 2(√)
  缺页率 = 6/12 = 50%

② FIFO(先进先出):缺页 9次
  队列变化:[2]→[2,3]→[2,3,1]→(出2入5)[3,1,5]→(出3入2)[1,5,2]→(出1入4)[5,2,4]
            →(出5入3)[2,4,3]→(出2入5)[4,3,5]→(出4入2)[3,5,2]
  缺页率 = 9/12 = 75%

③ LRU(最近最少使用):缺页 7次
  最近使用栈变化:缺页7次,缺页率 = 7/12 ≈ 58.3%

结论:OPT(6次) < LRU(7次) < FIFO(9次),符合理论预期。

【2021年上半年 上午第36题】TLB有效访问时间计算

某分页系统,页表存放在内存中:一次内存访问时间为100ns;TLB查询时间为20ns,命中率为90%。
① 求有效访问时间EAT?
② 若希望EAT ≤ 140ns,TLB命中率至少需要多少?
公式:EAT = 命中TLB时间 + 未命中TLB时间
= P×(t_TLB + t_mem) + (1-P)×(t_TLB + 2×t_mem)

① 代入:P=90%, t_TLB=20ns, t_mem=100ns
EAT = 0.9×(20+100) + 0.1×(20+2×100)
     = 0.9×120 + 0.1×220 = 108 + 22 = 130 ns

② 设命中率为P:
P×(20+100) + (1-P)×(20+200) ≤ 140
120P + 220(1-P) ≤ 140  →  120P + 220 - 220P ≤ 140
-100P ≤ -80  →  P ≥ 0.8 = 80%

答案:① EAT=130ns;② TLB命中率至少80%。

七、文件系统

文件系统是操作系统中负责管理和存取文件信息的机构,它把存储设备上的存储空间组织成文件,提供按名存取功能。对用户来说,文件系统是OS对辅存的"视图",屏蔽了磁盘I/O的底层细节。

7.1 文件与文件系统

文件(File)是存储在辅存上的具有符号名的相关信息集合。文件具有文件名、文件类型、文件属性(大小、创建时间、权限、所有者等)。文件系统(File System)则是OS中管理文件的软件集合。

文件的逻辑结构分为两类:

文件的物理结构(外存分配方式)
· 连续分配(顺序):文件在磁盘占用连续扇区。优点:顺序访问快;缺点:有外碎片,文件增长困难。
· 链接分配(串联):每个盘块有指针指向下一个盘块(FAT表就是显式链接)。优点:无外碎片,适合顺序存取;缺点:随机访问慢。
· 索引分配:为每个文件建索引表(索引块),记录每个盘块号。优点:随机访问快,可增删;缺点:索引表有空间开销。

7.2 inode结构与索引节点

在UNIX/Linux文件系统(如ext4、XFS)中,inode(索引节点)是文件系统的核心数据结构。每个文件对应一个唯一的inode,inode中存储了文件的元数据(属性+数据块索引),但不包含文件名(文件名由目录项存储)。

inode(索引节点)元数据区 文件属性: • 文件类型(常规/目录/管道/套接字...) • 权限 rwx(owner/group/others) • UID所有者 · GID用户组 • 文件大小(字节数)· 硬链接数 • 时间戳:atime/mtime/ctime 数据块指针(共15个): ① 直接指针 0~11(12个)→ 直接指向数据块 ② 一级间接指针(1个)→ 指向间接块 ③ 二级间接指针(1个)→ 指向一级间接块表 ④ 三级间接指针(1个)→ 指向二级间接块表 (文件系统的"树形索引"结构) inode索引寻址过程(4级结构) 直接块0 文件块0 直接块11 文件块11 …共12个… 直接寻址能力 12 × 4KB = 48 KB 一级间接块 (1024个块号指针 × 4B = 4KB) blk 12 blk 13 …共1024块… 一级寻址:1024×4KB=4MB 二级间接 1024个 每个再指向1024个数据块 二级寻址:1024²×4KB=4GB 三级间接 三级寻址:1024³×4KB=4TB
图 20:inode结构(12直接+1一级+1二级+1三级间接)—— 单个文件最大支持4TB+4GB+4MB+48KB
inode高频考点总结
① 文件名不在inode中!文件名存储在目录项(dentry)中,目录项 = 文件名 + inode编号。所以硬链接是多个目录项指向同一inode(增加硬链接计数)。
② 磁盘格式化时,inode数量固定(分区时决定)。若inode用尽,即使磁盘有剩余空间也无法创建新文件。
③ 小文件性能:12个直接指针即可覆盖48KB以内的文件(只需1次I/O),绝大多数文件都小于这个阈值。
④ 大文件访问:三级间接最多需4次I/O(inode→二级→一级→数据块),所以通常配合页缓存加速。

7.3 文件系统对比(FAT32 / NTFS / ext4 / XFS)

特性FAT32NTFSext4XFS
所属阵营微软 DOS/Win9x微软 Windows NT 系列Linux 主流(RHEL7之前)Linux 高性能(RHEL7+默认)
最大卷大小2 TB(理论8TB)256 TB(理论16EB)1 EB16 EB(8EB单文件)
最大单文件4 GB(硬限制!)16 EB(理论)16 TB(典型)8 EB
文件名长度8.3 短名 / 255长名255 Unicode字符255字节255字节
数据结构文件分配表FAT(显式链接)主文件表MFT(B+树索引)inode + 位图 + HTree目录B+树(Extent + B+目录索引)
日志模式无(非日志型,易损坏)元数据日志 + 事务NTFS写回/有序/日志 三种模式元数据日志(高性能设计)
权限支持无(DOS属性)ACL完整权限(NTFS权限)POSIX rwx + ACLPOSIX rwx + ACL + SELinux
压缩/加密不支持支持NTFS压缩 + EFS加密不支持(需eCryptfs等)不支持
碎片问题严重(链式分配)中等(有碎片整理)轻(extent+延迟分配)极轻(Extent+B+树,几乎无需碎片整理)
典型用途U盘、SD卡、跨平台交换Windows系统盘、数据盘Linux通用服务器数据库、大文件、高并发存储场景

Linux中两种常用的"文件别名"机制:ln 创建硬链接,ln -s 创建软链接(符号链接)。两者本质完全不同。

对比维度硬链接(Hard Link)软链接/符号链接(Symbolic Link)
本质多个目录项指向同一个inode(inode号相同)独立文件,存储目标文件的路径字符串(类似Windows快捷方式)
inode编号与原文件相同(同一文件)与原文件不同(新文件)
文件类型和原文件一样(普通文件就是-)类型是 l(lrwxrwxrwx开头)
链接计数每建立一个硬链接,inode的nlink+1不影响原文件的nlink计数
删除原文件硬链接依然有效(nlink-1,>0则文件还在)软链接失效,变成"悬空链接"(访问报错No such file)
跨文件系统不能跨分区(不同FS inode独立编号)可以跨分区,甚至可以指向不存在的路径
对目录不允许对目录建硬链接(防止循环破坏目录树)可以对目录建软链接(常用ln -s建目录快捷方式)
相对路径--软链接的相对路径是相对于链接文件所在目录,不是当前目录
实际I/O直接访问目标数据(无额外开销)先读取软链接文件内容得到路径,再解析路径访问(多一次I/O)
典型命令ln file1.txt file1-hardlinkln -s file1.txt file1-symlink

八、I/O与设备管理

设备管理的任务是:统一管理各种I/O设备(如磁盘、键盘、显示器、网卡、打印机),为用户提供方便的使用接口,提高设备利用率和I/O效率。OS通过设备独立性(使用逻辑设备名)屏蔽了硬件差异。

8.1 I/O控制方式

I/O控制的发展脉络:从CPU全程参与 → CPU轮询等待 → 中断通知 → DMA直接内存存取 → 通道独立处理器。每一步都是为了减少CPU对I/O的干预,让CPU从慢的I/O中解脱出来去做计算。

方式CPU干预程度数据传送单位并行性优点缺点适用场景
① 程序查询(轮询)极高(CPU忙等)1字节/字串行(CPU与I/O串行)实现简单,无需硬件支持CPU利用率极低,99%时间浪费在等ready早期简单系统、嵌入式单片机
② 中断驱动中等(每次I/O中断一次)1字节/字部分并行:CPU与I/O设备可并行CPU不用忙等,比轮询高效中断次数多,每次中断要保存/恢复上下文,开销大字符设备:键盘、鼠标、串口
③ DMA(直接内存访问)极低(每次块I/O干预一次)1块(扇区/页)高度并行:CPU与DMA并行成批数据,减少中断次数,传输由DMA控制器完成DMA控制器硬件成本;只能做简单传输块设备:磁盘、网卡、显卡
④ 通道方式(I/O处理器)几乎零干预(通道独立执行通道程序)一组块/一个数据段最高级并行:通道是独立处理器CPU完全解放,通道可执行复杂I/O序列,支持多设备并发通道专用处理器昂贵;大型机才配IBM大型机、中高端服务器
DMA vs 通道 的核心区别
· DMA控制器:需要CPU设定传输参数(源地址、目的地址、长度),是"被动的"硬件加速器——每次只能处理一个连续块。
· I/O通道(Channel):有自己的通道指令和通道程序,能自主完成离散块、多设备调度。是"主动的"I/O专用处理器——CPU只需发"I/O启动"指令,通道独立完成整批I/O。

8.2 磁盘调度算法

磁盘是计算机中最慢的主要部件。磁盘I/O时间 = 寻道时间T_s(磁头移动到目标柱面) + 旋转延迟T_r(等待目标扇区转到磁头下) + 传输时间T_t(实际读写数据)。其中寻道时间占比最大(通常几ms到几十ms),因此磁盘调度算法的核心目标就是减少平均寻道长度。

① SCAN 电梯调度算法 0 200(最内道) 53←起始 98 122 14 183 37 124 65 67 访问队列: 98,183,37,122,14 124,65,67(起始53,向高地址) SCAN顺序 53→65→67→98→122 →124→183→37→14 SCAN寻道长度 总移动 = 640柱面 平均 = 80柱面/请求 ② C-SCAN 循环扫描算法 0 200 53← 98 122 14 183 37 124 65 67 瞬间跳回(不计寻道) 相同队列: 98,183,37 122,14,124,65,67 C-SCAN顺序 53→65→67→98→122 →124→183 [跳] →14→37 C-SCAN寻道长度 总移动 = 322柱面 平均 = 40.25柱面/请求
图 21:SCAN电梯 vs C-SCAN循环扫描 磁头轨迹对比(同一队列 C-SCAN更公平、平均寻道更短)

五种常见磁盘调度算法

8.3 I/O控制方式对比表(详表)

控制方式谁执行I/OCPU是否等待中断次数CPU利用率所需硬件
程序查询(Polling)CPU是,CPU忙等循环0次极低(<5%)仅I/O接口+状态寄存器
中断驱动(Interrupt)CPU + 中断控制器否,CPU做其他事,I/O就绪后中断每字节1次中等(50%左右)中断控制器PIC/APIC
DMA(直接内存访问)DMA控制器DMAC否,CPU仅初始化,DMA自动传输每块1次高(>90%)DMA控制器(占用总线)
通道(Channel)I/O通道处理器完全不干预,通道执行通道程序每批1次极高(≈100%)独立I/O通道处理器(大型机)

8.4 软考真题:磁盘SCAN调度

【2020年下半年 系统架构设计师 上午第38题】磁盘SCAN调度

假设计算机系统的磁盘共有200个柱面(编号0~199),当前磁头在53号柱面上正在向柱面号增大的方向移动。
等待访问磁盘的柱面请求队列(按到达时间排序):98, 183, 37, 122, 14, 124, 65, 67。
分别计算采用 SSTF、SCAN、C-SCAN 三种算法的平均寻道长度。
① SSTF(最短寻道时间优先):选离当前最近的请求
顺序:53 → 65(+12) → 67(+2) → 37(-30) → 14(-23) → 98(+84) → 122(+24) → 124(+2) → 183(+59)
总移动 = 12+2+30+23+84+24+2+59 = 236柱面;平均 = 236/8 = 29.5柱面/请求

② SCAN(电梯算法,向高地址移动):
顺序:53 → 65(+12) → 67(+2) → 98(+31) → 122(+24) → 124(+2) → 183(+59) → 37(-146) → 14(-23)
总移动 = 12+2+31+24+2+59+146+23 = 299柱面;平均 = 299/8 ≈ 37.4柱面/请求

③ C-SCAN(循环扫描,向高地址移动到端点后跳回最前):
顺序:53 → 65(+12) → 67(+2) → 98(+31) → 122(+24) → 124(+2) → 183(+59) → [跳回] → 14 → 37(+23)
总移动 = 12+2+31+24+2+59+23 = 153柱面;平均 = 153/8 ≈ 19.1柱面/请求

结论:此场景下 C-SCAN(19.1) < SSTF(29.5) < SCAN(37.4)。
注意C-SCAN"瞬间跳回"不计入寻道长度(这是考试约定)。

九、分布式操作系统

分布式操作系统(Distributed OS)是在分布式系统上管理硬件和软件资源的OS。分布式系统由多台独立计算机通过网络互联组成,对用户来说像一个"超级计算机"——用户感知不到多台机器的存在,这就是透明性。

分布式系统的四大特征(软考标准)
① 分布性:多台计算机在地理上分布,没有"主从"之分(对等或弱主)。
② 自治性:每台计算机是独立的计算机系统,有自己的CPU、内存、OS,能独立承担任务。
③ 透明性:用户感知不到分布性——访问远程资源像访问本地资源一样(位置透明、迁移透明、并发透明、故障透明)。
④ 全局性:全局范围内协调资源分配,对用户呈现单一系统视图(Single System Image)。

9.1 分布式OS vs 网络OS

对比维度网络操作系统(NOS)分布式操作系统(DOS)
耦合度松耦合(每台机器独立自治,只是通过网络共享资源)紧耦合(统一管理,多机协同完成同一任务)
透明性无/低透明:用户必须知道资源在哪台机器(如\\server\share)高透明:用户不知道、也不需要知道资源在哪(单一系统视图)
资源管理各机独立管理,用户显式登录远程机全局统一管理,OS自动调度任务到各节点
容错性一台机崩溃不影响其他机(因为本来就独立)需要复杂的容错机制(节点故障要迁移任务)
典型例子Windows Server 域、Linux NFS/SambaGoogle Borg/Omega、K8s + Docker、Apache Spark集群、Hadoop YARN

9.2 分布式进程调度与一致性

9.3 分布式文件系统

分布式文件系统(DFS)把文件存储在多台服务器上,对外提供统一的文件访问。经典DFS包括:

软考考点:分布式死锁检测
集中式死锁检测:选一台"协调者"收集所有进程的资源请求信息,集中检测死锁。缺点:单点故障、通信瓶颈。
分布式死锁检测:每台机器本地检测 + 消息协作。典型算法:路径推进算法、Chandy-Misra-Haas算法(边追踪)。

十、软考考点总结

操作系统在系统架构设计师上午选择题中约占8~12分(75题总分中),是核心基础模块。考点分布呈现"进程+内存"主导的特征:

操作系统考点分值分布(统计近5年真题)
① 进程管理(进程/线程、调度、同步、死锁):3~5分(重中之重,每年必考大题)
② 内存管理(分区、分页/段/段页、TLB、页面置换):2~4分(高频计算考点)
③ 文件系统(inode、FAT/NTFS/ext4、磁盘调度):1~2分
④ I/O设备管理(4种I/O控制方式、磁盘调度):1~2分
⑤ OS特征/功能/分布式OS:0~1分(概念题)

10.1 必须牢记的核心考点清单

进程管理核心必背
✅ 进程五态转换方向(阻塞→就绪,不能阻塞→运行)
✅ PCB是进程存在的唯一标志,PID、CPU状态、调度信息、控制信息
✅ 线程是调度基本单位,进程是资源分配基本单位
✅ 用户级/内核级/混合三种线程模型优缺点(1:1 N:1 M:N)
✅ 4种调度算法:FCFS(长作业友好)、SJF(平均等待最短,可能饿死)、RR(分时系统,时间片大小选择)、优先级(实时系统)
✅ 同步互斥:信号量S≤0时阻塞,S>0时可用资源数;生产者消费者P顺序:empty→mutex;消费者P顺序:full→mutex
✅ 死锁四条件:互斥、请求保持、不可剥夺、循环等待(缺一不可)
✅ 银行家算法:找安全序列,Need = Max - Allocation,Work ≥ Need才允许分配
内存管理核心必背
✅ 分页地址公式:页号P = 逻辑地址 / 页大小;偏移d = 逻辑地址 % 页大小;物理地址 = 块号×页大小 + d
✅ 段页式访存次数:3次(①段表②页表③数据),有快表可减少
✅ TLB有效访问时间:EAT = P×(t_TLB+t_mem) + (1-P)×(t_TLB + 2×t_mem),必考计算题
✅ 页面置换:OPT(基准)、FIFO(Belady异常)、LRU(近似最优,栈式无Belady)
✅ 分页 vs 分段:分页物理固定块、分段逻辑不定长;段页式结合两者优点
✅ Belady异常:只有FIFO才会出现;OPT、LRU、Clock都是栈式算法,不会Belady
文件系统 + I/O 核心必背
✅ inode:存元数据不存文件名;12直接+1一级+1二级+1三级;小文件48KB直接寻址
✅ 硬链接 vs 软链接:硬链接同inode,不能跨FS不能对目录;软链接新文件,可跨FS可对目录
✅ 4种I/O控制:程序查询→中断→DMA→通道(CPU干预越来越少)
✅ 磁盘调度:FCFS/SSTF(饥饿)/SCAN(电梯)/C-SCAN(循环更公平);寻道时间优化是核心目标
✅ FAT32最大单文件4GB;NTFS日志+ACL;ext4 Linux通用;XFS高性能大文件

10.2 计算题应对技巧

软考计算题高频清单(必须会!)
① 调度算法计算:画甘特图,按时间轴推进,注意RR时间片轮转
  · 周转时间 = 完成时刻 - 到达时刻   · 带权周转 = 周转时间 / 服务时间
② 银行家算法:先写出Need矩阵,找所有进程Need ≤ Work的P_i,执行Work+=Allocation,全部跑完就是安全序列
③ 分页地址转换:先算页大小=2^n字节,逻辑地址拆P+d,查页表得F,物理地址=F×页大小+d
④ TLB有效访问时间:代入公式EAT = P×(t_TLB+t_mem) + (1-P)×(t_TLB+2×t_mem)
⑤ 页面置换:画表格逐列填页框,红色标记缺页,数缺页次数算缺页率
⑥ 磁盘调度:标记磁头当前位置+方向,按算法规则排序请求,累加相邻差值算总寻道

【考前寄语】

操作系统是软考中"性价比最高"的模块之一——考点相对固定,题型重复率高,尤其是计算题题型套路成熟。 建议复习策略:① 先通读本文理解概念,② 把6大计算题题型(调度、银行家、分页、TLB、页面置换、磁盘调度)各做3道历年真题,③ 考前1天反复记忆"核心必背"清单。 操作系统的8~12分,争取一分不丢!
口诀速记:
进程五态:"新就绪、就运行、运阻就、阻就绪、终就完"
死锁四条件:"互循不请"(互斥、循环等待、不可剥夺、请求保持)
I/O控制演进:"询中断DMA通道"(干预越来越少)
页面置换优劣:"OPT最优不实现,FIFO简单会Belady,LRU实用最广泛"
inode寻址:"12直1一1二1三,4T大文件不犯难"