死锁和进程通信

Posted kk_kk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了死锁和进程通信相关的知识,希望对你有一定的参考价值。

一、死锁

  1.死锁概念

 由于竞争资源或者通信关系,两个或更多线程在执行中出现永远相互等待只能由其他进程引发的事件的现象。  

  2.资源

    资源有很多种类型,包括CPU执行时间,内存空间,I/O设备等都被称作资源。其中每类资源有多个实例。进程访问资源有三步:请求/获取,使用/占用,释放。 

    资源分为两类:一类是可重用资源,如硬件的处理器,I/O通道,主和副存储器,设备等,以及软件中的文件,数据库,信号量等数据结构。另一类是消耗资源,如在I/O缓冲区的中断,信号,消息等。

        

 3.资源分配图

    进程和资源在图里用顶点(进程是圆,资源是矩形)表示,进程和资源的关系用有向边表示。进程请求资源则用进程指向资源,资源被进程占用则用资源指向进程。

    示例:

    

   

   

4.死锁的必要条件

  互斥:任何时刻只能有一个进程使用一个资源实例。

  持有并等待:进程保持至少一个资源,并正在等待其他进程持有的资源。

  非抢占:资源只能在进程使用后自愿释放。

  循环等待:存在等待进程集合,每一个都在等待另一个进程所占用的资源,构成一个环。

5.死锁处理方法

  

  1)死锁预防

   预防是采用某种策略,限制并发进程对资源的请求,使系统在任何时刻都不满足死锁的必要条件。针对每一个必要条件来进行死锁预防的方法:

     互斥:把互斥的共享资源封装成可同时访问。

     持有并等待:进程请求资源时,要求它不持有任何其他资源。仅允许进程在开始执行时,一次请求所有需要的资源。这种方法资源利用率较低。

     非抢占:如进程请求不能立即分配的资源,则释放已占有资源。只在能够同时获得所有需要资源时,才执行分配操作。

     循环等待:对资源排序,要求进程按顺序请求资源。

  2)死锁避免

       

    

  银行家算法:

  看当前剩下的资源数能否满足一个或多个进程,能满足的话就分配给其中的一个进程,然后该进程运行完之后,把之前占用的资源和刚刚分配给它的资源都返回给操作系统(银行家),操作系统再继续寻找下一个目前资源能满足其运行的进程,直到所有进程都执行完,或遇到当前找不到可运行的进程的状况,算法结束。

   

   

   

   

   示例:

   

   先T2,剩下的顺序随意,是安全状态。

   

   不是安全状态。

 3)死锁检测和恢复

   允许系统进入死锁状态,系统定期调用死锁检测算法来搜索系统的资源分配图中是否存在死锁,出现死锁时,则用死锁恢复机制进行恢复。

   死锁检测算法与银行家算法类似,只不过死锁检测里没有最大请求量这个判断。

   

   

   示例:

    

    先T0或T2,再T2或T0,剩下的随意。安全状态。

    

   非安全状态。

   

   

  

二、进程通信

  1.概念

   

  2.直接通信和间接通信

    

  

 

 

3.阻塞通信与非阻塞通信

   阻塞通信:

      阻塞发送:发送方在发送消息后进入等待,直到接受者成功收到。

      阻塞接收:接收者在请求接收消息后进入等待,直到成功收到一个消息。 

   非阻塞通信:

      非阻塞发送:发送方在消息发送后,可立即进行其他操作。

      非阻塞接收:没有消息发送时,接收者在请求接收消息后,接收不到任何消息。

4.通信链路缓冲

   0容量:发送方必须等待接收方。

   有限容量:通信链路缓冲队列满时,发送方必须等待。

   无限容量:发送方不需要等待。

5.信号

   

   

示例:按ctrl-C 进程继续运行,按ctrl-\\进程停止。

  

6.管道

 

  

 

7.消息队列

  

  

8.共享内存

  

  

  

   

   

 

以上是关于死锁和进程通信的主要内容,如果未能解决你的问题,请参考以下文章

为啥与多个 Popen 子进程一起使用时会出现通信死锁?

使用重定向 I/O 与子进程通信时出现死锁

进程互斥同步及通信死锁问题操作系统

SQL Server死锁问题:事务(进程 ID x)与另一个进程被死锁在 锁 | 通信缓冲区资源上并且已被选作死锁牺牲品。请重新运行该事务。

Python多进程,多线程和异步实例

Python多进程,多线程和异步实例