一. 死锁
- 死锁概念
死锁是进程之间由于共享资源而造成无限期等待的情况。
判断死锁的四个条件:
一个资源在一个时刻只能给一个进程——互斥
一个进程至少有一个资源且等待其他进程占有的资源——持有并等待
资源只能在进程使用后自愿释放——非抢占
进程i等待进程i+1使用的资源——循环等待 - 死锁的处理方法
(1)死锁预防
(2)死锁避免
死锁避免:分配资源时判断是否会出现死锁,只有在不会死锁时分配资源。
安全状态:针对所有进程已占用的资源,找出进程的执行序列(安全序列),序列的执行保证已有的资源能满足进程序列执行到结束。如果可以找出,系统状态就是安全的,那你要求分配的资源就可以分配给你。
eg:当前占用资源的进程P1~Pn,对进程做排序,要求对任何一个进程,空闲资源(包括之前的进程占用的一些资源)可以满足这个进程的需求。一个进程执行完归还资源。后续的进程,如果当前可用的空闲资源不够,前边一些进程也占用的一些资源,这个进程就会等待前面的进程执行结束,之后就可以拿到所需资源执行了。找到这个排序系统就是安全的。
3. 银行家算法
银行家算法是一种死锁避免的方法。
need(i)线程i未来需要的资源总量是否小于我当前剩余的资源总量。
Work就是空闲资源(包括前面进程占用的后释放的)。
要使得当前的剩余资源可以满足某一个线程的未来需要,迭代到最后可以满足所有线程就找到了一个安全序列。
初始状态,第一行对应每个线程总需要资源量MAX,每个线程已经分配的资源量Allocate,每个线程未来需要资源量Need。第二行是系统剩余资源量Available(包括前面进程运行完释放的资源)。依次寻找有没有线程need<Available,找到之后分配资源执行线程释放资源,Available更新。
4. 死锁检测
Allocation大于0代表当前线程还在占用资源
request当前进程还在请求资源
二. 进程通信
- 概述
(1) 通信方式
直接通信是在两个进程之间直接建立一个通讯信道,发方从共享信道中发送数据,收方从共享信道中读出数据。
进程间间接通信依赖操作系统内核,首先通讯进程和内核之间建立相应的机构(如消息队列),操作系统中维护多个消息队列,之后一个进程把信息发送到内核的消息队列上,另一个进程从内核的消息队列中读出信息。
发方不关心收方是谁,只关心消息队列
(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)共享内存
示意图如下,两个进程的逻辑地址空间不同,依靠进程的页表项映射到同一块物理内存区域,一个进程往里写另一个进程可以往里读。这种方式不提供同步(没协调不同进程对共享内存的访问)
来源:CSDN
作者:润尼咔咔
链接:https://blog.csdn.net/weixin_43864534/article/details/104249683