进程管理(进程的同步与互斥二---经典同步互斥问题)

  • 生产者-消费者问题

把并发进程的同步和互斥问题一般化,可以得到一个抽象的一般模型,即生产者-消费者问题。

在计算机系统中,每个进程都申请使用和释放各种不同类型的资源,这些资源既可以是像外设、内存及缓冲区等硬件资源,也可以是数据等软件资源。把系统中使用某一类资源的进程称为该资源的消费者,而把释放同类资源的进程称为该资源的生产者。

例如:计算进程Pc和打印进程Pp公用一个缓冲区的例子,计算进程Pc把数据送入缓冲区,打印进程Pp从缓冲区中取数据打印输出,因此Pc进程相当于数据资源的生产者,Pp进程属于资源的消费者。

生产者-消费者问题描述:把一个长度为n的有界缓冲区(n>0)与一群生产者进程P1,P2,...,Pm和一群消费者进程C1,C2,...,Ck联系起来,如下图:

生产者和消费者每次操作的数据单位为缓冲区中的一个单元。

关系分析:由于有界缓冲区是临界资源,因此各生产者进程和各消费者进程之间必须互斥执行。同时生产者和消费者又是同步关系,消费者想接收数据时,有界缓冲区中至少有一个单元是满的;生产者想发送数据时,有界缓冲区中至少有一个单元是空的。

信号量设置:设公用信号量mutex保证生产者进程和消费者进程之间的互斥,设信号量avail为生产者进程的私用信号量,信号量full为消费者进程的私用信号量。信号量avail表示有界缓冲区中的空单元数,初值为n;信号量full表示有界缓冲区中非空单元数,初值为0。信号量mutex表示可用有界缓冲区的个数,初值为1。

P、V操作实现:

semaphore mutex = 1;
semphore avail = n;
semphore full = 1;
producer(){
	produce an item;		//生产数据
	p(avail);				//获取空缓冲区单元
	p(mutex);				//进入临界区
	add an item to buffer;	//将数据放入缓冲区
	v(mutex);				//离开临界区,释放互斥信号量
	v(full);				//发满缓冲区单元加1信号
}
consumer(){
	p(full);				//获取满缓冲区单元
	p(mutex);				//进入临界区
	remove an item from buffer;	//从缓冲区中取出数据
	v(mutex);				//离开临界区,释放互斥信号量
	v(avail);				//空缓冲区数加1
	consume the item;		//消费数据
}
  • 哲学家进餐问题

问题描述:一张圆桌上坐着五个哲学家,每两个哲学家之间摆一根筷子,筷子的中间是一碗米饭,哲学家们的生活方式是交替地进行思考和进餐。哲学家在思考的时候,并不影响他人,只有当哲学家饥饿的时候,才试图拿起左、右两根筷子。如果筷子已在他人手上,则需要等待。饥饿的哲学家只有同时拿到了两根筷子才可以开始进餐,当进餐完毕后,放下筷子继续思考。

问题分析。显然这里有五个哲学家进餐进程并发执行,拿到左右两个筷子可以进餐。筷子是临界资源,五个哲学家与左右令居对其中间筷子的访问是互斥关系。

信号量设置。应为每个筷子设置互斥信号量,定义互斥信号量数组chopsticks[5]={1,1,1,1,1}用于对五个筷子的互斥访问。

P、V操作实现:对哲学家按顺序从0~4编号,哲学家i左边筷子的编号为i,哲学家右边筷子的编号为(i+1)%5。

semaphore chopsticks = {1,1,1,1,1};
Pi(){
	do{
		P(chopstick[i]);		//取左边筷子
		P(chopstick[(i+1)%5]);	//取右边筷子
		eat;					//进餐
		V(chopstick[i]);		//放下左边筷子
		V(chopstick[(i+1)%5]);	//放下右边筷子
		think;					//思考
	}while(1)
}

该算法存在以下问题:当五个哲学家都想要进餐,分别拿起他们左边筷子的时候,筷子已经被拿光了,等到他们再想拿右边筷子的时候就全被阻塞了,这就出现了死锁。

解决方法有两个:一是让他们进餐时同时拿两个筷子(AND信号量机制);而是对每个哲学家的动作制定规则,避免饥饿或者死锁现象的发生,可采取一下几种解决方法。

(1)至多允许4个哲学家同时去拿左边的筷子,最终能保证至少有一位哲学家能够进餐,并在进餐完毕后释放出他用过的两只筷子,从而使更多哲学家能进餐。

(2)仅当一个哲学家左右两遍的筷子都可用时才允许他拿起筷子。

(3)对哲学家顺序编号,要求奇数号哲学家先拿左边的筷子,然后再拿他右边的筷子,而偶数哲学家刚好相反。这样,最后总会有一个哲学家能获得两只筷子进餐。

猜你喜欢

转载自blog.csdn.net/Dream_Ryoma/article/details/81634028