操作系统-进程与线程2
2.3 同步与互斥
基本概念
临界资源,同步,互斥
实现互斥
略,软件方式和硬件方式
互斥锁&信号量
互斥锁:原子操作acquire(), release();需要忙等待
信号量类型:整型信号量,记录型信号量
整型信号量:wait(), signal();wait当信号量大于0后信号量减一,signal信号量加一
记录型信号量:wait信号量减一并将自己的进程加进等待队列,状态设置为block,signal信号量加一,当信号量大于0后从等待队列释放一个进程并唤醒该进程。
信号量实现同步与互斥
管程
略
经典同步问题
1. 生产者-消费者问题
要求:生产者和消费者共享一个缓存区,生产者在没满时生成,消费者在没空时消费
三个信号量:mutex,full,empty
先P(empty)或P(full),再P(mutex)——可能死锁
2. 读者-写者问题
要求:读可以同时;只能一个写;写操作未完成前不能读或写;执行写操作前无正在执行的读或写
(感觉就一句,除读读外,其他操作互斥)
3. 哲学家就餐问题
解决办法:同时拿两根筷子;动作规定
4. 吸烟者问题
问题描述:三个吸烟者和一个供应者。造烟需要三种材料,三个吸烟者各有一种。供应者每次拿出两种使得一个吸烟者能够吸烟。当其吸完了,供应者再拿出两种材料。
分析:供应者和吸烟者同步,吸烟者之间互斥
2.4 死锁
基本概念
死锁原因:资源竞争+顺序不当
产生条件:互斥+不可剥夺+请求且持有资源+循环等待
处理策略:预防or避免or检测并解除
死锁预防
破坏条件即可
1. 不互斥
对共享资源可行,对临界资源不可行
2. 可剥夺
有的资源可行,有的不可行(打印机)
3. 获得所有资源才执行
可能导致饿死
4. 向后申请资源
给资源编号,只能申请编号更大的资源。
麻烦
死锁避免
1. 判断安全状态
系统判断分配该资源后是否会导致死锁
2. 银行家算法
进程事先向系统声明所需最大资源数
最大需求矩阵,分配矩阵,需求矩阵
具体执行步骤略
死锁检测和解除
资源分配图:进程,资源,请求边,分配边
简化资源分配图后可检测系统是否死锁:略
解除:剥夺资源,撤销进程和进程回退(这俩有啥区别?)