视频字幕
死锁是操作系统中的一个重要概念。当多个进程因竞争资源而造成相互等待的现象时,就会发生死锁。死锁的产生需要同时满足四个必要条件:互斥条件表示资源不能被多个进程同时使用;占有和等待条件表示进程在持有资源的同时还要申请其他资源;不可剥夺条件表示资源不能被强制回收;环路等待条件表示进程间形成循环等待链。图中展示了一个典型的死锁场景,进程P1占有资源R1并等待R2,进程P2占有R2并等待R1,形成了循环等待。
死锁预防是一种主动的死锁处理策略,其核心思想是通过破坏死锁产生的四个必要条件中的一个或多个来预防死锁的发生。与死锁避免、检测和恢复等被动方法不同,死锁预防具有主动性和预先性的特点。具体来说,我们可以通过四种方法来实现:破坏互斥条件可以通过资源共享实现;破坏占有和等待条件可以采用静态分配法;破坏不可剥夺条件可以实施强制资源回收;破坏环路等待条件可以使用有序资源分配法。每种方法都有其适用场景和局限性。
破坏互斥条件是死锁预防的第一种方法。互斥条件要求资源在同一时刻只能被一个进程使用。要破坏这个条件,我们需要让资源变为可共享的。对于本身就可以共享的资源,如只读文件和共享内存,多个进程可以同时访问而不会产生冲突。但是对于打印机、磁带机等物理设备,它们本质上是独占性的,不能同时被多个进程使用。为了解决这个问题,我们可以采用虚拟化技术,比如虚拟打印机和假脱机技术,将独占设备转换为可共享的虚拟资源。然而,这种方法的局限性在于很多资源本质上无法共享,因此适用范围有限。
破坏占有和等待条件是死锁预防的第二种方法。占有和等待条件是指进程在持有部分资源的同时,还要申请其他资源。要破坏这个条件,我们有两种主要方法。第一种是静态分配法,要求进程在开始执行前一次性申请所有需要的资源,要么全部获得后才能运行,要么全部等待。第二种是动态释放法,当进程需要申请新资源时,必须先释放已经占有的所有资源,然后再重新申请所需的全部资源。这两种方法都能有效防止死锁,但也带来了明显的缺点:资源利用率低,因为资源可能长时间闲置;可能导致进程饥饿,特别是需要多种资源的进程;系统整体吞吐量下降。
破坏不可剥夺条件是死锁预防的第三种方法。不可剥夺条件是指进程已获得的资源在使用完毕前不能被其他进程强行夺取。要破坏这个条件,我们需要实现强制资源回收机制。当一个进程申请资源被拒绝时,系统可以强制回收该进程已经占有的资源,然后将这些资源分配给其他进程。这种方法主要适用于状态容易保存和恢复的资源,比如CPU可以通过上下文切换保存进程状态,内存可以通过换出技术保存数据。但是对于打印机、磁带机等物理设备,由于它们的状态难以保存和恢复,因此不适合使用这种方法。实现资源抢占的关键在于状态保存与恢复机制,确保被抢占的进程能够在重新获得资源后继续正确执行。