文章目录
死锁
一、资源问题
1.可重用性资源和消耗性资源
(1)可重用性资源:可供用户重复使用多次的资源
性质:
每一个可重用资源中的单元只能分配给一个进程使用,不允许多个进程共享;
进程在使用可重用性资源时,需按照这样的顺序:请求->使用->释放;
系统中的每一类可重用资源中的单元数目是相对固定的,进程在运行期间即不能创建也不能删除它。
(2)可消耗性资源:在进程运行期间,由进程动态的消耗和创建
性质:
每一类可消耗资源的单元数目在进程运行期间是不断被变化的;
进程在运行过程中,可以不断地创造可消耗性资源的单元,将它们放入该类资源的缓冲区中,以增加该资源类的单元数目;
进程在运行过程中,可以请求若干个可消耗性资源单元,用于进程自己的消耗,不再将它们返回给该资源类中。
2.可抢占资源和不可抢占资源
(1)可抢占资源
可把系统中的资源分成两类,一类是可抢占资源,指某进程在获得这类资源后,该资源可以被其他进程或系统抢占。
CPU和主存均属于可抢占性资源。对于这类资源是不会引起死锁的。
(2)不可抢占资源
另一类是不可抢占资源,一旦系统把某资源分配给该进后,就不能将它强行收回,只能在进程用完后自行释放。
磁带机、打印机也都属于不可抢占性资源。
二、计算机系统中的死锁
1.竞争不可抢占性资源引起死锁
例如,系统中有两个进程P1,P2,它们都准备写两个文件F1,F2,这两者都属于可重用而不可抢占性资源。代码:
P1 | P2 |
---|---|
… | … |
Open(f1, w); | Open(f2, w); |
Open(f2, w); | Open(f1, w); |
当P1在打开F1的同时,P2去打开F2,每个进程都占有一个打开的文件,此时就会出现问题。因为当P1试图去打开F2,P2试图去打开F1时,这两个进程都会因文件已被打开而阻塞,谁也无法运行。