哲学家进餐问题是操作系统中的经典进程同步问题,在操作系统考试中是常考的重难点,今天给大家分享下哲学家进餐问题的相关PV操作策略。
问题描述:五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在桌子上有五只筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐毕,放下筷子继续思考。请使用信号量的P、V操作(wait( )、 signal( )操作)描述上述过程中的互斥与同步,并说明所用信号量及初值的含义。
问题分析:放在桌子上的筷子是临界资源,在一段时间内只允许一位哲学家使用,为了实现对筷子的互斥访问,可以用一个信号量表示筷子,由这五个信号量构成信号量数组。
semaphore chopstick[5] = {1,1,1,1,1};
while(true)
{
//当哲学家饥饿时,总是先拿左边的筷子,再拿右边的筷子
wait(chopstick[i]);
wait(chopstick[(i+1)%5]);
// 吃饭
//当哲学家进餐完成后,总是先放下左边的筷子,再放下右边的筷子
signal(chopstick[i]);
signal(chopstick[(i+1)%5]);
}
上述的代码可以保证不会有两个相邻的哲学家同时进餐,但却可能引起死锁的情况。假如五位哲学家同时饥饿而都拿起的左边的筷子,就会使五个信号量chopstick都为0,当