返回知识库

软考

操作系统 PV/死锁/页面置换/调度深化

进程调度五算法/PV操作三大经典模型(生产者-消费者·读者-写者·哲学家就餐)+银行家算法+页面置换(FIFO·OPT·LRU·CLOCK)+磁盘调度,含完整伪代码与真题套路

软考操作系统PV操作真题进程调度页面置换银行家

一句话定位

操作系统综合知识 4~6 题,PV 操作大题几乎每年案例与分析交叉出现;本篇把三大经典同步模型 + 银行家 + 页面置换落成画图 + 伪代码 + 设信号量的默写程度。

NOTE

本篇是 01-cs-fundamentals.mdx 的”OS 模块深化版”。覆盖计划 §3.2,事实据教材第 2 版 + 2020-2025 真题核对(2026-07-29)。

A. 进程与线程

进程 vs 线程对比

维度进程 Process线程 Thread
资源分配单位是(独立地址空间)否(共享进程资源)
调度单位传统 OS 是现代 OS 是
系统开销大(上下文切换)
通信方式IPC(管道/消息/共享内存/Socket)同步互斥(共享内存)
并发性较低

进程三态/五态转换

图 1:进程五态转换(来源:教材第 2 版 §3.2)
  • 就绪 → 运行:调度(dispatch)
  • 运行 → 就绪:时间片到 / 优先级抢占
  • 运行 → 阻塞:I/O 请求 / 等待事件
  • 阻塞 → 就绪:事件完成

用户级 vs 内核级线程

类型说明优点缺点
用户级由应用程序管理(如早期 Java 绿线程)切换快、不陷内核单进程多核利用差;阻塞影响全部
内核级由 OS 内核管理多核并行;阻塞不影响其他切换开销大
混合Solaris/LWP 轻量级进程兼顾两者实现复杂

B. 进程调度算法(必考 1 题)

五种调度算法对比

算法全称原理优点缺点适用
FCFSFirst Come First Served先来先服务公平、简单护航效应、平均等待长批处理
SJFShortest Job First短作业优先平均等待最短饥饿长作业作业调度
SRTFShortest Remaining Time FirstSJF 抢占版响应更好切换开销交互系统
RRRound Robin时间片轮转响应快、公平时间片过大退化 FCFS分时系统
优先级Priority静态/动态优先级紧急任务优先低优先级饥饿(动态可解)实时系统
MLFQMulti-Level Feedback Queue多级反馈队列兼顾长短作业调优复杂通用 OS
HRRNHighest Response Ratio Next高响应比 = (W+S)/S无饥饿需预估服务时间批处理

关键公式

  • 周转时间 = 完成时间 − 到达时间
  • 等待时间 = 周转时间 − 服务时间
  • 平均周转/等待 = Σ / n
  • 响应比 R = (等待时间 + 服务时间) / 服务时间

IMPORTANT

调度解题套路 callout(四步法)

  1. 列出所有进程的到达时间、服务时间
  2. 按算法规则画甘特图(时间轴 + 进程占用)
  3. 算每进程的完成时间 → 周转时间 → 等待时间
  4. 求平均

真题举一反三

2020-11 综合题:4 进程 P1~P4,到达时间 0/1/2/3,服务时间 6/4/3/2,FCFS 求平均等待时间。

  • 解:甘特图:P1(0-6) P2(6-10) P3(10-13) P4(13-15)
  • 等待:P1=0, P2=5, P3=8, P4=10;平均 = (0+5+8+10)/4 = 5.75

2023-05 综合题:同上数据,SJF 求平均等待时间。

  • 解:t=0 仅 P1 到达,执行 P1(0-6);t=6 时 P2/P3/P4 都到达,按服务时间排序:P4(6-8) P3(8-11) P2(11-15)
  • 等待:P1=0, P2=10, P3=6, P4=3;平均 = (0+10+6+3)/4 = 4.75

2024-11 综合题:3 进程 P1~P3,到达 0/1/2,服务 8/4/2,时间片 q=2 的 RR,求 P2 完成时间。

  • 解:
    0-2: P1
    2-4: P2 (剩 2)
    4-6: P3 (完成)
    6-8: P1 (剩 6)
    8-10: P2 (完成) ← P2 完成时间 = 10
    10-14: P1
    
  • P2 完成时间 = 10

C. PV 操作与信号量(核心,必考大题)

