三种信号量机制

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资源阻塞的进程
		}
	}
}

你可能感兴趣的:(操作系统)