管程的相关概念以及死锁的产生的必要必要条件和处理策略

Posted bfhonor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了管程的相关概念以及死锁的产生的必要必要条件和处理策略相关的知识,希望对你有一定的参考价值。

一、管程

(一)为什么要引入管程?

(二)管程的定义和基本特征

  • 管程是一种特殊的软件模块,有这些部分组成:
    ①、局部于管程的共享数据结构说明;
    ②、对该数据结构进行操作的一组过程
    ③、对局部于管程的共享数据设置初始值的语句;
    ④、管程有一个名字。
  • Tips: “过程”其实就是“函数”。
  • 管程的基本特征:
    ①、局部于管程的数据只能被局部于管程的过程所访问;
    ②、一个进程只有通过调用管程内的过程才能进入管程访问共享数据;
    ③、每次仅允许一个进程在管程内执行某个内部过程。

(三)扩展1:用管程解决生产者消费者问题

  • 引入管程的目的无非就是要更方便地实现进程互斥和同步。
    ①、需要在管程中定义共享数据(如生产者消费者问题的缓冲区)
    ②、需要在管程中定义用于访问这些共享数据的“入口”——其实就是一些函数(如生产者消费者问题中,可以定义一个函数用于将产品放入缓冲区,再定义一个函数用于从缓冲区取出产品)
    ③、只有通过这些特定的“入口”才能访问共享数据
    ④、管程中有很多“入口”,但是每次只能开放其中一个“入口”,并且只能让一个进程或线程进入(如生产者消费者问题中,各进程需要互斥地访问共享缓冲区。管程的这种特性即可保证一个时间段内最多只会有一个进程在访问缓冲区。 注意:这种互斥特性是由编译器负责实现的,程序员不用关心
    ⑤、可在管程中设置条件变量等待/唤醒操作以解决同步问题。可以让一个进程或线程在条件变量上等待( 此时,该进程应先释放管程的使用权,也就是让出“入口” );可以通过唤醒操作将等待在条件变量上的进程或线程唤醒。
  • 程序员可以用某种特殊的语法定义一个管程(比如: monitor ProducerConsumer …… end monitor;),之后其他程序员就可以使用这个管程提供的特定“入口”很方便地使用实现进程同步/互斥了。【“封装”思想

(四)扩展2:Java中类似于管程的机制

  • Java 中,如果用关键字 synchronized 来描述一个函数,那么这个函数同一时间段内只能被一个线程调用.

二、死锁

(一)什么是死锁?

  • 哲学家进餐问题中,如果5位哲学家进程并发执行,都拿起了左手边的筷子…
  • 在并发环境下,各进程因竞争资源而造成的一种互相等待对方手里的资源,导致各进程都阻塞,都无法向前推进的现象,就是“死锁”
  • 发生死锁后若无外力干涉,这些进程都将无法向前推进。

(二)死锁、饥饿、死循环的区别

  • 死锁:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象。
  • 饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象。比如:在短进程优先(SPF)算法中,若有源源不断的短进程到来,则长进程将一直得不到处理机,从而发生长进程“饥饿”。
  • 死循环:某进程执行过程中一直跳不出某个循环的现象。有时是因为程序逻辑 bug 导致的,有时是程序员故意设计的。

(三)死锁产生的必要条件

  • 产生死锁必须同时满足一下四个条件,只要其中任一条件不成立,死锁就不会发生。
  • 互斥条件 :只有对必须互斥使用的资源的争抢才会导致死锁(如哲学家的筷子、打印机设备)。像内存、扬声器这样可以同时让多个进程使用的资源是不会导致死锁的(因为进程不用阻塞等待这种资源)。
  • 不剥夺条件 :进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。
  • 请求和保持条件 :进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放。
  • 循环等待条件 :存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求。
  • 注意!发生死锁时一定有循环等待,但是发生循环等待时未必死锁(循环等待是死锁的必要不充分条件)
  • 如果同类资源数大于1,则即使有循环等待,也未必发生死锁。但如果系统中每类资源都只有一个,那循环等待就是死锁的充分必要条件了。

(四)什么时候会发生死锁

  1. 对系统资源的竞争。各进程对不可剥夺的资源(如打印机)的竞争可能引起死锁,对可剥夺的资源(CPU)的竞争是不会引起死锁的。
  2. 进程推进顺序非法。请求和释放资源的顺序不当,也同样会导致死锁。例如,并发执行的进程P1、P2 分别申请并占有了资源 R1、R2,之后进程P1又紧接着申请资源R2,而进程P2又申请资源R1,两者会因为申请的资源被对方占有而阻塞,从而发生死锁。
  3. 信号量的使用不当也会造成死锁。如生产者-消费者问题中,如果实现互斥的P操作在实现同步的P操作之前,就有可能导致死锁。(可以把互斥信号量、同步信号量也看做是一种抽象的系统资源)
  • 总之,对不可剥夺资源的不合理分配,可能导致死锁。

(五)死锁的处理策略

  1. 预防死锁。破坏死锁产生的四个必要条件中的一个或几个。
  2. 避免死锁。用某种方法防止系统进入不安全状态,从而避免死锁(银行家算法)
  3. 死锁的检测和解除。允许死锁的发生,不过操作系统会负责检测出死锁的发生,然后采取某种措施解除死锁。

以上是关于管程的相关概念以及死锁的产生的必要必要条件和处理策略的主要内容,如果未能解决你的问题,请参考以下文章

管程死锁

王道操作系统OS进程管理

第二章管程死锁

Operating System:管程相关概念

模拟实现银行家调度算法

(王道408考研操作系统)第二章进程管理-第三节11:管程(Monitor)及条件变量