《操作系统》信号量机制

2.3.3 信号量机制

用户进程可以通过使用操作系统提供的一对原语【wait(S)和signal(S)】来对信号量进行操作,从而很方便实现了进程互斥、进程同步。
信号量其实就是一个变量(可以是一个整数,也可以是更复杂的记录型变量),可以用一个信号量来表示系统中某种资源的数量,比如:系统中只有一台打印机,就可以设置一个初值为1的信号量
wait、signal原语简称P、V操作

一、整型信号量

在这里插入图片描述

二、记录型信号量

在这里插入图片描述
当资源分配完之后进程需要进入等待队列
请添加图片描述

进入等待队列的进程使用资源
请添加图片描述
PV操作
在这里插入图片描述

2.3.4 用信号量机制实现进程互斥、同步、前驱关系

一、实现进程互斥

在这里插入图片描述

二、实现进程同步

在这里插入图片描述

三、实现进程的前驱关系

在这里插入图片描述

2.3.5 经典问题

一、生产者-消费者问题

1、问题描述

在这里插入图片描述

2、分析问题

在这里插入图片描述

同步:生产者跟消费者
缓冲区满时,生产者要等待消费者取走产品
缓冲区空时,消费者要等待生产者放入产品
互斥:对缓冲区的访问要互斥地进行(mutex)
在这里插入图片描述

3、代码实现

在这里插入图片描述

4、思考:是否可以改变P、V操作的顺序

在这里插入图片描述

二、多生产者-多消费者问题

1、问题描述

在这里插入图片描述

2、分析问题

在这里插入图片描述
互斥
对缓冲区(盘子)的访问要互斥地进行
同步
爸爸放完苹果才能女儿才吃
妈妈放完橘子后,儿子才能取橘子
盘子空时,爸爸或妈妈才能放水果
在这里插入图片描述
初始化,确定好信号量的定义,一开始这个信号量定义有多少就设为多少,例如plate定义为盘子能放多少个水果,因为盘子一开始最多就可以放1,初始化设置为1

3、代码实现

在这里插入图片描述

4、思考

(1)信号量mutex可以去掉吗,本题条件时是可以的,因为缓冲区大小为1,盘子只能放一个水果,在任何时刻,apple、orange、plate三个同步信号量中最多只有一个是1,因此在任何时刻,最多只有一个进程的P操作不会被阻塞,并顺利地进入临界区。

(2)如果盘子的容量为n大于1的话,信号量mutex不能去掉,不然会导致两个进程写入缓冲区的数据相互覆盖的情况,而且信号量plate要初始化为n。

三、吸烟者问题

1、问题描述

在这里插入图片描述
本质上这题属于“生产者-消费者”问题,详细来说就是“可生产多种产品的单生产者-多消费者”。
生产产品
组合一:纸+胶水
组合二:烟草+胶水
组合三:烟草+纸
同步关系
桌子上有组合一,抽烟者A取走东西
桌子上有组合二,抽烟者B取走东西
桌子上有组合三,抽烟者C取走东西
各抽烟者发出取完信号,供应者将下一组合放到桌子上
互斥关系
对缓冲区(桌子)互斥访问

3、代码实现

在这里插入图片描述
这里之所以没有互斥信号量,原因跟上一题一样。所以如果缓冲区为n(>1)的话,要设置信号量mutex初始化为1
在这里插入图片描述

四、读者-写者问题

1、问题描述

在这里插入图片描述

2、分析问题

在这里插入图片描述

3、读优先代码实现

在这里插入图片描述

4、写优先代码实现

在这里插入图片描述

五、哲学家进餐问题

1、问题描述

在这里插入图片描述

2、分析问题

在这里插入图片描述
在这里插入图片描述

  • 27
    点赞
  • 119
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值