一、整形信号
wait() signal()
未让权等待,会一直忙等
二、记录形信号量 (多对一)
增加一个记录链表记录请求进程
struct{
int value; //等待进程数
struct process_control_block *list;
}semaphore;
wait(semphore *s){
s.value--;
if(s.value < 0) block(s.list);
}
signal(semphore *s){
s.value++;
if(s.value <= 0) wakeup(s.list);
}
三、AND型信号量 (多对多)
防:a->A&&b->B死锁
增加一个AND条件
swait(s1~sn){
while(1){
if(s1&&s2&&...){
for(i : n) si--;
break;
}
else ...;
}
}
signal(s1~sn){
while(1){
for(i : n) {
si++;
...;
}
}
}
四、信号量集 、
康康每次请求耗费几个资源
Swait(s1~,t1~,d1~); si = si - di ; //t i 为资源下限值,判断符合减去需求di、
Ssignal((s1~,d1~)