2021/8/24 我想探知宇宙
OS第二章五大经典PV
题目分析和优化
一、PV操作体系框架
二、哲学家进餐(干饭)问题
2019年统考真题
问题描述:
有n(n>=3) 名哲学家围坐在一张圆桌边,每名哲学家交替地就餐和思考.在圆桌中心有m(m>=1)个碗,每两名哲学家之间有一根筷子。每名哲学家必须取到一个碗和两侧的筷子后,才能进餐,干饭后将碗和筷子放回原位,继续思考,为尽可能多的哲学家同时进餐,且防止出现死锁现象,进行PV操作和semaphore信号量定义。
解法一:暴力破解
资源全锁:
//定义semaphore信号量
semaphore bowl=n;//n个碗
semaphore chopstick[n];//n只筷子
semaphore mutex=1;//互斥取资源信号量
for(int i=0;i<n;i++)
chopstick[i]=1;//初始化信号量
Pi(){
//i号哲学家
while(1){
思考;
P(mutex);//互斥访问资源
if(bowl&&chopstick[i]&&chopstick[(i+1)%n]){
//左右筷子、婉都有
P(bowl);//拿碗
P(chopstick[i]);//拿左筷子
P(chopstick[(i+1)%n]);//拿右筷子
V(mutex);//拿完就释放互斥
哲学家干饭;
V(bowl);//释放碗
V(chopstick[i]);//释放左筷子
V(chopstick[(i+1)%n]);//释放右筷子
}
else
V(mutex);//资源不够释放互斥,满足尽可能多的哲学家同时进餐
}
}
解法二:限制人数
运用了死锁避免
通过限制限制人数为n-1,取和其他资源的最小值 bowl=min{n-1,m}
如果资源类别>=2是要取所有资源的和n-1个人进餐人数的最小值
赋予最小值的信号量代表了同时进餐的人数
并且将赋予最小值的信号量放在进程的一开始的位置P(bowl);如果资源不满足就会阻塞
semaphore chopstick[n];//n只筷子
semaphore bowl=min{
n-1,m};//同时进餐的最大人数
for(int i=0;i<n;i++)
chopstick[i]=1;//初始化信号量
Pi(){
//i号哲学家
while(1){
思考;
P(bowl);//拿碗
P(chopstick[i]);//拿左筷子
P(chopstick[(i+1)%n]);//拿右筷子
干饭;
V(bowl);//释放碗
V(chopstick[i]);//释放左筷子
V(chopstick[(i+1)%n]);//释放右筷子<