用生活化的例子来解释AND 型信号量(也叫同时 wait 操作)
1. 基本思想:“要么全给,要么都不给”
AND 型信号量解决的问题是:当一个进程需要多个资源时,必须一次性获得所有资源才能继续执行,否则就等待。
生活类比:
假设你要举办一场生日派对,需要同时准备:
- 蛋糕(资源 A)
- 气球(资源 B)
- 蜡烛(资源 C)
如果只拿到蛋糕和气球,没有蜡烛,派对就没法开始。
AND 型信号量的规则是:只有当所有资源(蛋糕、气球、蜡烛)都准备好时,才会一起分配给你;否则你就得等着。
2. Swait 操作:一次性请求所有资源
Swait(蛋糕, 气球, 蜡烛) {
while (true) {
if (蛋糕够 && 气球够 && 蜡烛够) {
拿走一块蛋糕;
拿走一束气球;
拿走一盒蜡烛;
开始派对;
break;
} else {
// 只要有一个资源不足,就进入等待
去"缺蛋糕"的队伍排队(如果蛋糕不够);
或者去"缺气球"的队伍排队(如果气球不够);
或者去"缺蜡烛"的队伍排队(如果蜡烛不够);
// 等下次有资源可用时,重新检查所有资源
}
}
}
对应着
Swait(S1, S2, ..., Sn) {
while (TRUE) {
if (Si>=1 && ... && Sn>=1) {
for (i = 1;i<=n;i++) Si--;
break;
}
else {
place the process in the waiting queue associated with the first Si found with Si<1, and set the program count of this process to the beginning of Swait operation
}
}
}
在Swait(S1, S2, ..., Sn)
中,if (Si>=1 && ... && Sn>=1)
语句判断所有信号量(代表不同资源 )是否都满足进程需求,只有全满足才分配资源,体现 “要么全给,要么都不给”
是进程请求多种资源的操作。先检查所有信号量,都满足条件(Si>=1
)时,原子性地将所有信号量减 1 ,进程获取资源并继续;有任一信号量不满足,就把进程放入首个资源不足的信号量等待队列,后续重新检查分配。
关键逻辑:
- 原子性检查:只有所有资源都满足需求时,才会分配资源(
Si--
)。 - 等待策略:如果某个资源不足,进程会被放入对应资源的等待队列,且必须等待所有资源都可用时才能继续。
3. Ssignal 操作:一次性释放所有资源
Ssignal(蛋糕, 气球, 蜡烛) {
归还一块蛋糕;
归还一束气球;
归还一盒蜡烛;
// 检查等待队列:
如果"缺蛋糕"的队伍有人,就唤醒他们;
如果"缺气球"的队伍有人,就唤醒他们;
如果"缺蜡烛"的队伍有人,就唤醒他们;
}
对应着
Ssignal(S1, S2, ..., Sn) {
while (TRUE) {
for (i = 1 ; i<=n;i++) {
Si++;
Remove all the process waiting in the queue associated with Si into the ready queue.
}
}
}
进程释放多种资源的操作。将所有信号量加 1 ,表示释放资源,然后检查各信号量等待队列,唤醒等待进程,被唤醒进程需重新执行Swait
检查资源。
Si++;
释放资源;Remove all the process...
唤醒等待队列进程。
关键逻辑:
- 一次性释放:进程释放所有资源后,系统会检查每个资源的等待队列。
- 唤醒策略:被唤醒的进程需要重新执行
Swait
,再次检查所有资源是否同时满足需求。
4. 为什么需要 AND 型信号量?
传统的信号量(如 PV 操作)允许进程一次只请求一个资源,这可能导致死锁。例如:
- 进程 P1持有资源 A,请求资源 B;
- 进程 P2持有资源 B,请求资源 A。
两者都在等待对方释放资源,导致死锁。
AND 型信号量通过一次性分配所有资源,避免了这种循环等待的情况:
- 如果 P1 需要 A 和 B,它必须同时获得两者才能执行,否则就不占用任何资源。
5. 生活中的例子:会议室预约
假设公司有两种会议室:
- 大会议室(需要预约,资源 A)
- 投影仪(需要预约,资源 B)
员工必须同时预约到大会议室和投影仪才能开会。AND 型信号量的规则是:
- 预约时:如果大会议室和投影仪都可用,同时分配给员工;否则都不分配。
- 结束时:员工同时归还大会议室和投影仪,系统会检查等待队列中是否有员工可以同时获得这两个资源。
总结
AND 型信号量的核心是:要么一次性获得所有需要的资源,要么不获得任何资源。这种机制通过原子性的资源分配,避免了死锁和资源碎片化,确保进程在执行前拥有所有必要的资源。