进程同步以及死锁
- 顺序程序设计
-
- 特性
- 并发程序设计
- 同步问题解决
-
- 硬件解决方法
-
- 忙等待
- 软件解决
-
- 信号量方法
-
- 分类
- 互斥解决方案-临界区互斥
- 同步解决方案
- 经典问题
-
- 生产者消费者
-
- 注意
- 特点
- 哲学家进餐
-
- 注意
- 解决方案
- 读者写者问题
- 管程
-
- 特点
- 死锁和饥饿
-
- 死锁
-
- 死锁必要条件
- 死锁预防
- 死锁避免
-
- 资源分配图
- 银行家算法
-
- 具体实现
- 例子
- 死锁检测、恢复
-
- 检测 具体算法
- 恢复
- 饥饿
顺序程序设计
- 指令序列
- 执行严格有序
特性
- 执行顺序性
- 环境封闭性
- 结果确定性
- 过程可再见性
并发程序设计
- 并发性
- 共享性
- 交往性:进程互相制约
互斥: 并发进程之间因相互争夺独占性资源而产生的竞争制约关系
进程同步: 并发进程之间为完成共同任务基于某个条件来协调执行先后关系而产生的协作制约关系
同步问题解决
硬件解决方法
- 屏蔽中断:只有一个CPU的时候有效
- 提供特殊指令(原子操作)
忙等待
持续监测一个变量,浪费CPU时间。
软件解决
信号量方法
用信号方法协作。(Semaphore特殊变量)
只能执行两个原子操作:
- wait(S) 接收信号。 称 P操作
- signal(S) 发送信号。 称V操作。
分类
- 计数
- 二元
- 结构型
struct{
int val;
struct process *L;
}semaphore;
互斥解决方案-临界区互斥
多进程互斥进入临界区。
Wait(S)
临界区
Signal(S)
- S.value=-1的时候进程阻塞进入S的等待队列。
- Signal(S)执行,唤醒队列中一个进程。等待状态到就绪状态。
同步解决方案
进程1的A段代码必须在进程2的B段代码之前执行完。
死锁和饥饿
不可抢占资源是互斥资源的子集。
死锁
- 针对不可抢占资源。
- 多个进程无限等待同一事件,而事件只能由其中一个来产生。
- 多进程抢夺不可抢占资源,造成永远等待。
Max-Allocation=Need
死锁检测、恢复
- 不限制对资源的访问
- 只是检测死锁是否存在
- 如果存在,想办法恢复
检测 具体算法
- 标记没有死锁的进程
- 算法结束没有被标记->存在死锁
恢复
- 终止所有死锁进程
- 一次终止一个,直到取消死锁
饥饿
- 无限期阻塞
- 长时间得不到CPU
死锁 饥饿 需要CPU及其它资源 需要CPU 进程相互等待 等待调度 来源:一页居士
声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!