死锁和进程通信


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

资源分类:

(1)可重用资源Reusable Resource:资源不能被删除任何时刻只能有一个进程使用;进程释放之后,其他进程可重用;可能出现死锁(I/O等)。

(2)消费资源 Consumable resource:资源创建和销毁,中断、信号等,可能出现死锁。

出现死锁四个条件

(1)互斥:任何时候只有一个进程使用一个资源实例(资源互斥)

(2)持有并等待:进程至少有一个资源,并在等待其他资源使用的资源

(3)非抢占:资源只能在进程使用后资源释放

(4)循环等待:

死锁处理方法:有应用进程处理(操作系统忽略)

死锁预防Deadlock Prevention:确保系统永远不会进入死锁状态;

死锁避免Deadlock Avoidance:使用前判断,只允许不会死锁的进程请求资源;

死锁检测和恢复DeadlockDetection&Recovery:检测到运行系统进入死锁后恢复;

(1)死锁预防Deadlock Prevention:限制申请方式,使系统在任何时刻都不满足死锁的四个条件:互斥(把互斥共享资源封装成可同时访问);持有并等待(进程请求资源时,当前不能持有其他资源);非抢占(要申请就一次申请完,否则释放已到手的资源);循环等待(按顺序请求资源)。

(2)死锁避免Deadlock Avoidance:利用额外的先验信息,判断是否会出现死锁。

要求进程声明资源所需最大数目;动态判断。系统分配安全状态:


(2.1)银行家算法Banker’s Algorithm(死锁避免算法)

                                           银行家算法——数据结构

银行家算法——安全状态判断(最后所有的线程全部变为true)

银行家算法具体实现


银行家算法的安全状态判断实例


判断过程,首先计算出当前资源请求矩阵C-A;对于T2而言资源够用于是回收分配给进程T2的资源,可用资源变成6,2,3;之后满足T1,T3的全部,所以回收T1,T3全部资源,可用资源变成9,3,4,;最后肯定满足,状态是安全的。

(3)死锁检测:允许系统进入死锁状态,定期调用四座检测算法来搜索图中是否存在死锁;出现死锁时,用死锁恢复机制进行恢复。

                                 死锁检测数据结构

 

                                                                 死锁检测算法O(m*n*n)


                                                                不存在死锁

                                                                     资源不足,出现死锁。

死锁恢复:进程终止(终止所有的死锁进程,一次值终止一个进程直到死锁消除,终止进程的顺序:优先级、已运行时间仍需要的、已占用资源仍需要的、终止批处理交互的继续进行)

死锁恢复:资源抢占(选择最小成本、进程回退,可能会出现饥饿)

 

进程通信IPC,Inter-Process Communication,是进程之间进行信息交流和同步的机制。发送操作send,接收操作receive。流程:建立链路、收发交换信息。进程链路特征:物理(内存,硬件),逻辑。


直接通信send(P,message)—发型信息到进程p;receive(Q,message)-从进程Q接收消息:自动建立链路、恰好有且只有一条,单向双向都可以。

间接通信,通过操作系统维护的消息队列实现进程间的消息接收和发送。每个消息队列有唯一的标识,只有共享了相同的消息队列,才能够通信:只有共享消息队列才能建立链路,可以单向或双向,可以多对多。流程是:创建一个新消息队列,通过消息队列接收和发送消息,销毁消息队列。

阻塞(同步)和非阻塞(异步)通信:

阻塞通信(必须成功):阻塞发送(发送消息后进入等待直到接收者收到)、阻塞接收(接收者请求接收消息后等待,直到成功收到一条消息)。

非阻塞通信:非阻塞发送(发送消息后可以干别的),非阻塞接收(请求后干别的)

通信链路缓冲:0容量(发送方必须等待接收方),有限容量(通信链路满的时候等待),无限容量(发送大不需要等待)。

 

(1)信号signal:进程间的软件中断通知和处理机制(捕获catch,忽略Ignore,屏蔽Mask)。


(2)管道pipe:进程间基于内存文件的通信机制(间接)。

读管道read,scanf();写管道write,printf();创建管道pipe(rgfd)


(3)消息队列:是由操作系统维护的以字节序列为基本单位的间接通信机制。相同标识的消息组成按先进先出顺序组成一个消息队列Message Queues。

Msgget(获取消息队列标识),msgsnd(发送消息),msgrcv(接收消息),msgctl(消息队列控制)

(4)共享内存:把同一段物理机制映射到多个进程的内存地址空间的通信机制。每个进程的内存地址空间需要明确设置共享内存段,同一个进程的线程共享地址空间。(速度快,但是没有同步),shmget(创建共享段),shmat(共享段映射),shmdt(取消映射),shmctl(共享段控制)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值