死锁预防
如果我们用一个站在四条腿上的桌子来模拟死锁,那么也可以用同时发生的四个条件来模拟四条腿,导致死锁。
但是,如果我们破坏桌子的一条腿,那么桌子肯定会掉下来。如果能够违反四种必要条件之一并且不让它们一起出现,那么就可以防止死锁,这同样发生在死锁上。
下面来看看如何防止每个条件的发生。
1.相互排斥
从资源的角度看,相互关联的部分是资源永远不能同时被多个进程使用,这是公平的,但这是造成死锁的主要原因。如果某个资源可能被多个进程同时使用,那么该进程将永远不会等待任何资源。
但是,如果我们能够违反以互斥方式行事的资源,那么可以防止死锁。
假脱机
对于像打印机这样的设备,后台打印可以工作。有一个与打印机相关的内存,它将每个进程的作业存储到内存中。打印机将收集所有作业并根据FCFS打印其中的每一个作业。通过使用这种机制,该过程不必等待打印机,它可以继续进行任何操作。它在生产时收集输出。
尽管假脱机可能是一种有效的方法来违反互斥,但它有两种问题。
- 这不能应用于每个资源。
- 在某个时间点之后,可能会在进程之间出现争用空间的竞争状态。
我们不能强制一个资源同时被多个进程使用,因为它不够公平,并且性能可能会出现一些严重问题。因此,我们不能在实践中违反互相排斥的过程。
2.保持并等待
当进程持有资源并等待其他资源完成其任务时,保持和等待状态就存在。会发生死锁,因为可能有多个进程持有一个资源并按循环顺序等待其他进程。
但是,我们必须找出某种机制,通过这种机制,流程既不拥有任何资源,也不等待。在执行开始之前必须为进程分配所有必要的资源。执行开始后,进程不得等待任何资源。
如果一个进程最初声明了所有的资源,这实际上可以实现。但是,这听起来非常实用,但不能在计算机系统中完成,因为流程最初不能确定必要的资源。
进程是由CPU执行的一组指令。每条指令可以多次请求多个资源。OS的需求无法修复。
该方法的问题是:
- 实际上不可能。
- 由于某些过程可能持续很长一段时间,资源匮乏的可能性将会增加。
4.循环等待
要违反循环等待,我们可以为每个资源分配一个优先级编号。进程无法请求更低优先级的资源。这确保了没有一个进程可以请求某个其他进程正在使用的资源,并且不会形成循环。
在所有的方法中,违反循环等待是实际可行的唯一方法。