信号量基础

  • 信号量 S:整型变量,初值 ≥ 0
  • P 操作 wait(S):S = S − 1;若 S < 0 则阻塞当前进程
  • V 操作 signal(S):S = S + 1;若 S ≤ 0 则唤醒一个等待进程
  • 物理含义:S > 0 时表示可用资源数;S < 0 时 |S| 为等待进程数

互斥 vs 同步判定

类型信号量初值用途P/V 配对
互斥 mutex1保护临界资源同一进程 P/V 配对
同步 sync0 或资源数协调执行顺序不同进程 V/P 配对(前驱 V,后继 P)

IMPORTANT

PV 大题四步法 callout(核心套路)

  1. 识别临界资源 → 设互斥信号量 mutex = 1
  2. 识别前驱关系 → 设同步信号量(前驱做完 V,后继先 P;初值 = 0 或资源数)
  3. 写伪代码:在临界区前 P(mutex),后 V(mutex);同步信号量按前驱关系穿插
  4. 检查死锁:P 操作顺序——同步在前、互斥在后,避免死锁

三大经典模型

模型 1:生产者-消费者

场景:n 个缓冲区,生产者放入产品,消费者取出产品。

信号量定义

  • mutex = 1:互斥访问缓冲区
  • empty = n:空闲缓冲区数(同步)
  • full = 0:已占用缓冲区数(同步)

伪代码

producer() {
    while (true) {
        生产产品;
        P(empty);       // 申请空闲位(同步)
        P(mutex);       // 进入临界区
        放入产品;
        V(mutex);       // 离开临界区
        V(full);        // 通知消费者有产品
    }
}

consumer() {
    while (true) {
        P(full);        // 等待产品(同步)
        P(mutex);       // 进入临界区
        取出产品;
        V(mutex);       // 离开临界区
        V(empty);       // 通知生产者有空位
        消费产品;
    }
}

WARNING

死锁陷阱:若把 P(mutex) 放在 P(empty) 前面——生产者拿到 mutex 后等 empty(已满),消费者需要 mutex 才能取(mutex 被锁),死锁。口诀:同步在前、互斥在后

模型 2:读者-写者(读优先)

场景:允许多读者同时读,写者独占。

信号量定义

  • wmutex = 1:读写互斥(写者用)
  • rmutex = 1:保护 readcount
  • readcount = 0:当前读者数(普通变量)

伪代码

reader() {
    P(rmutex);
    readcount++;
    if (readcount == 1) P(wmutex);   // 第一个读者锁写
    V(rmutex);
    读操作;
    P(rmutex);
    readcount--;
    if (readcount == 0) V(wmutex);   // 最后一个读者释放写
    V(rmutex);
}

writer() {
    P(wmutex);
    写操作;
    V(wmutex);
}

写优先变体:增加 wmutex2=1 / readtry=1,让写者到达时阻塞后续读者。

模型 3:哲学家就餐

场景:5 哲学家围圆桌,每两人间一叉,需左右两叉才能吃。

朴素方案(会死锁)

philosopher(i) {
    思考;
    P(fork[i]);       // 拿左
    P(fork[(i+1)%5]); // 拿右
    吃;
    V(fork[i]);
    V(fork[(i+1)%5]);
}

防死锁方案

  1. 限 4 人就餐(信号量 seat=4)
  2. 奇偶法:奇数号先左后右,偶数号先右后左
  3. 同时拿两叉(用 mutex 保护)

真题举一反三

2021-11 案例题:面包店,1 个售货员(一次服务 1 人),N 个顾客。设信号量。

  • 解:mutex = 1(互斥售货员);顾客 P(mutex) → 服务 → V(mutex)

2024-05 案例题:理发店睡觉的理发师问题。M 理发师,N 椅子,K 顾客。

  • 信号量:customers = 0(等待顾客数);barbers = M(空闲理发师);mutex = 1

2025-11 案例题:3 司机-3 售票员公交车同步。

  • 信号量:door = 0(关门信号);brake = 0(刹车信号);

D. 死锁

死锁四必要条件

  1. 互斥:资源独占
  2. 占有并等待:占有资源等下一个
  3. 不剥夺:不能强行夺走
  4. 循环等待:进程等待链成环

破坏任一条件即可预防死锁

  • 破坏占有并等待 → 一次性申请所有资源
  • 破坏不剥夺 → 资源可抢占
  • 破坏循环等待 → 资源有序分配

死锁处理四策略

策略原理典型
预防 Prevention破坏四条件资源有序分配
避免 Avoidance系统动态判断银行家算法
检测与解除允许发生,事后处理等待图 + 回滚
忽略鸵鸟策略大多数通用 OS

