1.概念
- 用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互 斥、进程同步。
- 信号量其实就是一个变量 ,可以用一个信号量 来表示系统中某种资源的数量
- 原语是一种特殊的程序段,其执行只能一气呵成,不可被中断。原语是由关中断/开中断指令实现的。
- 一对原语:wait(S) 原语和signal(S) 原语,括号里的信号量S是函数调用时传入的一个参数
- wait、signal原语常简称为P、V操作。做题的时候常把 wait(S)、signal(S) 两个操作分别写为P(S)、V(S)
2.整型信号量
用一个整数型的变量作为信号量,用来表示系统中某种资源的数量。
三种操作(初始化,P操作,V操作)
int S = 1;//初始化信号量S
void wait(int S){
while(S<=0);
S = S-1;
}
void signal(int S){
S = S+1;
}
3.记录型信号量
整型信号量的缺陷是存在忙等问题,所以提出了记录型信号量
typedef struct{
int value;
struct process *L;
}semaphore;
void wait(semaphore S){
S.value--;
if(S.value<0){
block(S.L);
}
}
void signal(semaphore S){
S.value++;
if(S.value<=0){
wakeup(S.L);
}
}
4.AND型信号量
将进程在整个运行过程中需要的所有资源,一次性全部地分配给进程,待进程使用完后再一起释放