(1)在生产者-消费者问题中,如果对调生产者(或消费者)进程中的两个P操作和两个V操作的次序,会发生什么情况?试说明之
在生产者-消费者问题中,信号量P操作通常用于减少信号量的值,如果信号量的值为零,则进程会被阻塞;而V操作用于增加信号量的值,并唤醒被阻塞的进程。在经典的生产者-消费者问题中,我们通常会有两个信号量:一个用于空闲空间(empty),另一个用于已占用空间(full)。
结论:在生产者—消费者问题中,如果将两个P操作,即P(full)和P(mutex)互换位置,或者P(empty)和P(mutex)互换位置,都可能引起死锁。
- 例如:考虑系统中buffer全满时,若一生产者进程先执行了
P(mutex)
操作并获得成功,当再执行P(empty)
操作时,它将因失败而进入阻塞状态,它期待消费者执行V(empty)
来唤醒自己。在此之前,它不可能执行V(mutex)
操作,从而使企图通过P(mutex)
进入自己的临界区的其他生产者和所有的消费者进程全部进入阻塞状态,从而引起系统死锁。 - 一进程一定要先具备修改的资格(
P(empty)
),才能去修改(P(mutex)
),具有互斥属性的操作一定要一气呵成。 - 类似地,消费者进程若先执行P(mutex),后执行P(full),同样可能造成死锁。
V(full)
和V(mutex)
互换位置,或者V(empty)
和V(mutex)
互换位置,则不会引起死锁,其影响只是使临界资源的释放略为推迟一些。
(2)某计算机系统中有 8 台打印机,有 K 个进程竞争使用,每个进程最多需要 3 台打印机。该系统可能会发生死锁的 K 的最小值是___
由于每个进程最多需要使用3台打印机,可以先给每个进程分配2台打印机,最后在总的资源中减1个出来分配给一个进程就能避免死锁。所以用7/2=3.5,向下取整为3,所以最多使用3个进程不会发生死锁。所以发生死锁的最小值为4.
(3)某系统中有 3 个并发进程竞争资源 R,每个进程都需要 5 个 R,那么至少有( )个 R,才能保证系统不会发生死锁?
找出发生死锁的临界资源数m,大于m就不发生死锁,小于等于m就发生死锁
发
生
死
锁
的
临
界
资
源
数
=
(
每
个
进
程
所
需
资
源
数
−
1
)
×
进
程
数
发生死锁的临界资源数 = (每个进程所需资源数 - 1) \times 进程数
发生死锁的临界资源数=(每个进程所需资源数−1)×进程数
如:进程
P
1
,
P
2
,
P
3
P_1, P_2, P_3
P1,P2,P3,所需资源数分别为
n
1
,
n
2
,
n
3
n_1, n_2, n_3
n1,n2,n3,则临界资源数为
(
n
1
−
1
)
+
(
n
2
−
1
)
+
(
n
3
−
1
)
(n_1-1) + (n_2-1) + (n_3-1)
(n1−1)+(n2−1)+(n3−1)
所以至少有资源数 = ( 5 − 1 ) + ( 5 − 1 ) + ( 5 − 1 ) + 1 = 13 (5-1) + (5-1) + (5-1) + 1 = 13 (5−1)+(5−1)+(5−1)+1=13
(4)三个进程共享四个同类资源,这些资源的分配与释放只能一次一个。已知每一个进程最多需要两个该类资源,则该系统()
答案:必然无死锁
设进程数为n,每个进程需要的资源数为m,总资源数为s,当 s ≥ n × ( m − 1 ) s \geq n \times (m - 1) s≥n×(m−1),必不可能发生死锁。
(5)若系统有m个同类资源,被n个进程共享,分别在 m > n m > n m>n和 m ≤ n m \leq n m≤n时,每个进程最多可以请求多少个这类资源,从而使系统一定不会发生死锁?
- 当
m
>
n
m > n
m>n时:
设一个进程最多可以请求x个资源,所以当: m > n × ( x − 1 ) m > n \times (x - 1) m>n×(x−1) 时,系统不会发生死锁。即:
x < m / / n + 1 x < m // n + 1 x<m//n+1
- 当
m
≤
n
m \leq n
m≤n时:
每个进程最多可以请求1个这类资源。