接下来盘一下信号量机制
1.由来背景
在双标志先检测法中,进入区的“检查”、“上锁”操作无法一气呵成,导致两个进程无法进入临界区。
因此荷兰的学者迪杰斯特拉提出了进程互斥、同步的方法-信号量机制
2.术语
信号量:表示系统中某种资源的数量
原语:执行只能一气呵成,不能被中断
一对原语:wait(S)和signal(S),简称为P、V操作
3.整型信号量
用一个整数作为信号量,用来表示系统中某种资源的数量(相比较普通变量,此整数只能初始化、P、V操作)
4.记录型信号量 (重点)
解决整型信号量的缺陷“忙等”
引入记录型信号量
typedef struct{
int value; // 剩余资源数
struct process *L// 等待队列
}semaphore;
void wait (semaphore S){
S.value--;
if (S.value < 0){
block (S.L); // 剩余的资源不够,将信号量S挂在到阻塞队列
}
}
void signal(semaphore S){
S.value++;
if (S.value <= 0){
wakeup(S.L); // 唤醒阻塞队列中的进程,从阻塞态到就绪态
}
}
5.信号量机制实现前驱关系
每一个前驱各设置一个同步变量
“前操作”之后执行v操作
“后操作”之前执行p操作
6.信号量机制实现进程同步
设置初始信号量,初始为0
“前操作”之后执行v操作
“后操作”之前执行p操作
保证代码 执行顺序
7.信号量机制实现进程互斥
设置初始信号量,初始为1
在临界区之前执行p
在临界区之后执行v