1、整型信号量:
整型信号量定义一个用于表示资源数目的整型量数目S ,但是仅能通过两个原子操作wait(s)和sigal (s)来访问,
while(S)
{
while(S<=0 );//如果未申请到资源则一直循环等待资源。
s--; //一旦有资源则执行S--
}
singal(s)
{
S++; //释放资源
}
注:while(S)与singal(s)是原子操作,执行是不可中断的。
整型信号量缺点:
- 在整型信号量中,只要信号量是是s<=0 就会不断的测试,并未遵循“让权等待原则”,而使进程处于忙等状态。
2、记录型信号量:
typedef struct{
int value;
struct process_control_block *list;//阻塞队列
}semaphore;
wait(semaphore *S){
S->value--;//申请资源
if(S->value<0)//表示该类资源已分配完毕,应调用block原语进行自我阻塞
block(S->list);
}
signal(semaphore *S){
S->value++;//释放资源
if(S->value<=0) //表表示该信号量链表中仍有等待的进程被阻塞,应调用wakeup原语。
wakeup(S->list);
}
S->value的初值表示系统中某类资源的数目, 可称为资源信号量。
注:
- S>0时:表示可供并发进程使用的资源数。
- S<=0时:|S|表示因缺少该资源而自我阻塞的进程数。
3、AND型信号量
将进程在整个运行过程中的所有资源,一次性全部分配给进程,进程使用完后再一次性释放,只要一个进程尚未分配成功,其他所有为之分配的资源也不分配给它。(要么把它所请求的资源全部分配给进程,要么一个也不分配),可避免死锁现象。
Swait(S1,S2,...,Sn)
{
while(true)
{
if(Si>=1&&...&&Sn>=1)
{
for(i=1;i<n;i++)
Si--;
break;
}
else
{
place the process in the waiting queue associated with.....
//大致意思是如果没有申请到资源的话就挂到相应的阻塞队列里去
}
}
}
Ssignal(S1,S2,...Sn)
{
while(true)
{
for(i=1;i<=n;i++)
{
Si++;
remove all the process waiting in the queue associated with Si into the ready queue;
//去后备队列里唤醒或移除因Si资源阻塞的进程
}
}
}