目录

操作系统信号量机制

《操作系统》信号量机制

王道考研笔记

2.3.3 信号量机制

用户进程可以通过使用操作系统提供的 一对原语【wait(S)和signal(S)】 来对 信号量 进行操作,从而很方便实现了进程互斥、进程同步。

信号量其实就是一个变量(可以是一个整数,也可以是更复杂的记录型变量),可以用一个信号量来 表示系统中某种资源的数量 ,比如:系统中只有一台打印机,就可以设置一个初值为1的信号量

wait、signal原语简称P、V操作

一、整型信号量

https://i-blog.csdnimg.cn/blog_migrate/0513e772fd89cc9e57a73eadf8c21296.png

二、记录型信号量

https://i-blog.csdnimg.cn/blog_migrate/3491b2dbe233c5850d847847f47d7519.png

当资源分配完之后进程需要进入等待队列

https://i-blog.csdnimg.cn/blog_migrate/ab6fee9bd0239b3b18d015485899524f.gif

进入等待队列的进程使用资源

https://i-blog.csdnimg.cn/blog_migrate/c789f3962b9e5c660db7c9f477d3c6b0.gif

PV操作

https://i-blog.csdnimg.cn/blog_migrate/7ecee51736aad9add3c86ec00c4f150f.png

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

一、实现进程互斥

https://i-blog.csdnimg.cn/blog_migrate/0af264fdc9fac60cf491d03743cf578b.png

二、实现进程同步

https://i-blog.csdnimg.cn/blog_migrate/003712d4ea5753a77d485733479b270f.png

三、实现进程的前驱关系

https://i-blog.csdnimg.cn/blog_migrate/3b9c99624b5b382384a018ad99cbd579.png

2.3.5 经典问题

一、生产者-消费者问题

1、问题描述

https://i-blog.csdnimg.cn/blog_migrate/b6904102c1679a0d739a308e6806eade.png

2、分析问题

https://i-blog.csdnimg.cn/blog_migrate/abf9925e203fbd3298c375f8640ac138.png

同步 :生产者跟消费者

缓冲区满时,生产者要等待消费者取走产品

缓冲区空时,消费者要等待生产者放入产品

互斥 :对缓冲区的访问要互斥地进行(mutex)

https://i-blog.csdnimg.cn/blog_migrate/312d08cb7100c7d6c48b856f72557723.png

3、代码实现

https://i-blog.csdnimg.cn/blog_migrate/199687f1f4f2c006081cba23b936439f.png

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

https://i-blog.csdnimg.cn/blog_migrate/d3df8bb131cf30bb84cb137eab43ea38.png

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

1、问题描述

https://i-blog.csdnimg.cn/blog_migrate/d9a9c139b342faac6f0933fe12050448.png

2、分析问题

https://i-blog.csdnimg.cn/blog_migrate/cbb6ce27e7d85a4f4e034f6e1564b0fe.png

互斥

对缓冲区(盘子)的访问要互斥地进行

同步

爸爸放完苹果才能女儿才吃

妈妈放完橘子后,儿子才能取橘子

盘子空时,爸爸或妈妈才能放水果

https://i-blog.csdnimg.cn/blog_migrate/2888fbdfb14d2ecd51594aef19e8f529.png

初始化,确定好信号量的定义,一开始这个信号量定义有多少就设为多少,例如plate定义为盘子能放多少个水果,因为盘子一开始最多就可以放1,初始化设置为1

3、代码实现

https://i-blog.csdnimg.cn/blog_migrate/9b5804b87265550d5d13da0ce821809f.png

4、思考

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

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

三、吸烟者问题

1、问题描述

https://i-blog.csdnimg.cn/blog_migrate/d0ffeede6d1c2364fef806401f5c11b4.png

本质上这题属于“生产者-消费者”问题,详细来说就是“可生产多种产品的单生产者-多消费者”。

生产产品

组合一:纸+胶水

组合二:烟草+胶水

组合三:烟草+纸

同步关系

桌子上有组合一,抽烟者A取走东西

桌子上有组合二,抽烟者B取走东西

桌子上有组合三,抽烟者C取走东西

各抽烟者发出取完信号,供应者将下一组合放到桌子上

互斥关系

对缓冲区(桌子)互斥访问

3、代码实现

https://i-blog.csdnimg.cn/blog_migrate/a9a55dd19da530f1642837cfb12df074.png

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

https://i-blog.csdnimg.cn/blog_migrate/d377b4560ffeaed41db17169fde5997d.png

四、读者-写者问题

1、问题描述

https://i-blog.csdnimg.cn/blog_migrate/8b3228972fa248b216b0436f45749081.png

2、分析问题

https://i-blog.csdnimg.cn/blog_migrate/6880e2d3d23afb0a98d51396cb620fa7.png

3、读优先代码实现

https://i-blog.csdnimg.cn/blog_migrate/f8a4a7d19a7dc566d52e254c58170b80.png

4、写优先代码实现

https://i-blog.csdnimg.cn/blog_migrate/8f9f26a6a21ed5318ecff29a2f811aa5.png

五、哲学家进餐问题

1、问题描述

https://i-blog.csdnimg.cn/blog_migrate/4c8fb8768d47e10c0a1466e650c5f9a5.png

2、分析问题

https://i-blog.csdnimg.cn/blog_migrate/95311349a247898f984ed9fcedca70b0.png

https://i-blog.csdnimg.cn/blog_migrate/be7f2d19d166a3c172d530faedcd76d6.png#pic_center