2.2 操作系统:进程与并发

2026-11-03 11:47:00上一篇 / 下一篇

本篇定位:计算机系统基础篇的操作系统上篇。操作系统 9 年题量 1–7 题(波动大,2025 仅 2 题、2019 达 7 题),低位必考模块。本章(进程与并发)聚焦:进程/线程、并发与共享、死锁、处理机调度、信号量与 PV、进程通信——是操作系统的"灵魂"(并发是核心特征)。2024 年信号量/进程调度/页面置换"重点回归",2027 预测 2–3 题。 数据依据:01-真题/考点汇总/ 9 份计算机考点汇总;答案以专业判断为准。 阅读提示:内存管理(页式/段式/虚拟存储)、文件系统、I/O 管理归 2.3 操作系统下篇;嵌入式 OS 归本章(进程模型简单、专用)。


一、考点定位(本章真题统计)

考点真题锚点频次考法
进程管理2019 单22、2020 单22、2024 单233 年进程调度(就绪→运行)、PCB、进程唤醒(→就绪)
死锁2018 单34、2019 单232 年死锁成因(资源分配不当/竞争独占资源)
进程与线程2018 单72、2019 单372 年线程特性、线程共享(栈指针不共享)
并发与共享2018 单331操作系统最基本特征=并发和共享
处理机调度2019 多82、单60/611 年 3 题三级调度组成(作业/中级/进程)、FCFS 偏向、分时时间片与响应时间
信号量与 PV2024 单221信号量值语义(可用数/等待数)
微内核 / 嵌入式 OS2021 单28、2026 单742 年微内核特性、嵌入式系统特征
操作系统分类2019 多811OS vs 应用软件

命题规律:进程与并发是操作系统最高频考点(几乎年年有)。考法:①概念辨析(进程状态、线程共享、死锁条件);②信号量数值(初值/当前值→可用数/等待数);③调度算法特性(FCFS 偏向 CPU 繁忙型作业)。2027 预测:进程状态转换、死锁四条件、PV 操作、调度算法(先来先服务/短作业优先/时间片轮转)。


二、知识框架(先搭骨架)

操作系统:进程与并发
├── 操作系统概述
│   ├── 定义:管理计算机资源、控制程序执行、为用户提供接口
│   ├── 基本特征:并发(宏观并行微观交替)和共享(互斥/同时)
│   ├── 分类:批处理/分时/实时;UNIX/Linux/Windows 是 OS
│   └── 体系结构:微内核(小而可靠,服务外置)vs 宏内核
├── 进程与线程
│   ├── 进程:程序的一次执行(动态);PCB=进程存在的唯一标志
│   ├── 状态:就绪→运行→阻塞(等待);唤醒→就绪
│   ├── 线程:进程内执行单元;共享代码/文件/全局变量,不共享栈
│   └── 引入线程目的:提高并发程度、提高系统效率
├── 处理机调度
│   ├── 三级调度:作业调度(高级,谁进内存)→ 中级调度(对换,谁留内存)→ 进程调度(低级,谁上 CPU)
│   ├── 频率:进程调度最高 / 中级居中 / 作业调度最低;作业调度控制多道程序度
│   ├── FCFS:利于 CPU 繁忙型作业、不利 I/O 繁忙型作业
│   ├── 时间片轮转:用户数越多 → 响应时间越长(越慢)
│   └── 短作业优先/优先级/多级反馈队列
├── 并发控制
│   ├── 临界资源(一次仅一个进程使用);互斥/同步
│   ├── 信号量:正=可用数、负=等待数;P 减不够则阻塞、V 加有人则唤醒
│   └── PV 语义:值>0 表示可用资源数;值<0 表示等待进程数
└── 死锁
    ├── 定义:进程互相等待对方占有的资源而无法推进
    ├── 四个必要条件:互斥/占有并等待/不可剥夺/循环等待
    ├── 产生原因:竞争独占资源(根本)+推进顺序不当(直接)
    └── 处理:预防(破坏条件)/避免(银行家算法)/检测与解除

