OS第二章五大经典PV

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]
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值