deadlocks(死锁)

DeadLocks

死锁的特征

哲学家用餐死锁问题

  • 当所有人同时拿到一侧的筷子时,发生永远等待现象 (即死锁)。
  • 有若种办法可避免死锁:
    • 至多允许四个哲学家同时吃;
    • 奇数号先取左手边的筷子,偶数号先取右手边的筷子;
    • 每个哲学家取到手边的两根筷子才吃,否则一根也不取。
  • 进程访问资源流程:申请 ➠ 使用 ➠ 释放

define

  • In a multiprogramming environment, several(若干) processes may compete for a finite(有限) number of resources.
  • A process requests(请求) resources; if the resources are not available(可用的) at that time, the process enters a waiting state.
  • Sometimes, a waiting process is never again able to change state, because the resources it has requested are held(占有) by other waiting processes.
  • This situation is called a deadlock

死锁与饥饿

  • 饥饿:进程长时间的等待
    • e.g.低优先级进程总是等待高优先级所占有的进程
  • 死锁:循环等待资源

产生死锁的四个必要条件

  • 互斥使用: 一个时刻,一个资源仅能被一个进程占有
  • 不可剥夺: 除了资源占有进程主动释放资源,其它进程都不可抢夺其资源
  • 占有和等待 :一个进程请求资源得不到满足等待时,不释放已占有资源
  • 循环等待(上面三个条件同时存在产生的结果): 每一个进程分别等待它前一个进程所占有的资源

死锁的解决方案

  • 死锁的防止 (Prevention)
    • 破坏四个必要条件之一
  • 死锁的避免 (Avoidance)
    • 允许四个必要条件同时存在,在并发进程中做出妥善安 排避免死锁的发生,使用安全算法
  • 死锁的检测和恢复 (Detection & Recovery)
    • 允许死锁的发生,系统及时地检测死锁并解除它

死锁的防止

  • 互斥使用:破坏这个意味者,要使资源共享使用,不是所有的资源都是可以共享使用的,如打印机同时只允许一个人使用,故:这明显是不可行的
  • 不可剥夺:破坏这个条件意味着,资源可以被抢夺,我们只知道CPU可以被抢夺,若共享资源是打印机呢,抢夺打印机明显是不可行的,故:不可行
  • 占有和等待:破坏这个条件意味这,一次性拿到进程所需的所有资源,若A进程需要disk CPU 打印机 , 当A进程要执行时,他的全部资源就已经被获取了,但是导致了资源的严重浪费,因为A进程可能要在执行的最后才使用打印机,但是A在执行的开始就已经将其占用了,这造成了资源浪费,这是可以的但是效果不太好
  • 循环等待:
    破坏这个条件可以的方法:由程序员自行为资源排序可以将其抽象成一个数组,将资源以一定顺序放入数组中(一般按照优先级顺序)R = {R1,R2,R3,R4},当要申请一个资源时必须使得全部资源都满足才可申请(当要申请R3时,R1 ,R2资源均要获取),这样解决了循环等待问题,但是这样也存在资源的浪费(当申请R3时,R1与R2可能并不是必要的)而且可操作性差,故可行但是效果不好

死锁的避免

安全状态

  • A state is safe if the system can allocate resources to each process (up to its maximum) in some order and still avoid a deadlock. More formally(正式的), a system is in a safe state only if there exists a safe sequence(序列).
  • If no such sequence exists, then the system state is said to be unsafe.
  • A safe state is NOT a deadlocked state.
  • An unsafe state MAY lead to a deadlock.

死锁的避免

  • 系统对进程的每一次资源申请都进行详细的计算, 根据结果决定是分配资源还是让其等待,确保系统 始终处于安全状态,避免死锁的发生。
  • 银行家算法(Banker’s algorithm)
    • 已知系统中所有资源的种类和数量
    • 已知进程所需要的各类资源最大需求量
    • 该算法可以计算出当前的系统状态是否安全(寻找安全序列)

存在安全序列{ P1,P3,P4,P2,P0 },系统处于安全状态。

银行家算法就是寻找一个安全分资源的序列使得,避免死锁的发生

  • 优点:允许死锁必要条件同时存在
  • 缺点:缺乏实用价值
    • 进程运行前就要求知道其所需资源的最大数量
    • 要求进程是无关(独立)的,因为分配资源的安全顺序是固定的,若考虑同步情况,可能会打乱安全序列
    • 要求进入系统的进程个数和资源数固定(这不太现实)

死锁检测

死锁的检测与恢复

  • 允许死锁发生,操作系统不断监视系统进展情况, 判断死锁是否发生
  • 一旦死锁发生则采取专门的措施,解除死锁并以最 小的代价恢复操作系统运行
  • 死锁检测的时机
    • 当很多进程等待时检测死锁(系统开销大,资源被分配却没有归还)
    • 定时检测
    • 系统资源利用率下降时检测死锁

资源分配图

方框表示一类资源,里面的黑点表示该类资源的个数
原型表示进程
由进程指向资源表示进程申请资源
由资源指向进程表示系统分配资源给欸进程

资源分配图示例:

死锁发生在申请边

图一:p1申请R1将会等待,P2申请R2将会等待,P3没有申请资源。故P3将会执行完会归还资源R2 R4,这样P2就可执行,P2执行完归还R1,P1即可正常运行

图二:P1申请R1将等待,P2申请R2将等待,P3申请R3将等待,3个进程无一可以执行故死锁

图三:P1申请R1将等待,P2不申请资源,P3申请R2,P2完成后归还R1,P4完成后归还R2,可以正常运行

死锁的解除(recovery)

  • 中止进程,强制回收资源(如我们的windows中,一个进程可能会弹出对话框说进程长时间无响应,询问是否等待还是结束进程,这可能是改进程发生了死锁现象,这里使用可能是因为操作系统只检测了进程在等待队列的时长)
  • 剥夺资源,但不中止进程
  • 进程回退(roll back)
  • 重新启动

参考:https://www.bilibili.com/video/BV1bf4y147PZ

光看视频而不看书是远远不够的,但是由于考试在及,没有过多的时间,暑假立flag:

  • 让自己擅长汇编语言
  • 操作系统真象还原