进程同步机制-信号量机制-AND型信号量

发布于:2025-05-29 ⋅ 阅读:(22) ⋅ 点赞:(0)

用生活化的例子来解释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 型信号量的核心是:要么一次性获得所有需要的资源,要么不获得任何资源。这种机制通过原子性的资源分配,避免了死锁和资源碎片化,确保进程在执行前拥有所有必要的资源。


网站公告

今日签到

点亮在社区的每一天
去签到