一、死锁的概念
什么是死锁?
死锁、饥饿、死循环的区别:
死锁发生的必要条件:
什么时候会发生死锁?
死锁的处理策略:
总结:
二、死锁的处理策略—预防死锁
破坏互斥条件:
采用SPOOLing技术之后,各个进程对打印机发出的请求会首先被输出进程接收,同样的进程2也想输出的话也会被输出进程直接接收,当他们的请求被接收并且响应之后,这些进程就可以顺利的往下执行别的事情,之后输出进程会根据各个进程的请求把它依次放到打印机上打印输出,所以采用了SPOOLing技术之后,虽然打印机是一种必须互斥使用的独占设备,但是进程1和进程2即便是同时想要使用打印机的话,他们的请求也可以被及时的接收,输出进程暂时的保管,之后再慢慢的输出,所以从逻辑上看,对于这些进程来说,在他们看来他们使用的并不是一个独占设备,而是一个共享设备。
破坏不剥夺条件:
破坏请求和保持条件:
可能导致饥饿问题:
A类进程需要资源1,B类进程需要资源2,而C类进程需要资源1和资源2,假如有A类、B类进程源源不断到达的话,那么资源1就被立即被分配给下一个A类进程,资源2就被立即被分配给下一个B类进程,而除非资源1和资源2都没有进程使用的时候,他们才有可能同时被分配给一个C类进程,此时C类进程才有可能投入运行,所以很显然这种方式有可能导致C类进程饥饿的。
破坏循环等待条件:
进程实际使用资源的顺序可能和编号递增顺序不一致,会导致资源的浪费。
比如说P3进程需要使用五号资源打印机和七号资源扫描仪,但是实际的使用过程中,P3进程需要先使用扫描仪,再使用打印机,但是由于编号递增的这种要求,P3进程又必须申请先占有他暂时用不到的资源——打印机,之后打印机会空闲很长一段时间,一直到扫描仪使用完成后,回头再使用打印机这种资源,所以这就导致了打印机的长时间空闲,因此就导致了系统资源的浪费。
总结:
三、死锁的处理策略—避免死锁
什么是安全序列?
安全序列、不安全状态、死锁的联系:
银行家算法:
手算可以更快一点:
找不到安全序列的例子:
总结:
四、死锁的处理策略—检测和解除
死锁的检测:
现在P1只需要一个R2资源,而R2资源刚好剩余1个,所以可以满足P1的需求,待P1执行完成后,所有的资源进行释放,此时可以满足P2的需求。
P1执行完释放了所有资源,此时P2只需要一个资源,而R1还剩两个资源也可以满足。待P2执行完成后,也会归还所有的资源。
所以分析,这两个进程都可以顺利的执行结束。
不能消除所有边的情况:
蓝色边为请求,而绿色边为已经分配出去的资源。
可以看出P1资源被阻塞,而P2资源也被阻塞,此时只有P3进程可以执行,执行完成后,归还所有资源。
R2资源有一个空闲的,但是P1进程需要2个R2资源,所以此时R2资源的数量依然不够满足P1的要求,所以P1依然会被阻塞,P2进程也一样,此时没有空闲的R1,所以P2资源也会一直被阻塞。到这一步为止,就不能继续化简下去了,所以这种情况就是不能消除所有边的情况,这种情况下系统就发生了死锁。
既不阻塞也不孤点:P2进程申请的R1资源没有可以分配的空间,所以P2阻塞;P1不阻塞,R2可以分配给P1一个资源;不是孤点,指的是与这个进程至少有一个边相连,P1和P2显然都不是孤点,所以在这个状态下满足下满足既不阻塞,又不孤点的进程只有P1,接下来消除所有的请求边和分配边,使其称为孤立的点。
此时P2进程也成为了既不孤立也不阻塞的情况,也可以把它所连接的边去掉。
死锁的解除:
进程已经使用了多少资源:如果一个进程拥有的资源的多,可以把这个进程先干掉,把资源放出来供其他使用。
进程交互式还是批处理式,交互式的就意味着这些进程是在和用户交互的,如果把交互的进程干掉的话,用户是不满意的;而对于批处理式的进程来说,无非是做一些计算,用户对于这种进程的及时反馈并不是太在意,所以可以优先牺牲批处理式的进程。
总结:
总结
本节学习关于死锁的概念、死锁的处理策略,包括预防死锁、避免死锁、死锁的检测和解除。