死锁现象的出现
如果在缓存区已满的情况下,生产者进程想要继续往缓存区放入item,生产者会首先进行p(mutex)并成功地获得了互斥信息量mutex ;接下来生产者在要获得empty信号(即执行P(empty))时发现缓存区已满,从而停下来等待,当消费者进程执行P(mutex)时发现这个互斥信号量仍然被生产者进程占有而没有释放,当然消费者进程只能等待,等待生产正执行Item放入缓存区释放mutex。
死锁出现地条件
死锁发生地四个基本条件:
(1)互斥:资源不能被共享,一个资源只能被一个进程使用。
(2)不可剥夺:进程已获得地资源,在未使用完之前,不能强行剥夺。
(3)请求与保持:一个进程因请求资源而阻塞时,对已获得的资源保持不妨。
(4)循环等待:若干进程之间形成一种首尾详解的循环性资源等待关系
银行家
和银行贷款问题进行类比:
(1)银行时操作系统,资金就是资源,客户相当于要申请资源的进程
(2)客户能最终偿还带宽需要银行满足客户的全部贷款请求,相当于操作系统满足进程的所有资源请求,即让进程执行完成,不造成死锁;
(3)银行判断贷款请求是否应该被批准相当于对操作系统盘对进程资源是否可以被允许,英航没有损失相当于没有死锁;
(4)操作系统判断这个资源请求是否安全的算法就是银行家判断此次贷款是否安全的算法
int available[1..m]//每种资源剩余数量
int Allocation[1..n,1..m]//已分配资源数量
int Max[1..n,1..m]//进程总共需要的资源数量
int work[1..m]//工作量
bool Finish[1..n]//进程是否结束
work = available
Finish[1..n]=false
while(true)
{
find = false;
for(i=1; i<=n;i++)
{
if(Finish[i] == false && work +Allocation[i] >= Max[i])
{
Finish[i] = true;
Work = work + Allocation[i]
find = true;
}
}
if (find == false){goto END;}
}