操作系统知识——互斥和死锁

银行家算法

银行家算法是最有代表性的避免死锁算法,是Dijkstra提出的。这是由于该算法能用于银行系统现金贷款的发放而得名。

我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。

  • 关于安全状态的概述

    系统处于安全状态时,一定不会发生死锁;系统处于不安全状态时,不一定会发生死锁;

    (1)安全状态
    如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。安全状态一定是没有死锁发生。

    (2)不安全状态
    不存在一个安全序列。不安全状态不一定导致死锁。

  • 基本思想

    银行家可以把一定数量的资金供多个用户周转使用,为保证资金的安全,银行家规定:

    • 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;
    • 顾客可以分期贷款,但贷款的总数不能超过最大需求量;
    • 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;
    • 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.

      银行家算法是通过动态地检测系统中资源分配情况和进程对资源的需求情况来决定如何分配资源的,在能确保系统处于安全状态时才能把资源分配给申请者,从而避免系统发生死锁。

  • 相关的变量

    • Available(可利用资源总数)
      某类可利用的资源数目,其初值是系统中所配置的该类全部可用资源数目。
      
    • Max:某个进程对某类资源的最大需求数
    • Allocation: 某类资源已分配给某进程的资源数。
    • Need:某个进程还需要的各类资源数。
      Need= Max-Allocation
      
  • 银行家算法描述

    设Request i是进程Pi的申请向量,如果Request i[j]=K,则表示进程Pi需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查:

    • 如果Request i[j]<=Need[i,j],便转向步骤2);否则认为出错,因为它所需要的资源数已经超过它所宣布的最大值。

    • 如果Request i[j]<=Available[i,j],便转向步骤3);否则,表示尚无足够资源,Pi需等待。

    • 系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值:

      1
      2
      3
      Available[j]:=Available[j]-Request i[j];
      Allocation[i,j]:=Allocation[i,j]+Request i[j];
      Need[i,j]:=Need[i,j]-Request i[j];

4) 系统执行安全性算法,检查此次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。

参考:银行家算法

死锁的概念

  死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

产生死锁的必要条件

  • 互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。

  • 请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。

  • 不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。

  • 循环等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。

针对死锁的解决方案

  1. 预防死锁

    这是一种较简单和直观的事先预防的方法。方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个,来预防发生死锁。预防死锁是一种较易实现的方法,已被广泛使用。但是由于所施加的限制条件往往太严格,可能会导致系统资源利用率和系统吞吐量降低。

    预防死锁方法(3种):

    • 破坏请求和保持条件,如资源静态分配法(也称为预分配资源)
    • 破坏不可抢占条件
    • 破坏循环等待条件
  1. 避免死锁

    该方法同样是属于事先预防的策略,但它并不须事先采取各种限制措施去破坏产生死锁的的四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。如银行家算法

  1. 检测死锁

    这种方法并不须事先采取任何限制性措施,也不必检查系统是否已经进入不安全区,此方法允许系统在运行过程中发生死锁。但可通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源,然后采取适当措施,从系统中将已发生的死锁清除掉。如资源分配图简化法

  1. 解除死锁

    这是与检测死锁相配套的一种措施。当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来。常用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。死锁的检测和解除措施,有可能使系统获得较好的资源利用率和吞吐量,但在实现上难度也最大。

    死锁的解除方法(2种):

    • 抢占资源,如剥夺资源法
    • 终止(或撤销)进程。

具体方案:

  1. 抢占式资源分配策略 :要使不可抢占其它进程占有的资源不成立,可以约定如下:如果一个进程已经占有了某些资源又要申请新资源,而新资源不能满足必须等待时,系统可以抢夺该进程已有的资源。 它只适合于主存和处理器。
  2. 释放已占资源策略——这种分配策略是仅当进程没有占有资源时才允许它去申请资源。如果进程已占用了某些资源而又要再申请资源,则它应先归还所占的资源后再申请新资源。
  3. 按序分配资源——要使循环等待条件不成立可采用按序分配的资源分配策略。具体做法是把系统中所有资源排序,对每个资源确定一个编号,规定任何一个进程申请两个以上的资源时,总是先申请编号最小的资源,再申请编号大的资源。
  4. 关于

链接:https://www.nowcoder.com/questionTerminal/b8ade2458fe94e59827f8adbf58efe2c
来源:牛客网

系统中的资源

  • 一类是可剥夺资源,即CPU 和 内存 ,是指某进程在获得这类资源后,该资源可以再被其他进程或系统剥夺。例如,优先权高的进程可以剥夺优先权低的进程的 处理机 。
  • 另一类资源是不可剥夺资源,如 磁带机 、打印机等,当系统把这类资源分配给某进程后,再不能强行收回,只能在进程用完后自行释放。

链接:https://www.nowcoder.com/questionTerminal/d7375249214648c6b3b12ce8184efea2
来源:牛客网

互斥

各进程采取互斥的方式,实现共享的资源称作临界资源。

信号量机制的引入解决了进程同步的描述问题,但信号量的大量同步操作分散在各个进程中不便于管理,还有可能导致系统死锁。如:生产者消费者问题中将P、V颠倒可能死锁。
为此Dijkstra于1971年提出:把所有进程对某一种临界资源的同步操作都集中起来,构成一个所谓的秘书进程。凡要访问该临界资源的进程,都需先报告秘书,由秘书来实现诸进程对同一临界资源的互斥使用。

链接:https://www.nowcoder.com/questionTerminal/401d52fe872a4473857f8b795ccc6783
来源:牛客网