AI模型:Deepseek
仅供参考
Let's Go!
==============================我是分割线==================================
互斥例子:
我们用 Windows 里一个很常见的场景:多个程序同时想用麦克风录音。
场景
你打开 Windows 自带的“录音机”开始录音,同时又打开 QQ 想语音通话。
但你的电脑只有一个麦克风,同一时刻只能被一个程序占用。
这时 Windows 就会让其中一个先用,另一个等待。这就是信号量、P 操作和 V 操作在起作用。
先搞懂三个词
- 信号量:一个计数器,表示某种资源还有几个可用。
这里资源是“麦克风”,所以信号量初始值设为 1,表示麦克风空闲。
- P 操作:申请资源。
做法:信号量减 1。
如果减完小于 0,说明资源不够,就排队等待。
- V 操作:释放资源。
做法:信号量加 1。
如果有人在排队,就唤醒一个。
一句话:P 是申请,可能等待;V 是释放,会唤醒。
具体过程
1. 录音机先申请麦克风
录音机执行 P 操作:麦克风信号量从 1 减到 0。
减完不小于 0,说明麦克风空闲,录音机成功占用,开始录音。
2. QQ 也想用麦克风
QQ 执行 P 操作:麦克风信号量从 0 减到 -1。
减完小于 0,说明麦克风已被占用,QQ 只能排队等待。
3. 录音机录音结束
录音机执行 V 操作:麦克风信号量从 -1 加回 0。
发现有程序在等待(QQ),于是唤醒 QQ。
4. QQ 被唤醒,占用麦克风
QQ 从等待中醒来,发现自己可以用了,于是占用麦克风,开始语音通话。
小白总结
- 信号量:就是“麦克风还有几个”的计数器,一开始是 1。
- P 操作:我要用麦克风,先减 1;如果减完不够,就等着。
- V 操作:我用完了,加 1,并叫下一个等着的人来用。
所以,在 Windows 里,当你看到“麦克风被其他程序占用”的提示时,背后就是信号量、P 操作和 V 操作在协调多个程序,保证同一时刻只有一个程序能使用麦克风。
==============================我是分割线==================================
同步例子:
我们用 Windows 里很常见的 “在线视频缓冲后播放” 作为例子。
你在网页或播放器里点开一个视频,通常会先看到“正在缓冲…”的圈圈,等缓冲够了才开始播放。这就是同步:播放必须等缓冲完成。
先搞懂三个词
- 信号量:一个计数器,表示某件事有没有完成。这里叫它 S,初值是 0,表示“缓冲还没完成,不能播”。
- P 操作:申请。把信号量减 1。如果减完小于 0,就排队等待。
- V 操作:通知。把信号量加 1。如果有人在等,就把它叫醒。
同步步骤
1. 准备阶段
播放器启动一个“播放线程”,准备播放视频。
同时定义一个信号量 S = 0,表示“视频还没缓冲好”。
2. 播放线程先等
播放线程执行 P(S)。
S 从 0 减到 -1,小于 0,说明缓冲还没完成。
于是播放线程进入等待队列,暂停运行,界面上显示“正在缓冲…”。
3. 缓冲线程开始工作
缓冲线程从网络不断下载视频数据,放进缓冲区。
此时播放线程一直在等,不会提前播放。
4. 缓冲完成,发出通知
当缓冲区里的数据够播一段时间后,缓冲线程执行 V(S)。
S 从 -1 加回 0,并发现有播放线程正在等待。
于是系统唤醒播放线程。
5. 播放线程继续执行
播放线程被唤醒后,从 P(S) 的等待中返回,开始从缓冲区取数据播放视频。
你看到“正在缓冲…”消失,视频开始播放。
6. 播放过程中继续同步
如果播着播着缓冲区空了,播放线程可能再次执行 P(S) 等待;
缓冲线程继续下载,够了再 V(S) 通知。这样播放和缓冲一直协调进行。
小白总结
- 信号量 S 初值为 0:表示“事情还没发生”,这里是“视频还没缓冲好”。
- P 操作:播放线程问“缓冲好了吗?”没好就等着。
- V 操作:缓冲线程说“缓冲好了!”然后叫醒播放线程。
所以在这个 Windows 在线视频例子里:
播放线程先 P(S) 等待 → 缓冲线程下载数据 → 缓冲够了 V(S) 通知 → 播放线程被唤醒 → 开始播放。
这就是同步:一件事必须等另一件事完成,完成后通过 V 操作通知,等待方通过 P 操作被唤醒。
==============================我是分割线==================================
死锁例子:
我们用 Windows 上很常见的 “QQ 和钉钉同时想视频通话” 作为例子。
假设你的电脑连接了:
- 摄像头:同一时刻只能被一个程序使用。
- 麦克风:同一时刻也只能被一个程序使用。
现在发生下面的事:
- QQ 先启动了视频通话,占用了摄像头。然后它想再占用麦克风,但麦克风正被钉钉占着,于是 QQ 只能等。
- 钉钉 也启动了视频会议,先占用了麦克风。然后它想再占用摄像头,但摄像头正被 QQ 占着,于是钉钉也只能等。
- 两个程序都不肯先释放自己已经占用的设备,又都在等对方释放,于是双双卡死,谁也无法继续视频通话。
这就是 死锁。
下面看看死锁发生的四个必要条件,在这个例子里怎样一一对应:
1. 互斥条件
摄像头和麦克风都是独占设备,同一时刻只能被一个程序使用。
QQ 占了摄像头,钉钉就不能再用摄像头;钉钉占了麦克风,QQ 就不能再用麦克风。
2. 保持与等待条件
QQ 已经持有摄像头,同时又在等待麦克风。
钉钉 已经持有麦克风,同时又在等待摄像头。
它们都是“拿着一个,还想要另一个”。
3. 不可抢占条件
QQ 已经占用的摄像头,不能被钉钉强行抢走。
钉钉已经占用的麦克风,也不能被 QQ 强行抢走。
设备只能由占用它的程序自己释放,别人不能抢。
4. 循环等待条件
QQ 在等钉钉释放麦克风,钉钉在等 QQ 释放摄像头。
等待关系形成了一个圈:
QQ → 等麦克风 → 被钉钉持有 → 钉钉等摄像头 → 被 QQ 持有 → 回到 QQ。
这就是循环等待。
小白总结
在 Windows 里,两个程序各占一个设备,又都想用对方的设备,就会形成死锁。
死锁必须同时满足这四个条件:
互斥、保持与等待、不可抢占、循环等待。
只要打破其中任意一个,死锁就不会发生。
比如,规定所有程序都先申请摄像头、再申请麦克风,就不会出现循环等待了。