操作系统学习记录(三)
2.4.1 死锁的概念
1.死锁:各个进程为了竞争资源而互相等待对方进程里的资源,进而所有进程都阻塞。至少有两个或以上的进程发生死锁,且处于阻塞态。
2.饥饿:长期得不到某种资源,可能只有一个进程发生饥饿,且处于就绪态或阻塞态。
3.死循环:进程因某些问题进入死循环,如逻辑问题。可能只有一个进程发生死循环,且可能处于运行态。
4.死锁条件:①只有互斥资源会导致死锁②互斥资源是不可主动剥夺的③存在资源的循环等待④进程在占用一定资源的同时,又主动申请新的资源被拒。
5.存在资源的循环等待时,不一定会发生死锁;发生死锁,一定会存在资源的循环等待。
6.对不可剥夺的资源分配不合理时,会导致死锁。比如生产消费者模型中,互斥信号量使用在同步信号量之前,这种PV操作导致死锁。
7.死锁的处理策略:预防死锁(打破四个条件);避免死锁(银行家算法);死锁的检查与解除(已经产生死锁)。
2.4.2 死锁处理策略之预防死锁
1.方法一:破坏互斥条件。比如,对于同一打印机资源,原本是同时只能由一台打印机同时占用,但是现在在打印机上开启管家进程,进程1和进程2把自己的打印需求交给打印机的管家进程就好了,进程1和进程2就可以继续去执行自己的事情。缺点是可执行性差,很多情况下互斥条件是故意设置的。
2.方法二:破坏不可剥夺条件
①因为某进程的优先级高,所以剥夺了其他进程正在占用的资源。②如果某进程尝试申请某种竞争资源失败,就立即放弃竞争。
缺点是反复读写资源系统开销变大、且容易造成进程饥饿。
3.方法三:破坏循环等待条件
在多个进程竞争某些资源的时候,就考虑竞争这些资源的顺序。缺点是编程复杂,进程对资源的使用顺序也会造成资源浪费。
4.方法四:破坏请求保持条件
运行前分配所有资源,进程在占用某资源之后就会一直占用。缺点是系统资源利用率低,可能会造成进程饥饿。
2.4.3避免死锁(银行家算法)
银行家算法:
①通过当前的分配方案计算剩余可分配资源情况;
②查看剩余可分配资源是否满足某一进程最大剩余需求,如果满足则进入第③步进行进一步分配,如果不满足则处于不安全序列,判定为可能会发生死锁,结束;
③将剩余可分配资源分配给上述进程,等待该进程释放资源,重新计算剩余可分配资源,如果所有进程均被满足最大剩余需求则结束,否则进入第②步。
2.4.4 死锁的检查与解除
1.死锁检查算法:首先判断不阻塞进程,然后消除其已请求到(保持中)和正在请求的资源,查看最后是否能完全将资源回退给系统。配合资源分配图查看。
2.死锁解除策略:
①直接将会发生死锁的某一进程剔除,挂到外存中;
②直接切断所有发生死锁的进程,简单粗暴但是会造成进程之前的执行被浪费;
③将发生死锁的某进程回退到之前某个状态,这个过程可以释放部分资源以缓解死锁的局面。一般来说通过进程的存在时间、优先级、资源占有率、进程是否直接与用户交互等判断回退哪个进程。