答:死锁是指一组进程中的每一个进程,均无限期地等待此组进程中某个其它进程占有的,因而永远无法得到的资源
死锁产生的必要条件:
①互斥条件:一个资源在同一时刻只能分配给一个进程。
②请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有。
③不可抢占条件:进程已获得的资源,在未使用完之前不能被抢占,只能在进程使用完时由自己释放。
④循环等待条件:叫环路等待条件,存在一个循环等待链,其中,每一个进程分别等待它前一个进程所持有的资源,造成永远等待
答:①摈弃“请求和保持”条件,就是如果系统有足够资源,便一次性把进程需要的所有资源分配给它;
②摈弃“不剥夺”条件,就是已经拥有资源的进程,当它提出新资源请求而不能立即满足时, 必须释放它已保持的所有资源,待以后需要时再重新申请;
③摈弃“环路等待”条件,就是将所有资源按类型排序标号,所有进程对资源的请求必须严格按序号递增的次序提出
能;系统按银行家算法检查:
Request0(0,1,0) <= Need0(7,4,3);
Request0(0,1,0) <= Available(2,3,0)
暂时先假定可为P0分配资源:
进行安全性检查:
故存在一个安全序列{p1,p3,p0,p2,p4},故系统是安全的,可以分配
(1)
跟据银行家算法,存在安全序列
(2)
Request(1,2,2,2) <= Need
Request(1,2,2,2) <= Avaiable
假设将资源分配给P2
根据银行家算法,不存在一条安全队列,故系统不能分配资源给P2
设每个进程分配n - 1个资源不会发生死锁
则有:(n – 1) * 5 + 1 > 6
解得n > 2
则当n <= 2时,系统不会发送死锁
不会发生死锁?
设系统总资源数为 n
则有 6 * 8 + 1 > n
解得n = 49 个
k满足什么条件,系统就不会发生死锁?
设每个进程最多分配k个资源
如果每个进程分配k- 1个资源时,刚好分配完
此时,再分配一个资源,则会发生死锁
如果每个进程分配k- 1个资源时,还有一个资源
此时,如果再分配一个资源,则不会发生死锁
故有 n(k– 1) + 1> m
化简得 nk > m – 1 + n
nk > m + n
答:安全状态是指系统中存在一种执行路径,使可用的系统资源能满足所有进程的资源请求,从而顺利结束。
安全序列指的是使可用的系统资源能满足所有进程资源请求要求的一个进程序列。
资源情况 claim allocation need available
进程 R1R2R3 R1R2R3 R1R2R3 R1R2R3
P1 3 2 2 1 0 0 2 2 2 1 1 2
P2 6 1 3 5 1 1 1 0 2
P3 3 1 4 2 1 1 1 0 3
P4 4 2 2 0 0 2 4 2 0
试问:(1)t0时刻系统是否安全?
存在一个安全序列{P2,P1,P3,P4}故t0时刻系统安全
(2)P2发出请求向量request2(1,0,1),系统能否将资源分配给它?
假设系统相应了request2(1,0,1)后,资源分配如下:
进行安全性检查,可用资源Available(0,1,0)已不能满足任何进程的需要,故系统进入不安全状态,此时系统不能分配资源。
(3)在P2申请资源后,若P1发出请求向量request1(1,0,1),系统能否将资源分配给它?
在P2申请资源后
①request1(1,0,1)<=need(2,2,2);
②request1(1,0,1)>available(0,1,1);
让P2等待,系统不会将资源分配给它。
设每个进程最多分配x个资源
如果每个进程分配x- 1个资源时,刚好分配完
此时,再分配一个资源,则会发生死锁
如果每个进程分配x- 1个资源时,还有一个资源
此时,如果再分配一个资源,则不会发生死锁
故有 n(x – 1) + 1> m
化简得 nx > m – 1 + n
固有nx > m + n
所有当n个进程最多需要的资源数之和小于(m+n) 时,该系统不会发生死锁
a.在这个例子中说明死锁产生的四个必要条件
互斥:每个转角只能通过一辆车。
占有并等待:当一辆车进入了路口,需要等待前面的车通行
非抢占:车辆占用了路口后,其他车子只能等待该车离开
循环等待:下方的车辆等待右边的车辆通过,右边的车辆等待上方的车辆通过,上方的车辆等待左方的车辆通过,左边的车量等待下方的车辆通过。
b.设置一个简单的规则去避免该情况的发生
Semaphore mutex = 1;
北方居民上桥()
{
Wait(mutex);
过桥;
Signal(mutex);
}
南方居民上桥()
{
Wait(mutex);
过桥;
Signal(mutex);
}
锁,用伪代码设计一个防止死锁的算法。首先,不要是关于饥饿的算法(北方农民阻止南方农民使用桥的情况,反之亦然)。
Semaphore mutex = 1;
北方居民上桥()
{
Wait(mutex);
过桥;
Signal(mutex);
}
南方居民上桥()
{
Wait(mutex);
过桥;
Signal(mutex);
}