当前位置 博文首页 > 司夏的博客:操作系统 -死锁和进程通信
由于竞争资源或者通信关系,两个或更多线程在执行中出现,永远相互等待只能由其他进程引发的事件
死锁示例:单向通行桥梁
桥梁只能单向通行,桥的每个部分可视为一个资源
可能出现死锁,对向行驶车辆在桥上相遇,解决方法:一个方向的车辆倒退(资源抢占和回退)
可能发生饥饿,由于一个方向的持续车流,另一个方向的车辆无法通过桥梁
资源类型R1, R2, . . .,Rm。CPU执行时间、内存空间、I/O设备等
每类资源Ri有Wi个实例
进程访问资源的流程
可重用资源(Reusable Resource)
可重用资源示例:
硬件:处理器、I / O通道、主和副存储器、设备等
软件:文件、数据库和信号量等数据结构
消耗资源(Consumable resource)
消耗资源示例:
在I/O缓冲区的中断、信号、消息等
出现死锁的必要条件:(不是充要条件)
互斥
任何时刻只能有一个进程使用一个资源实例
持有并等待
进程保持至少一个资源,并正在等待获取其他进程持有的资源
非抢占
资源只能在进程使用后自愿释放
循环等待
存在等待进程集合{P0,P1,…,PN} ,P0正在等待P1所占用的资源,P1 正在等待P2占用的资源,…,PN-1在等待PN所占用资源,PN正在等待P0所占用的资源
死锁预防(Deadlock Prevention)确保系统永远不会进入死锁状态
死锁避免(Deadlock Avoidance)在使用前进行判断,只允许不会出现死锁的进程请求资源
死锁检测和恢复(Deadlock Detection & Recovery)在检测到运行系统进入死锁状态后,进行恢复
由应用进程处理死锁,通常操作系统忽略死锁,大多数操作系统(包括UNIX)的做法
预防是采用某种策略,限制并发进程对资源的请求,使系统在任何时刻都不满足死锁的必要条件。
互斥,把互斥的共享资源封装成可同时访问
持有并等待,进程请求资源时,要求它不持有任何其他资源。仅允许进程在开始执行时,一次请求所有需要的资源。资源利用率低
非抢占,如进程请求不能立即分配的资源,则释放已占有资源。只在能够同时获得所有需要资源时,才执行分配操作
循环等待,对资源排序,要求进程按顺序请求资源
利用额外的先验信息,在分配资源时判断是否会出现死锁,只在不会死锁时分配资源
要求进程声明需要资源的最大数目
限定提供与分配的资源数量,确保满足进程的最大需求
动态检查的资源分配状态,确保不会出现环形等待
当进程请求资源时,系统判断分配后是否处于安全状态
系统处于安全状态,一定没有死锁
系统处于不安全状态,可能出现死锁
避免死锁就是确保系统不会进入不安全状态
允许系统进入死锁状态
维护系统的资源分配图
定期调用 死锁检测算法
来搜索图中是否存在死锁
出现死锁时,用死锁恢复机制进行恢复
终止所有的死锁进程
一次只终止一个进程直到死锁消除
终止进程的顺序应该是
选择被抢占进程,最小成本目标
进程回退,返回到一些安全状态, 重启进程到安全状态
可能出现饥饿,一进程可能一直被选作被抢占者
进程通信是进程进行通信和同步的机制
IPC提供2个基本操作
进程通信流程
进程链路特征
直接通信
进程必须正确的命名对方
通信链路的属性
间接通信
通过操作系统维护的消息队列实现进程间的消息接收和发送
通信链路的属性
通信流程
基本通信操作
进程通信可划分为阻塞(同步)或非阻塞(异步)
阻塞通信
非阻塞通信
进程发送的消息在链路上可能有3种缓冲方式
0 容量,发送方必须等待接收方
有限容量,通信链路缓冲队列满时,发送方必须等待
无限容量,发送方不需要等待
信号:进程间的软件中断通知和处理机制
信号的接收处理
不足,传送的信息量小,只有一个信号类型
进程间基于内存文件的通信机制
消息队列是由操作系统维护的以字节序列为基本单位的间接通信机制
每个消息(Message)是一个字节序列
相同标识的消息组成按先进先出顺序组成一个消息队列(Message Queues)
共享内存是把同一个物理内存区域同时映射到多个进程的内存地址空间的通信机制
进程
线程,同一进程中的线程总是共享相同的内存地址空间
优点,快速、方便地共享数据
不足,必须用额外的同步机制来协调数据访问
cs