整形信号量
wait(s){while(s<=0)s--;
}
signal{s++;
}
记录型信号量
typedef struct{
int value;
struct process_control_block*list;}semaphore;
wait(semaphore *s){
s->value--;
if(s->value<0) block(s->list);}
signal (semaphore *s){
s->value++;
if(s->value<0) wakeup(s->list);
}
AND型信号量
swait(s1,s2……sn){
while(ture){
if(si>=1&&s2>=1……&&sn>=1){
for(i=1;i<=n;i++) si--;}
}
else{place the process in the waiting queuque associated with the first si found with si<1,and set the program count of this process to the beginning of swait operation // 将进程放在与si<1找到的第一个si相关联的等待队列中,并将该进程的程序计数设置为swait操作的开始}
}
signal(s2,s2……,sn){
while(ture){
for(i=1;i<=n;i++){s++; remove all the proces waiting in the queue associated with si into the ready queue}/将与si相关联的队列中等待的所有进程删除到就绪队列}
}
}
信息量集
进程对信号量si的测试值不再是1,而是该资源的分配下限ti,既要求si>=ti;
进程对该资源的需求值为di,进行si=si-di;操作
swait(s1,t1,d1……sn,tn,dn);
ssignal(s1,t1,d1……sn,tn,dn);
一般的信号量集有下面几种特殊情况
(1)swait(s,d,d) 此时信号量集只有一个信号量s,但允许他申请d个资源,当现有资源不足d时,不予分配
(2) swait(s,1,1) 此时的信号量集已蜕化成一般的记录型信号量(s>1)或互斥信号量(s=1时)
(3)swait(s,1,0) 当s>=1时,允许多个进程进入某特定区;当s变成0之后,将阻止任何程序进入特定区,换言之,它相当于一个可控的开关。
网友评论