信号量的基本原理
- 两个或多个进程通过简单的信号进行合作。
- 任何复杂的合作需求都可以通过适当的信号结构得到满足。
信号量机制实现要素
- 信号量(Semaphore类型,内含一个阻塞队列)
- p操作原语(wait)
- v操作原语(signal)
记录型信号量
一个记录型信号量包含两个分量:信号俩的值,信号量的等待队列指针
type semaphore = record
value:integer;
*L:Queue;
end.
使用该类型声明一个信号量s ,var s: semaphore;或者semaphore s;则s.value的不同取值表示临界资源的使用情况;s.L对应因临界区不能进入而阻塞的进程组成的阻塞队列
信号量机制解决互斥问题
- 一种CR设一 个信号量
- 信号量的初值设置为系统初始状态CR的可用量
- P操作用于临界区前,相当于进入CS之前申请CR
- V操作用于临界区后,相当于出临界区后释放CR
- P、V操作必须成对匹配
信号量的值:
semaphore mutex;这样声明信号量mutex用于互斥问题
mutex.value:
1. 目前CR有mutex.value个可用
2. 目前CR没有可用的
3. 目前有|mutex.value|个进程因等待该CR而阻塞
信号量机制解决同步问题
- 种同步信号设一个信号量
- 信号量的初值设置为系统初始状态下信号的有无
- P操作用于临界区前,相当于检查同步信号
- V操作用于临界区后,相当于发出同步信号
- P、V操作丕成对匹配
信号量的值:
semaphore s;这样声明信号量s用于同步问题
s.value:
1. 目前有s.value个s对应的同步信号
2. 目前没有s对应的同步信号
3. 目前有ls.valuel个进程因等s对应的同步信号而阻塞
互斥,同步解决方法之异同分析
- 信号量的设置
- 信号量的初值
- p操作的含义
- v操作的含义
- p,v操作是否匹配
记录型信号量机制解决问题的步骤:
1. 分析问题中的进程、资源;
2. 分析进程间关系;
3. 分别设置互斥、同步信号量;
4. 写出并发进程体,找出相关CS;
5. 分别加PV操作并分析结果。
例1:卡车计数问题
如果不使用pv操作的话,两个进程将无法等到想要的结果
使用pv操作后,两个进程将得到正确的结果