死锁和进程通信

独自空忆成欢 提交于 2020-02-12 04:26:23

一. 死锁

  1. 死锁概念
    在这里插入图片描述
    在这里插入图片描述
    死锁是进程之间由于共享资源而造成无限期等待的情况。
    在这里插入图片描述
    在这里插入图片描述
    判断死锁的四个条件:
    一个资源在一个时刻只能给一个进程——互斥
    一个进程至少有一个资源且等待其他进程占有的资源——持有并等待
    资源只能在进程使用后自愿释放——非抢占
    进程i等待进程i+1使用的资源——循环等待
    在这里插入图片描述
  2. 死锁的处理方法
    在这里插入图片描述
    (1)死锁预防
    在这里插入图片描述
    在这里插入图片描述
    (2)死锁避免
    死锁避免:分配资源时判断是否会出现死锁,只有在不会死锁时分配资源。
    在这里插入图片描述

安全状态:针对所有进程已占用的资源,找出进程的执行序列(安全序列),序列的执行保证已有的资源能满足进程序列执行到结束。如果可以找出,系统状态就是安全的,那你要求分配的资源就可以分配给你。
eg:当前占用资源的进程P1~Pn,对进程做排序,要求对任何一个进程,空闲资源(包括之前的进程占用的一些资源)可以满足这个进程的需求。一个进程执行完归还资源。后续的进程,如果当前可用的空闲资源不够,前边一些进程也占用的一些资源,这个进程就会等待前面的进程执行结束,之后就可以拿到所需资源执行了。找到这个排序系统就是安全的。
在这里插入图片描述
3. 银行家算法
银行家算法是一种死锁避免的方法。
在这里插入图片描述
need(i)线程i未来需要的资源总量是否小于我当前剩余的资源总量。
Work就是空闲资源(包括前面进程占用的后释放的)。
要使得当前的剩余资源可以满足某一个线程的未来需要,迭代到最后可以满足所有线程就找到了一个安全序列。
在这里插入图片描述
初始状态,第一行对应每个线程总需要资源量MAX,每个线程已经分配的资源量Allocate,每个线程未来需要资源量Need。第二行是系统剩余资源量Available(包括前面进程运行完释放的资源)。依次寻找有没有线程need<Available,找到之后分配资源执行线程释放资源,Available更新。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4. 死锁检测
在这里插入图片描述
在这里插入图片描述
Allocation大于0代表当前线程还在占用资源
request当前进程还在请求资源
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
二. 进程通信

  1. 概述
    在这里插入图片描述
    (1) 通信方式
    在这里插入图片描述
    直接通信是在两个进程之间直接建立一个通讯信道,发方从共享信道中发送数据,收方从共享信道中读出数据。
    在这里插入图片描述
    进程间间接通信依赖操作系统内核,首先通讯进程和内核之间建立相应的机构(如消息队列),操作系统中维护多个消息队列,之后一个进程把信息发送到内核的消息队列上,另一个进程从内核的消息队列中读出信息。
    在这里插入图片描述
    在这里插入图片描述
    发方不关心收方是谁,只关心消息队列
    (2) 阻塞与非阻塞通信
    在这里插入图片描述
    阻塞接收:接收方在请求接收消息之后进入等待,直到成功收到消息。
    在这里插入图片描述
    非阻塞接收:没有消息发送时,接收方在请求接收消息之后,收不到消息。
    在这里插入图片描述
  2. 进程通讯机制的具体实现
    信号和管道是操作系统提供的两种通讯机制。
    (1)信号
    信号及信号的处理机制有以下几种情况。
    在这里插入图片描述
    进程在启动时注册(信号,信号处理例程)给操作系统内核,以便当有信号送过来时操作系统知道去执行哪个信号处理函数。其他进程或设备发出信号时,操作系统内核把信号分给指定进程,启动其中信号处理函数。执行信号处理函数完成相应处理,如把当前进程暂停、杀掉。
    在这里插入图片描述
    在这里插入图片描述
    (2)管道
    两个进程想通讯,就在内存里建立临时文件把数据放进里面。
    在这里插入图片描述
    在这里插入图片描述
    创建完管道之后有一个文件描述符数组,数组中有读文件描述符和写文件描述符。可以利用文件描述符来读写数据。
    示例通过管道把两个命令ls和more的输出输入接到一起。
    在这里插入图片描述
    (3)消息队列
    不同进程可以往操作系统的消息队列里发送消息,另外进程从消息队列里读消息。每个消息队列有一个标识。
    在这里插入图片描述
    首先依据标识创建消息队列,然后可以收发消息。
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200211135012928.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzg2NDUz删除线格式 NA==,size_16,color_FFFFFF,t_70)
    (4)共享内存
    在这里插入图片描述
    示意图如下,两个进程的逻辑地址空间不同,依靠进程的页表项映射到同一块物理内存区域,一个进程往里写另一个进程可以往里读。这种方式不提供同步(没协调不同进程对共享内存的访问)
    在这里插入图片描述
    在这里插入图片描述
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!