写在前面:
- 本系列笔记主要以《计算机操作系统(汤小丹…)》为参考,大部分内容出于此书,笔者的工作主要是挑其重点展示,另外配合下方视频链接的教程展开思路,在笔记中一些比较难懂的地方加以自己的一点点理解(重点基本都会有标注,没有任何标注的难懂文字应该是笔者因为强迫症而加进来的,可选择性地忽略)。
- 视频链接:操作系统(汤小丹等第四版)_哔哩哔哩_bilibili
一、资源问题
1、可重用性资源和可消耗性资源
(1)可重用性资源:一种可供用户重复使用多次的资源。
①每一个可重用性资源中的单元只能分配给一个进程使用,不允许多个进程共享。
②进程在使用可重用性资源时,须按照这样的顺序:
[1]请求资源,如果请求资源失败,请求进程将会被阻塞或循环等待。
[2]使用资源,进程对资源进行操作,如用打印机进行打印。
[3]释放资源,当进程使用完后自己释放资源。
③系统中每一类可重用性资源中的单元数目是相对固定的,进程在运行期间既不能创建也不能删除它。
④对资源的请求和释放通常都是利用系统调用来实现的。
[1]对于设备,一般用request/release。
[2]对于文件,可用open/close。
[3]对于需要互斥访问的资源,进程可以用信号量的wait/signal操作来完成。
(2)可消耗性资源:又称为临时性资源,它是在进程运行期间,由进程动态地创建和消耗的。
①每一类可消耗性资源的单元数目在进程运行期间是可以不断变化的,有时它可以有许多,有时可能为0。
②进程在运行过程中可以不断地创造可消耗性资源的单元,将它们放入该资源类的缓冲区中,以增加该资源类的单元数目。
③进程在运行过程中,可以请求若干个可消耗性资源单元,用于进程自己的消耗,不再将它们返回给该资源类中。
④可消耗性资源通常是由生产者进程创建,由消费者进程消耗,最典型的可消耗性资源就是用于进程间通信的消息等。
2、可抢占性资源和不可抢占性资源
(1)可抢占性资源,是指某进程在获得这类资源后,该资源可以再被其它进程或系统抢占。例如优先级高的进程可以抢占优先级低的进程的处理机,又如可把一个进程从一个存储区转移到另一个存储区,在内存紧张时,还可将一个进程从内存调出到外存上,即抢占该进程在内存的空间。可见,CPU和主存均属于可抢占性资源,对于这类资源的抢占是不会引起死锁的。
(2)不可抢占性资源,即一旦系统把某资源分配给该进程后,就不能将它强行收回,只能在进程用完后自行释放。例如,当一个进程已开始刻录光盘时,如果突然将刻录机分配给另一个进程,其结果必然会损坏正在刻录的光盘,因此只能等刻好光盘后由进程自己释放刻录机。另外,磁带机、打印机等也都属于不可抢占性资源。
二、计算机系统中的死锁
1、死锁的定义
(1)死锁(Deadlock)是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种状态时,若无外力作用,它们都将无法再向前推进。
(2)死锁的起因通常是源于多个进程对资源的争夺,不仅对不可抢占资源进行争夺时会引起死锁,而且对可消耗资源进行争夺时,也会引起死锁。
2、竞争不可抢占性资源引起死锁
通常系统中所拥有的不可抢占性资源其数量不足以满足多个进程运行的需要,使得进程在运行过程中,会因争夺资源而陷入僵局。
3、竞争可消耗资源引起死锁
4、进程推进顺序不当引起死锁
进程在运行过程中,对资源进程申请和释放的顺序是否合法,也是在系统中是否会产生死锁的一个重要因素。
三、死锁的必要条件和处理方法
1、产生死锁的必要条件
(1)互斥条件。进程对所分配到的资源进行排它性使用,即在一段时间内,某资源只能被一个进程占用,如果此时还有其它进程请求该资源,则请求进程只能等待,直至占有该资源的进程用毕释放。
(2)请求和保持条件。进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
(3)不可抢占条件。进程已获得的资源在未使用完之前不能被抢占,只能在进程使用完时由自己释放。
(4)循环等待条件。在发生死锁时,必然存在一个进程一资源的循环链,比如一个进程集合中的正在等待一个
占用的资源,
正在等待
占用的资源,
正在等待
占用的资源。
2、处理死锁的方法
(1)预防死锁。这是一种较简单和直观的事先预防方法,该方法是通过设置某些限制条件,去破坏产生死锁四个必要条件中的一个或几个来预防产生死锁。预防死锁是一种较易实现的方法,已被广泛使用,但由于所施加的限制条件往往太严格,可能会导致系统资源利用率和系统吞吐量降低。
(2)避免死锁。同样是属于事先预防策略,但它并不是事先采取各种限制措施去破坏产生死锁的四个必要条件,而是在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而可以避免发生死锁。这种方法只须事先加以较弱的限制条件,便可获得较高的资源利用率及系统吞吐量,但在实现上有一定的难度。
(3)检测死锁。这种方法无须事先采取任何限制性措施,允许进程在运行过程中发生死锁,但可通过检测机构及时地检测出死锁的发生,然后采取适当的措施把进程从死锁中解脱出来。
(4)解除死锁。当检测到系统中已发生死锁时,就采取相应措施,将进程从死锁状态中解脱出来,常用的方法是撤消一些进程,回收它们的资源,将它们分配给已处于阻塞态的进程,使其能继续运行。死锁的检测与解除措施有可能使系统获得较好的资源利用率和吞吐量,但在实现上难度也最大。