文章目录
- 一. 信号量机制
- 整型信号量
- 记录型信号量
- 例子:
- 总结
- 二. 用信号量实现互斥、同步
- 互斥
- 同步
- 前驱
- 总结
一. 信号量机制
- 信号量:一个用于表示系统中某种资源的数量的变量(整数 or 记录型变量)
- 一对原语:wait(S) 和 signal(S),S为参数。简称P、V操作,因此也可写成 P(S)、V(S)
整型信号量
- 仅三种操作:初始化、P操作、V操作
- 原子性避免并发、异步导致的问题
- 问题:不满足“让权等待”,会发生“忙等”
记录型信号量
- 结构体取代整型,加入等待队列
- block 原语:把进程从运行态 => 阻塞态,并挂入信号量的等待队列
- wakeup原语:把进程从“阻塞态 => 就绪态”,从信号量的等待队列中唤醒
例子:
- 图文不便描述。建议还是看视频,走一遍流程便于理解。p21的20分钟附近
- S.value 表示 系统某种资源的数目
- 不会出现忙等情况,遵循让权等待原则
总结
二. 用信号量实现互斥、同步
互斥
- 不同临界资源,设置不同互斥信号量
- P、V 操作成对出现:缺P不能保证互斥访问,缺V会导致资源永远不被释放
同步
- 前操作之后,执行 V
- 后操作之前,执行 P(要取,保证在【前操作存之后】才能跑)
前驱
- 每一对前驱关系设置一个同步变量
- 在此基础上走上面的【同步】的 PV 设定方式
总结
- 互斥:信号量初值1
- 同步:信号量初值0
- 前驱:本质上就是更复杂的同步问题