Appearance
408
操作系统
实现互斥的方法(软件/硬件)
一、定位信息
- 所属圈层:核心层
- 前置知识:了解同步与互斥的基本概念和临界区四原则(OS-02-09)
- 知识网络位置:本单元介绍互斥的软件和硬件实现方法,是信号量机制(OS-02-11)的前置知识。Peterson算法是经典的软件互斥方案
- 考点热度等级:H级(高频重点)——Peterson算法和硬件方法是408高频考点
二、知识点讲解
2.1 软件实现方法
单标志法
- 思路:用一个公共变量
turn表示"轮到谁进入临界区" - 问题:违反"空闲让进"——如果
turn=0但P0不想进入,P1即使想进入也必须等待
双标志先检查法
- 思路:每个进程设置一个标志
flag[i]表示"我想进入临界区",先检查对方标志再设置自己的 - 问题:违反"忙则等待"——检查和设置之间可能被打断,两个进程同时进入临界区
双标志后检查法
- 思路:先设置自己的标志,再检查对方标志
- 问题:可能导致双方都无法进入——都设置了标志,都在等对方退出
Peterson算法
核心思想:结合"意愿标志"和"谦让变量",主动谦让。
c
// 进程Pi (i=0或1, j=1-i)
flag[i] = true; // 我想进入
turn = j; // 谦让给对方
while (flag[j] && turn == j); // 对方想进入且对方优先级高,则等待
// 临界区
flag[i] = false; // 退出临界区- 满足全部四个原则:空闲让进、忙则等待、有限等待、让权等待(忙等待版本不满足让权等待)
- 关键理解:
turn变量保证了"最后一刻的谦让者"必须等待
2.2 硬件实现方法
中断屏蔽法
- 思路:进入临界区前关中断,退出后开中断
- 优点:简单有效
- 缺点:
- 只适用于单处理器系统
- 关中断时间过长会影响系统效率
- 不适用于用户进程(关中断是特权指令)
硬件指令法(TestAndSet / Swap)
TestAndSet(TSL)指令:
c
boolean TestAndSet(boolean *lock) {
boolean old = *lock;
*lock = true;
return old;
}
// 使用
while (TestAndSet(&lock)); // 忙等待
// 临界区
lock = false;Swap(XCHG)指令:
c
void Swap(boolean *a, boolean *b) {
boolean temp = *a;
*a = *b;
*b = temp;
}
// 使用
key = true;
do {
Swap(&lock, &key);
} while (key); // 忙等待
// 临界区
lock = false;- 优点:适用于多处理器系统,实现简单
- 缺点:不满足"让权等待"(忙等待),可能导致饥饿
2.3 各方法对比表
| 方法 | 类型 | 满足四原则 | 多处理器 | 优点 | 缺点 |
|---|---|---|---|---|---|
| 单标志法 | 软件 | 否(缺空闲让进) | 是 | 简单 | 不实用 |
| 双标志先检查 | 软件 | 否(缺忙则等待) | 是 | 简单 | 有竞态条件 |
| 双标志后检查 | 软件 | 否(可能死锁) | 是 | 简单 | 双方可能都无法进入 |
| Peterson算法 | 软件 | 是(忙等待版不满足让权等待) | 是 | 完整互斥 | 忙等待 |
| 中断屏蔽 | 硬件 | 是 | 否 | 简单高效 | 仅限单处理器 |
| TSL/Swap | 硬件 | 否(缺让权等待) | 是 | 简单可靠 | 忙等待,可能饥饿 |
三、记忆与理解辅助
- Peterson算法口诀:"设标志→谦让→检查对方→进入",核心是
turn变量的谦让机制 - 硬件方法一句话:"关中断最简单但只限单核,TSL/Swap多核也能用但要忙等"
- 软件方法演进:单标志→双标志先检查→双标志后检查→Peterson,逐步解决前一种的缺陷
四、例题与精解
例题1(基础巩固)
题目:Peterson算法中,turn 变量的作用是( )
A. 记录哪个进程在临界区中 B. 当两个进程同时想进入时,决定谁优先 C. 记录临界区是否空闲 D. 记录进程的执行次数
命题意图:考查Peterson算法的核心机制。
精解:
- 审题分析:需要理解Peterson算法中
turn的作用 - 解题思路:
turn是谦让变量,表示"我让给谁" - 完整步骤:
- 每个进程先设置
flag[i]=true表示想进入,再设置turn=j表示谦让给对方 - 如果两个进程都想进入(
flag[0]=flag[1]=true),turn决定了谁优先——turn指向的进程需要等待 - 这保证了不会出现两个进程同时进入临界区的情况
- A选项错误(记录在临界区中的是
flag标志),C选项错误,D选项错误
- 每个进程先设置
- 方法反思:
turn的本质是"最后一刻的谦让者必须等待",解决了双标志后检查法的死锁问题
答案:B
例题2(中等提升)
题目:以下互斥实现方法中,能在多处理器系统中使用的是( )
A. 中断屏蔽法 B. Peterson算法 C. TestAndSet指令 D. 单标志法
命题意图:考查各种互斥方法的适用范围。
精解:
- 审题分析:需要判断哪些方法适用于多处理器系统
- 解题思路:中断屏蔽法只在单处理器有效(关中断无法阻止其他CPU执行),软件方法和硬件指令方法可以在多处理器使用
- 完整步骤:
- A选项:中断屏蔽法只适用于单处理器系统。在多处理器中,关中断只影响当前CPU,其他CPU仍可进入临界区
- B选项:Peterson算法适用于多处理器(但需要保证内存操作的原子性)
- C选项:TestAndSet是硬件原子指令,适用于多处理器系统
- D选项:单标志法虽然理论上可用于多处理器,但本身有缺陷不实用
- 题目问"能使用",B和C都可以,但C(TSL)是最典型的多处理器互斥方案
- 方法反思:多处理器互斥需要硬件支持(原子指令)或特殊的软件算法,单纯的中断屏蔽不够
答案:C(若单选则选C,若多选则B、C都对)
五、考情分析
- 考查频次:近5年约3–4次
- 常见题型:选择题
- 分值占比:2分/题
- 命题趋势:Peterson算法的执行过程分析是高频考点,硬件方法(TSL/Swap)的原理也常考
六、易错点提醒
错误表现:认为Peterson算法完全满足"让权等待" 错误原因:忙等待版本的Peterson算法不满足让权等待 正确理解:标准Peterson算法使用忙等待(
while循环),不满足让权等待。需要配合信号量等机制才能实现让权等待错误表现:认为中断屏蔽法可以在多处理器系统中使用 错误原因:忽略了多处理器的独立中断机制 正确理解:关中断只影响当前CPU,其他CPU仍可执行临界区代码,因此中断屏蔽法不适用于多处理器
错误表现:混淆TSL指令和普通
if检查 错误原因:不理解原子操作的概念 正确理解:TSL是一条原子硬件指令,"测试"和"设置"在一条指令中完成,不会被中断。普通if检查不是原子的错误表现:认为Peterson算法只能用于两个进程 错误原因:标准教材只展示两个进程的版本 正确理解:Peterson算法可以扩展到N个进程(如Bakery算法),但两个进程版本最常考
七、来源标注
- 依据2026考研统考408大纲
- 依据《计算机操作系统》(汤小丹/汤子瀛版)第2章
- 依据《操作系统概念》(Silberschatz版)第6章