一句话记忆:OS 特征(并发共享)→ 进程线程(PCB/状态/线程共享)→ 调度(FCFS/时间片)→ 并发控制(信号量 PV)→ 死锁(四条件/资源竞争)。


三、考点详解

3.1 操作系统概述

精确定义:操作系统=管理计算机硬件与软件资源、控制程序执行、为用户和应用程序提供接口的系统软件。

基本特征(2018 单33):操作系统最本质的两个特征是并发和共享。并发=多个程序在同一时间间隔内交替执行(宏观并行、微观交替);共享=资源被多个进程共同使用(互斥共享/同时共享)。坑:虚拟、异步是特征但不是"最本质"的两个;"并发和不确定"不是。

操作系统分类(2019 多81):UNIX、Linux、MS DOS 是操作系统;MS Office 是应用软件。按工作方式分:批处理、分时(时间片轮转)、实时(硬实时/软实时)。

微内核(2021 单28):微内核只保留最基本功能(进程通信、基本调度、内存管理核心),其余服务(文件、设备驱动)外置为用户态进程——增强灵活性、可扩展性、可靠性、可移植性,适合分布式系统。坑:微内核不是"功能越全越好",恰恰相反是"内核最小化"。

容器 vs 虚拟机(2020 单37,六维必背):

维度虚拟机(VM)容器(Docker 等)
虚拟化对象硬件(Hypervisor 虚拟出完整机器)操作系统层(共享宿主内核)
是否含 Guest OS含完整 Guest OS不含 Guest OS,只有应用+依赖
隔离强度硬件级,强进程级(namespace+cgroup),弱于 VM
体积 / 启动GB 级 / 分钟级MB 级 / 秒级
部署密度低(每 VM 一套 OS)高(一台宿主跑很多容器)
迁移与一致性镜像大、迁移慢镜像轻、环境一致性好

判断点(2020 单37):容器镜像不含 Guest OS(基础镜像的"OS"只是文件系统层,运行靠共享宿主内核);容器不是"轻量虚拟机"——它不模拟硬件。与 8.2 云计算的 IaaS(VM)/PaaS(容器平台)对应。

操作系统安全配置基线(2023 多91):最小化安装(只装必要组件)、关闭无用端口与服务、及时打补丁、开启审计与日志、遵循最小权限(日常用普通账号、不用管理员账号)、系统分区与数据分区分离(2025 单64 的"只用一个分区"=不安全)。

3.2 进程与线程

精确定义:

  • 进程=程序的一次执行过程(动态性:有创建→就绪→运行→阻塞→终止的生命周期);PCB(进程控制块)是进程存在的唯一标志(2020 单22),存放进程标识、状态、寄存器现场、资源清单。
  • 线程=进程内的一个执行单元(轻量级进程);一个进程可有多个线程。

进程状态转换(2024 单23):进程被唤醒 = 由阻塞(等待)状态变为就绪状态(等待的事件发生);就绪→运行靠调度;运行→阻塞靠等待事件(如 I/O)。

进程调度(2019 单22):进程调度负责从就绪队列中挑选一个进程分配 CPU(就绪→运行)。

线程的特性(2018 单72、2019 单37):

  • 引入线程可提高程序并发执行程度、进一步提高系统效率(线程切换开销小于进程)。
  • 线程不能脱离进程独立存在;一个进程可包含多个线程;线程不增大时空开销。
  • 进程内各线程共享:代码段、打开的文件、全局变量(堆、数据区)——不共享各自的栈指针/栈(2019 单37 的坑:某线程的栈指针不共享)。

3.3 处理机调度(2019 多82、单60/61)

三级调度(2019 多82):CPU 资源的分配分三个层次——作业调度(高级调度)、中级调度(内存对换)、进程调度(低级调度)。判断层次就问三句:谁进门(作业进内存)、谁留内存(换入换出)、谁上 CPU(就绪→运行)。

