操作系统——信号量机制
1、基础概念
1.1 背景介绍
-
并发问题:竞争条件
-
多线程同步问题中锁不够用
1.2 信号量
- 抽象数据类型
- 一个整形(sem),两个原子操作
- P():sem减1,如果sem<0,等待,否则继续
- V():sem加1,如果sem<=0,唤醒一个等待的进程P
- 例如铁路上的信号灯
- DI jkstra在20世纪69年代提出
2、信号量的使用和实现
2.1 使用
- 信号量是整数
- 信号量是被保护的变量
- 初始化完成后,唯一改变一个信号量的值的办法是通过P()和V()
- 操作必须是原子的
- P()能够阻塞,V()不会被阻塞
- 在实践中,FIFO经常使用
- 两种类型信号量
- 二进制信号量:0或1,实现lock的功能
- 一般/计数信号量:可取任何非负值
- 两者相互表现
- 信号量可以用在
- 互斥
- 更复杂的条件同步
2.2 实现
-
用二进制信号量实现的互斥
-
每个约束用一个单独的信号量
-
案例:生产者、消费者问题
- 设置信号量
- 进行操作,生产者添加,消费者减少
- 通知消费者为满,通知生产者为空
-
-
P、V操作交换顺序
- P操作交换产生死锁
- V操作交换无影响
-
P、V操作实现原理
3、管程
3.1 目的
- 分离互斥和条件同步的关注
3.2 什么是管程
-
一个锁:指定临界区
-
0或者多个条件变量:等待/通知信号量用于管理并发访问共享数据
3.3 一般方法
- 收集在对象/模块中的相关共享数据
- 定义方法来访问共享数据
3.4 管程的实现
-
条件变量的实现
- 条件变量并不需要加减平衡,例如,执行Wait,numWaiting++,但是执行Signal时,如果numWaiting>0不成立,则numWaiting–不会执行
-
管程的实现
- 设置lock锁
- 设置管理线程数量
- 设置buffer信号量,notFull,notEmpty