文章目录
信号量和管程
信号量和管程都是用来解决进程同步问题的。
信号量
介绍
此种方式由迪杰斯特拉在20世纪60年代提出的。信号量是操作系统提供的一种协调共享资源访问的方法。此种办法是早期操作系统中主要的同步机制,现在很少使用。
- 软件同步是平等线程间的一种同步协商机制
- 信号量是由OS来进行管理的,OS是管理者,地位高于进程
- 用信号量来表示系统资源的数量。
信号是一种抽象的数据类型
- 由一个整型变量(sem)和两个原子操作组成。变量可以理解为要共享的资源数目。
- P():sem减1,若sem<0,进入等待,否则继续
- V():sem加1,若sem<=0,则唤醒一个进程
信号量是被保护的整数变量
- 初始化完成后,只能通过P和V操作修改
- 由操作系统保证,PV操作是原子操作
P可能阻塞,V不会阻塞。
通常假设通信量是公平的
- 线程不会被无限期阻塞在P操作
- 假定信号量按照先进先出排队。
- 自旋锁无法做到先进先出
信号量的实现
class Semaphore {
int sem;
WaitQueue q;
}
Semaphore::P() {
sem--;
if (sem < 0) {
add this progress p to q;
block(p);
}
}
Semaphore::V() {
sem++;
if (sem >= 0) {//sem为负数时说明有进程在等待资源,而sem自增后还不为正数说明有进程在等待资源
remove progress p from q;
wakeup(p);
}
}
信号量的使用
信号量可分为两种信号量:
- 二进制信号量:资源数目为0或者1
- 资源信号量:资源数目为任何非负值
- 两者等价,基于一个可以实现另一个。
信号量使用分为两种情况:
互斥访问:实现临界区的互斥访问控制
给每类资源设置一个信号量,其初值为1,因为临界区的资源同一