银行家算法(必考)

数据结构

  • Available:当前各类资源可用数
  • Max:每个进程最大需求
  • Allocation:每个进程已分配
  • Need = Max − Allocation:还需要的资源

IMPORTANT

银行家安全性算法 callout(五步法)

  1. 设 Work = Available,Finish[i] = false(所有 i)
  2. 找 i 使 Finish[i]=false 且 Need[i] ≤ Work
  3. 若找到:Work = Work + Allocation[i],Finish[i] = true,回到第 2 步
  4. 若找不到:跳到第 5 步
  5. 若所有 Finish[i]=true → 安全;否则 不安全

银行家例题

2020-11 案例题:3 进程 P1~P3,资源 A B C,初始状态:

进程MaxAllocationNeed
P13 2 21 0 02 2 2
P26 1 35 1 11 0 2
P33 1 42 1 11 0 3

Available = (10−8, 2−2, 4−2) = (2, 0, 2)

安全性检查

  • Work=(2,0,2),Need(P1)=(2,2,2) > Work ✗;Need(P2)=(1,0,2) ≤ Work ✓ → P2 执行;Work=(7,1,3)
  • Need(P1)=(2,2,2) ≤ (7,1,3)? ✗(B 不足)
  • Need(P3)=(1,0,3) ≤ (7,1,3)? ✓ → P3 执行;Work=(9,2,4)
  • Need(P1)=(2,2,2) ≤ (9,2,4)? ✓ → P1 执行;Work=(10,2,4)

安全序列:P2 → P3 → P1;状态 安全

E. 内存管理与页面置换(必考 1~2 题)

分页 / 分段 / 段页式对比

方式地址结构优点缺点
分页页号 + 页内偏移无外部碎片、内存利用率高有内部碎片、不便共享
分段段号 + 段内偏移逻辑清晰、便于共享保护有外部碎片
段页式段号 + 页号 + 页内偏移综合优点地址变换 3 次访存

页面置换算法对比

算法思想优点缺点Belady 异常
OPT淘汰未来最久不用命中率最高不可实现(需预知未来)
FIFO淘汰最早进入内存简单命中率低
LRU淘汰最近最久未用接近 OPT实现开销(计数器/栈)
CLOCK二次机会 + 访问位近似 LRU、开销小命中率略低于 LRU
改进 CLOCK访问位 + 修改位进一步区分复杂

Belady 异常

FIFO 特有:增加页框数,缺页率反增。

经典例:访问串 1,2,3,4,1,2,5,1,2,3,4,5

  • 3 页框:缺页 9 次
  • 4 页框:缺页 10 次 ⚠️

IMPORTANT

页面置换解题套路 callout

  1. 画表:每行一个访问,列出当前页框内容
  2. 命中:该页已在 → 不变;未命中:按算法选淘汰页
  3. FIFO:淘汰最早进入的(队列)
  4. LRU:淘汰最久没访问的(栈)
  5. OPT:淘汰未来最久不访问的
  6. 统计缺页次数 / 缺页率

真题举一反三

2021-05 综合题:访问串 1,2,3,4,2,1,5,6,2,1,2,3,6,2,3 页框,LRU 求缺页次数。

  • 解: | 访问 | 1 | 2 | 3 | 4 | 2 | 1 | 5 | 6 | 2 | 1 | 2 | 3 | 6 | 2 | |------|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | 页框 | 1 | 1,2 | 1,2,3 | 2,3,4 | 3,4,2 | 4,2,1 | 2,1,5 | 1,5,6 | 5,6,2 | 6,2,1 | 6,2,1* | 2,1,3 | 1,3,6 | 3,6,2 | | 缺页 | ✓ | ✓ | ✓ | ✓ | | ✓ | ✓ | ✓ | ✓ | ✓ | | ✓ | ✓ | ✓ |

  • 缺页 12 次(命中 2 次)

2024-11 综合题:改进型 CLOCK(访问位 A + 修改位 M),4 类优先级。

  • 解:①(0,0) ②(0,1) ③(1,0) ④(1,1),从指针扫,扫一遍若找到 (0,0) 替换;否则把扫描到的 A 改 0,再扫一遍找 (0,0)/(0,1)。

F. 磁盘调度

算法对比