对比项作业调度(高级调度)中级调度进程调度(低级调度)
调度对象作业(外存后备队列中的完整任务)进程(内存↔外存)进程(就绪队列)
主要功能挑选作业、分配内存等资源、创建进程进就绪队列将暂不运行的进程换出内存(挂起)、空闲时换入从就绪队列挑一个进程分配 CPU(2019 单22:就绪→运行)
触发频率低(涉及内存分配、动作重)中(内存紧张时换出、空闲时换入)最高(OS 最频繁的调度)
所处位置外存 → 内存内存 ↔ 外存就绪队列 → CPU
核心作用控制多道程序度(决定谁能"进门")调节内存压力、提高内存利用率(决定谁"留在楼里")决定 CPU 归属(决定谁"上会议室")
常用算法FCFS、短作业优先(SJF)、高响应比优先(HRRN)对换策略时间片轮转、优先级、多级反馈队列

记忆比喻:作业调度 = 大门保安(谁能进大楼 = 内存);中级调度 = 电梯管理员(楼里太挤,把人请到地下车库 = 外存挂起,有空再请回);进程调度 = 会议室调度员(谁进唯一的会议室 = CPU 发言)。 挂起态(衔接 3.2 状态模型):被中级调度换出的进程进入挂起状态(就绪挂起/阻塞挂起)——引入挂起态后,五状态模型扩展为七状态模型。 进程调度触发时机(衔接状态转换):时间片用完、进程主动放弃 CPU(请求 I/O)、更高优先级进程就绪、进程运行结束。 ⚠️ 干扰项辨析:三级调度只有这三层——没有"页面调度""线程调度"这类说法(2019 多82 错误选项套路)。

FCFS(先来先服务)(2019 单61):有利于 CPU 繁忙型作业,不利于 I/O 繁忙型作业。

  • 两个名词先定死:CPU 繁忙型作业=绝大部分时间在做计算、极少请求 I/O(如科学计算);I/O 繁忙型作业=每次只用一小段 CPU、大量时间在等 I/O(如交互式作业、频繁读写磁盘)。差别只在"要 CPU 的方式",不在作业大小;进程调度语境下同一说法叫 CPU 繁忙型进程 / I/O 繁忙型进程。
  • 为什么:FCFS 非抢占(CPU 一到手就跑到它自己让出)+严格 FIFO(做完 I/O 回来排到队尾)⇒ CPU 繁忙型作业可一次算完、不被打断;而 I/O 繁忙型作业每次从 I/O 回来都要重新排队等 CPU(有 k 次 I/O 就是多排 k+1 次队),且它卡在 CPU 队列里时 I/O 设备空转、CPU 与 I/O 无法重叠(护航效应 convoy effect)。

时间片轮转(2019 单60):时间片固定时,用户数越多,响应时间越长(每个用户分到的时间片间隔变长)。

五个常用算法对照(补强 · 术语补全,2027 高概率)

算法抢占机制(一句话)优点缺点 / 风险
FCFS 先来先服务非抢占按到达顺序发 CPU,跑完或主动让出才换最简单、不会饥饿、开销小护航效应;对短作业与 I/O 繁忙型作业最不利;平均等待时间不是最短
SJF 短作业优先非抢占挑要求服务时间最短的先跑平均等待时间最短(理论最优)长作业饥饿;须预知运行时间
HRRN 高响应比优先非抢占挑响应比最高的(长作业等久了比值上升)长短兼顾,长作业不饥饿每次要算响应比,开销略大
时间片轮转 RR抢占每个进程只给一个固定时间片,用完排到队尾响应快,适合分时/交互片小→切换开销大;片大到能跑完就退化成 FCFS
多级反馈队列抢占设多级就绪队列,用完本片时间片就降级,新进程进最高级,高级队列空了才服务低级兼顾响应与吞吐,公认较优;I/O 繁忙型作业留在高优先级、轮转快队列数/时间片等参数难调

四个必须说清的术语(原文只有名字,不许再糊着过)

  • 响应比 = 1 +(等待时间 ÷ 要求服务时间):刚到达时为 1;响应比随等待时间变长而变大 ⇒ 长作业等着等着"变短"了,这就是 HRRN 不饥饿的原因。
  • 饥饿(starvation):某作业/进程因优先级低或属于"长作业"而被无上限地推迟,始终轮不到 CPU——不是"永远排不上",而是"没有尽头地等"。
  • 长作业 / 短作业:按**要求服务时间(运行时间)**划分,与 CPU 繁忙型/I/O 繁忙型是两把尺子——一个长作业完全可能 I/O 很多(例:大批量数据处理)。
  • 带权周转时间 = 周转时间 ÷ 运行时间:衡量"等了几倍于自己运行时间的代价",比平均周转时间更公平(不受作业大小失真影响)。

