利用信号量机制实现前驱关系

记录型信号量:

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|表示因缺少该资源而自我阻塞的进程数。

利用记录型信号量实现前驱关系:
例1:已知A,B的值,表示(A²+3B)/(B+5A)求值过程的前趋图。

解:
 已知A,B,那么A²,3B,5A进程可以随时开始:
 设      s1=A²,          s2=3B,         s3=5A,     
         s4=A²+3B,       s5=B+5A,       s6=(A²+3B)/(B+5A)

 设1,2,3,4,5,6号位置分别对应a,b,c,d,e,f,信号量。
 semaphore a,b,c,d,e,f;
 a.value=b.value=c.value=c.value=e.value=f.value=0
 	p1:{  s1,  v(a)  }
 	p2:{  s2,  v(b)  }
 	p3:{  s3,  v(c)  }
 	p4:{  p(a),p(b),s4,v(d)  }
 	p5:{  p(c),s5,v(e) }
 	p6:{  p(d),p(e), s6  }

前驱图:
利用信号量机制实现前驱关系_第1张图片
例2:
快餐厅有4类职员:
(1)服务员:接受顾客点菜;
(2)厨师:准备顾客的饭菜;
(3)打包员:将做好的饭菜打包:
(4)出纳员:收款并提交食品。
每个职员可被看作一个进程,试用一同步机制写出能让四类职员正确并发运行的程序。
利用信号量机制实现前驱关系_第2张图片

你可能感兴趣的:(操作系统,操作系统,信号量,前驱关系)