信号量、PV操作、互斥、同步、死锁举例
AI模型Deepseek仅供参考Lets 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 里两个程序各占一个设备又都想用对方的设备就会形成死锁。死锁必须同时满足这四个条件互斥、保持与等待、不可抢占、循环等待。只要打破其中任意一个死锁就不会发生。比如规定所有程序都先申请摄像头、再申请麦克风就不会出现循环等待了。