⚠️ SJF 的抢占版=SRTN(最短剩余时间优先):新到进程的剩余时间比当前进程的剩余时间还短,就立即切换——常考"SJF 能否抢占"。 口诀:FCFS 保长饿短、SJF 保短饿长、HRRN 长短兼顾、RR 保响应、多级反馈全兼顾。

3.4 并发控制:信号量与 PV(2024 单22;2027 高概率回归)

精确定义:

  • 临界资源:一次仅允许一个进程使用的资源(打印机、共享变量)——需互斥访问。
  • 信号量(Dijkstra 提出):进程同步与互斥的工具——本质是整型变量 S(表示可用资源数或同步条件)+ 一个等待队列。

按取值分两类:

类型取值典型用途
一般(计数)信号量0..n(可 >1)管理多个同类资源(初值 = 资源数)
二元/互斥信号量初值 1,只管理 1 个资源;无等待时取 0/1,有排队时转负(−1=1 个在等)实现互斥(初值 1)——"锁是特殊的二元信号量"是正确说法(2022 单53 选项,交叉呼应 4.5 数据库锁)

二元(互斥)信号量的 0 / 1 究竟是什么状态(高频记反点):S =当前可用许可数,不是开关极性。

  • 1 = 临界资源空闲可用(这就是初值取 1 的原因)→ P 成功即 0 = 已被占用、且无人等待 → 再有人 P 就 −1、−2…(绝对值=等待进程数)。
  • ⚠️ 别记反:不是“0=空闲、1=占用”。初值若误设 0,则所有进程一 P 就阻塞、没人能进临界区(开局即死锁)。
  • ⚠️ “二元”≠“只能取 0 或 1”:它只管理 1 个资源(初值 1),有排队时照样转负——与本节“负值绝对值=等待进程数”同一口径。
  • 时间轴(初值 1,A/B/C 抢同一台打印机):1 →A:P 0(A 进临界区)→B:P −1(B 等)→C:P −2(C 等)→A:V −2→−1 唤醒 B →B:V −1→0 唤醒 C →C:V 0→1 复原。
  • 与“锁”的对应:加锁=P(S) 成功(1→0)、解锁=V(S)(0→1,有等待者则唤醒一个) ⇒ “锁是特殊的二元信号量”成立(2022 单53)。

P 操作(wait,申请资源):

P(S):S = S − 1;if S < 0 → 当前进程阻塞,进入该信号量的等待队列

减 1 后 S < 0 = 资源不够 → 阻塞(这正是"负值绝对值 = 等待进程数"的来源);S ≥ 0 = 申请成功,继续执行。

V 操作(signal,释放资源):

V(S):S = S + 1;if S ≤ 0 → 唤醒一个等待进程(转入就绪队列)

加 1 后 S ≤ 0 = 说明加之前有进程在等 → 唤醒一个;S > 0 = 无人等待,只是资源计数 +1。

两条铁律:①P/V 是原子操作(执行中不可中断,否则并发出错);②PV 必须成对(有 P 无 V → 资源泄漏/死锁,有 V 无 P → 时序错乱)。

信号量数值语义(2024 单22,核心):当前值 >0 → 还剩 S 个可用资源;=0 → 资源刚好用完、无人等待;<0 → |S| = 正在等待的进程数。例:初值 5、当前值 2 → 可用 2、等待 0(选 B);当前值 −3 → 可用 0、等待 3。

记忆口诀:P 减一、不够就等;V 加一、有人就醒;正 = 可用、负 = 等待数。

3.5 死锁

精确定义:死锁=两个以上进程互相等待对方占有的资源而无限期阻塞的状态。

