进程管理 —— 哲学家进餐问题

一、问题描述


进程管理 —— 哲学家进餐问题_第1张图片

二、问题分析

semaphore mutex=1//互斥地取筷子
Pi (){	//i号哲学家的进程
	while1{
		P(chopstick [i];	//拿左
		P(chopstick[(i+1%5]);	//拿右
		吃饭;
		V(chopstick [i];		//放左
		V(chopstick[(i+1%5];	//放右
		思考
	}
}

该算法存在一下问题:当5名哲学家都想要进餐并分别拿起左边的筷子时,筷子已经被拿光,等到他们再想拿右边的筷子时,就会被阻塞,因此出现了死锁。

为了防止死锁的发生,可对哲学家进程施加一些限制条件。有以下几种方法:

  1. 最多允许四个哲学家同时进餐。这样可以保证至少有哲学家是可以拿到左右两只筷子的,破坏了 ”循环等待“ 条件

  2. 要求奇数号哲学家先拿左边的筷子,然后再拿右边的筷子,而偶数号哲学家刚好相反。用这种方法可以保证如果相邻的两个奇偶号哲学家都想吃饭,那么只会有其中一个可以拿起第一只筷子,另一个会直接阻塞。这就避免了占有一支后再等待另一只的情况,破坏了 ”循环等待“ 条件

  3. 仅当一个哲学家左右两支筷子都可用时才允许他抓起筷子,破坏了 ”请求和保持“ 条件

三、实现

我们选择第三种方法进行实现


semaphore mutex=1//互斥地取筷子
Pi (){	//i号哲学家的进程
	while1{
		P(mutex);
		P(chopstick [i];	//拿左
		P(chopstick[(i+1%5]);	//拿右
		V(mutex);
		吃饭;
		V(chopstick [i];		//放左
		V(chopstick[(i+1%5];	//放右
		思考
	}
}

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