算法原理优点缺点
FCFS先来先服务公平寻道长
SSTF最短寻道优先性能较好远端饥饿
SCAN电梯算法(双向扫到端)无饥饿中间请求等待
C-SCAN单向扫描(到端回起点)响应均匀回程空跑
LOOKSCAN 改进(不扫到端,扫到最远请求)节省寻道
FSCAN多队列(防单调粘连)公平复杂

真题举一反三

2022-11 综合题:当前柱面 53,请求队列 98,183,37,122,14,124,65,67,SCAN(向柱面增大方向),总柱面 0~199,求总寻道距离。

  • 解:向大:65,67,98,122,124,183(到 199 前停,LOOK 改进);向小:37,14
  • 距离 = (183-53) + (183-14) = 130+169 = 299 柱面

G. 文件系统

文件物理结构

结构原理优缺点
连续起始块 + 长度简单、读快;碎片
链接块内指针无碎片;随机访问慢
索引索引表灵活;索引块开销
多级索引直接 + 一级间接 + 二级间接 + 三级间接兼顾小大文件

混合索引例:inode 含 12 直接块 + 1 一级间接 + 1 二级间接 + 1 三级间接

  • 块大小 4KB,每块 4B 指针(1024 指针/块)
  • 直接:48KB;一级:4MB;二级:4GB;三级:4TB

真题举一反三

2023-11 综合题:块大小 1KB,地址 4B,inode 含 10 直接 + 1 一级 + 1 二级,求最大文件。

  • 解:直接 10KB;一级 256KB;二级 64MB;总 ≈ 64.266 MB

H. 反查表

考点套路真题锚点
进程状态转换五态图2024-05§A
FCFS/SJF/RR 调度甘特图四步法2020-11, 2023-05, 2024-11§B
HRRN 响应比(W+S)/S2024-05§B
互斥 vs 同步信号量互斥=1,同步=0/资源2021-11, 2024-05, 2025-11§C
PV 大题四步法同步在前互斥在后2024-05, 2025-11§C
生产者-消费者empty/full/mutex2021-11§C
读者-写者readcount + wmutex2024-05§C
哲学家就餐防死锁策略2022-05§C
死锁四条件互斥/占有/不剥夺/循环2024-11§D
银行家安全性算法Work+Finish 五步2020-11, 2023-05§D
LRU 缺页率栈式维护2021-05§E
FIFO Belady增页框反增缺页2025-05§E
CLOCK 改进型A+M 四类优先级2024-11§E
SCAN 磁盘调度电梯算法距离2022-11§F
混合索引最大文件直接+一级+二级+三级2023-11§G

记忆口诀 / 易错点汇总

  1. PV 大题口诀:同步在前互斥在后,资源数 = 信号量初值
  2. 银行家五步:Work+Finish → 找 Need≤Work → 加 Allocation → 全 Finish 即安全
  3. 页面置换四算法:OPT 最优不可实现;FIFO 异常;LRU 开销大;CLOCK 近似
  4. 死锁四条件:互斥占有不剥夺循环
  5. 调度算法选择:交互选 RR;批处理选 SJF;实时选优先级

TIP

避坑建议

  • PV 大题必须画前驱图,再设同步信号量
  • 银行家算法先算 Need 矩阵(Max − Allocation)
  • LRU 维护”栈”:访问到的页提到栈顶,淘汰栈底
  • SCAN/C-SCAN 注意方向(题目给定或默认增大)

交叉引用

本系列笔记

主计划文档

详见 主计划 §3.2 操作系统 的对应内容。

外部延伸

  • 官方教材:《系统架构设计师教程(第 2 版)》§3.2
  • 真题练习:2020-2025 综合+案例 PV 大题

自测题

  1. 调度:4 进程 P1~P4,到达 0/1/2/3,服务 5/3/8/6,SJF 求平均等待时间。(答:≈ 4.5)
  2. PV:写 barber sleeping 问题伪代码(M 理发师,N 椅子)。
  3. 银行家:5 进程 A B C D,可用 (3,3,2),能否安全分配?给出安全序列。
  4. 页面置换:访问串 7,0,1,2,0,3,0,4,2,3,0,3,2,4 页框,LRU 求缺页次数。(答:6 次)
  5. 磁盘:当前 100,请求 55,58,39,18,90,160,150,38,184,SCAN 向小,总寻道?(答:≈ 382)

IMPORTANT

如果只能”看着面熟”但说不出来,说明还没真正掌握,建议回看对应章节并多做真题。


下一篇导引数据库网络深化 将讲述范式判定决策树、子网划分五步公式、TCP 三次握手四次挥手,帮助你掌握 DB+网络全部考点。