产生原因(2018 单34、2019 单23):

  • 根本原因:多个进程竞争独占资源(2019 单23 选"多个进程竞争独占资源")。
  • 直接原因:资源分配不当/推进顺序不当(2018 单34 选"资源分配不当")。
  • 坑:P、V 操作过多不是死锁原因;没有 SPOOLing 不是死锁原因。

四个必要条件(2027 高概率,横向重点):①互斥(资源一次仅一进程用);②占有并等待(持有一个资源还等另一个);③不可剥夺(资源不能强占);④循环等待(形成等待环)。破坏任一条件即可预防死锁。

处理:预防(破坏四条件之一)、避免(银行家算法)、检测与解除(资源剥夺/撤销进程)。


四、易错坑汇总(命题人惯用陷阱)

  1. 操作系统最基本特征 = 并发和共享,不是"虚拟和不确定"(2018 单33)。
  2. 进程唤醒 = 阻塞→就绪(不是→运行,运行要等调度)(2024 单23)。
  3. PCB 是进程唯一标志;进程具有动态性(2019 单22、2020 单22)。
  4. 线程共享代码/文件/全局变量,不共享栈指针(2019 单37 的坑)。
  5. 信号量值语义:正=可用数、0=刚好用完且无人等待、负=等待数绝对值;互斥信号量初值 1(1=空闲、0=占用),别记反(2024 单22)。
  6. 死锁原因:竞争独占资源(根本)+资源分配不当(直接)——"P、V 操作过多""无 SPOOLing"不是(2018 单34、2019 单23)。
  7. FCFS 利于 CPU 繁忙型作业、不利于 I/O 繁忙型作业(2019 单61);时间片固定时用户越多响应越慢(2019 单60)。
  8. 微内核 = 内核最小化(服务外置),不是"功能越多越好"(2021 单28)。
  9. 三级调度:作业/中级/进程——别漏"中级"(2019 多82)。
  10. OS vs 应用软件:MS Office 是应用软件不是 OS(2019 多81)。

五、横向扩展(防漏网:本章边界内、真题尚未考但可能补考的点)

说明:横向扩展覆盖"大纲范围内但 9 年真题未考过"的知识,标注【新增概率】供取舍。

  1. 死锁四必要条件【高】:互斥/占有并等待/不可剥夺/循环等待——2018/2019 只考了成因,四条件判定是 2027 高概率(多选常考"哪个不是必要条件")。
  2. 银行家算法【中】:避免死锁的经典算法——安全序列判断(可能出简单计算/判定题)。
  3. 进程状态完整转换图【高】:创建→就绪→运行→阻塞→终止;就绪/运行/阻塞三态转换的条件(调度/时间片到/等待事件/唤醒)——2024 单23 已考唤醒,可考完整转换。
  4. 进程间通信(IPC)【中】:共享内存、消息传递、管道、信号——"哪种最快"(共享内存)类题。
  5. 临界区与互斥实现【中】:关中断、TS 指令(Test-and-Set)、PV 操作——互斥机制。
  6. 生产者-消费者问题【中】:经典 PV 应用题(两个信号量)——2024 信号量回归后可能考应用变体。
  7. 调度算法对比【高】:已在 §3.3 补五行对照表 + 四个术语定义(响应比公式/饥饿/长·短作业的划分/带权周转)+ SRTN 抢占版;要点=SJF 平均等待最短但长作业饥饿、RR 适合分时、优先级有饥饿问题、多级反馈队列公认较优——2019 考了 FCFS,2027 可能考 SJF/时间片对比。
  8. 进程与程序的区别【低】:动态 vs 静态、并发 vs 顺序、PCB 存在性——概念题。
  9. 实时操作系统(RTOS)【中】:硬实时(导弹制导,必须在期限内响应)vs 软实时(多媒体);嵌入式 OS(RTOS)2026 已考(扫地机器人),可考 RTOS 特征延伸。
  10. 系统调用【中】:用户态→内核态的接口(read/write/fork 等);用户态与内核态切换——与信息安全(权限管理)衔接。

六、真题演练(代表性真题 + 解析)

例 1(2024 单22) 某信号量初值为 5,当前值为 2,则表示(口径已核)。 A. 可用资源数为 5、等待进程数为 2 B. 可用资源数为 2、等待进程数为 0 C. 可用资源数为 3、等待进程数为 0 D. 可用资源数为 2、等待进程数为 3

答案:B。信号量当前值为正 → 表示剩余可用资源数 = 2、等待进程数 = 0。口诀:值为正=可用数、值为负=等待数(取绝对值)。

例 2(2019 单37) 关于线程,下列说法错误的是(口径已核)。 A. 同一进程内的线程共享代码段 B. 线程共享打开的文件 C. 线程共享全局变量 D. 线程共享各自的栈指针

答案:D。进程内线程共享代码段、打开的文件、全局变量(A/B/C 对);栈指针是每个线程私有的(不共享)——选 D(错误项)。口诀:栈私有、其余共享。

例 3(2018 单33) 操作系统最基本的两个特征是(口径已核)。 A. 并发和不确定 B. 并发和共享 C. 共享和虚拟 D. 虚拟和不确定

答案:B。操作系统最本质特征 = 并发和共享。口诀:OS 两本质——并发、共享。

例 4(2024 单23) 进程被唤醒意味着(口径已核)。 A. 进程变为运行状态 B. 进程变为阻塞状态 C. 进程变为就绪状态 D. 进程被终止

答案:C。唤醒 = 阻塞→就绪(等待的事件已发生);就绪→运行还需要进程调度(A 错)。口诀:唤醒进就绪、调度进运行。

例 5(2019 单23) 下列最易导致死锁的是(口径已核)。 A. 多个进程竞争 CPU B. 多个进程竞争独占资源 C. 进程间通信频繁 D. 作业调度不合理

答案:B。死锁根本原因 = 多个进程竞争独占(临界)资源;A 竞争 CPU 不会死锁(CPU 可剥夺);C/D 不是死锁直接原因。口诀:死锁看独占资源。

例 6(2019 单61) 先来先服务(FCFS)调度算法(口径已核)。 A. 有利于 I/O 繁忙型作业 B. 有利于 CPU 繁忙型作业 C. 对长作业不利 D. 平均等待时间最短

答案:B。FCFS 有利于 CPU 繁忙型作业(长 CPU 段一次做完)、不利于 I/O 繁忙型作业(频繁排队等待);C 说反(长作业先来先服务反而占优)、D 是 SJF 的特性。口诀:FCFS 照顾 CPU 忙的作业、SJF 等待时间短。

例 7(2019 单22) 进程调度主要负责(口径已核)。 A. 把作业调入内存 B. 从就绪队列中选一个进程分配 CPU C. 处理进程间的通信 D. 分配内存空间

答案:B。进程调度(低级调度)=从就绪队列选进程分配 CPU(就绪→运行);A 是作业调度(高级)、D 是内存管理。口诀:就绪队列→CPU 是进程调度的活。

例 8(2026 单74) 扫地机器人使用的操作系统最可能是(口径已核)。 A. 分时操作系统 B. 批处理操作系统 C. 通用操作系统 D. 嵌入式操作系统

答案:D。扫地机器人资源少、功耗低、功能专用 → 嵌入式操作系统(RTOS,实时性要求)。场景题:先看"资源/功耗/专用"三个关键词。


七、本章小结

  • 一条主线:OS 特征(并发共享)→ 进程线程(PCB/状态/线程共享)→ 调度(FCFS/时间片)→ 并发控制(信号量 PV)→ 死锁(四条件/资源竞争)。
  • 必背口诀:唤醒进就绪、调度进运行;三级调度=谁进门(作业)/谁留内存(中级)/谁上 CPU(进程);信号量正=可用负=等待;FCFS 照顾 CPU 忙的作业;死锁看独占资源。
  • 必背区分:进程(动态/PCB)vs 线程(轻量/共享栈私有);微内核(小而可靠)vs 宏内核。
  • 衔接预告:死锁与并发控制延续到 2.3 内存管理(页面置换 LRU);嵌入式 OS 与第 8 篇物联网衔接;进程权限与 7.3 身份认证衔接。