目录

操作系统信号量机制PV操作

操作系统——信号量机制(PV操作)

PV操作

学习PV时,不要一头钻到代码里,要注意理解信号量背后的含义, 一个信号量对应一种资源 ,信号量其实就是一个变量(可以是一个整数,也可以是更复杂的记录型变量),可以用一个信号量来 表示系统中某种资源的数量。

P就是wait操作,等待资源,V就是++操作,释放资源

  1. 用户进程可以通过使用 操作系统 提供的一对 原语 来对信号量进行操作,从而很方便的实现了进程互斥、进程同步。
  2. 原语就是一种特殊的程序段,其执行 只能一气呵成,不可被中断。
  3. 一对原语: wait(S)原语和signal(S)原语,可以把原语理解为我们自己写的函数,函数名分别为wait和 signal,括号里的信号量S其实就是函数调用时传入的一个参数
  4. wait、 signal原语常简称为P、Ⅴ操作,因此,做题的时候常把Wait(S)、signal(S)两个操作分别写为 P(S)、V(S)。
  • 信号量的值=这种资源的剩余数量(信号量的值如果小于0,说明此时有进程在等待这种资源)
  • P(S)——申请一个资源S, 如果资源不够就阻塞等待
  • V(S)——释放一个资源S,如果有进程在等待该资源, 则唤醒一个进程

1.实现互斥

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

2.实现同步

https://i-blog.csdnimg.cn/blog_migrate/72c61d6454bb8049d9a9b75a8b977ff7.png

3.总结

https://i-blog.csdnimg.cn/blog_migrate/5b73709f45c2a55d1392c029095b7ec9.png

4.例题

1.

https://i-blog.csdnimg.cn/blog_migrate/583a921d27f353faeb9ba3888bc9b280.png

解析

https://i-blog.csdnimg.cn/blog_migrate/21de95b1efc3348b161c687fda258bd7.png

首先我们要明白S1、S2、S3的含义,S1就是盘子里的资源情况,起始一个水果,为1;S2为儿子所拥有资源情况(橘子),初始他没有拿到水果,故初始时S2=0;S3为女儿的拥有资源情况(苹果)。

①由于题目S1为1,所以这一空先请求资源,让孩子们吃水果,所以P(S1);

②、③橘子让儿子吃,也就是给儿子一个资源,所以V(S2),否则给女儿V(S3);

④儿子进程中,要申请拿橘子,也就是P(S2);

⑤吃完橘子后,需要释放所占用盘子里的资源,也就是V(S1);

⑥⑦同④⑤

2.

https://i-blog.csdnimg.cn/blog_migrate/34a05dde5f43aa5b43f7756bf91b9ed5.png

解析

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

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

3.

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

解析

首先我们要明白S1,S2的意义,可以看到初始值S1=2,说明S1代表发货员这个资源,起初有两个发货员,S2初始值为1,说明其可作为审核员这个资源。

a:顾客想要进仓库,要申请发货员这个资源,也就是P(S1);(如果S1>0说明有发货员,可以进去,否则说明没有空闲的发货员,需要等待)。

b:进程i这个人提完货,需要释放自己所占用的资源(发货员),所以V(S1);

c:提完货需要检验,申请审核员这个资源,就是P(S2);

d:检验完后,释放自己占有的资源(审核员),也就是V(S2);

4.

https://i-blog.csdnimg.cn/blog_migrate/341357e8446b54c6eafe85ba53426ba9.png

解析

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

同样的我们要去理解每个信号量的含义,seats:表示座位这个资源,mutex表示取号机这个资源,customer表示等待被叫的顾客这个资源;由题目的初始值分别为10、1、0更加能确认我们信号量的含义。

(1):在顾客进程,首先我们要申请座位这个资源:P(seats);

(2):由(2)的下面的“从取号机取号”可得(2)为取号的操作,所以我们要申请取号机这个资源:P(mutex);

(3):我们取外号,需要释放所占用的取号机这个资源,所以V(mutex);

(4):我们需要等待叫号,给营业员发送请求,也就是给他加个顾客服务,V(customer);

(5):营业员进程中,在(5)的下面是叫号,说明营业员去申请顾客这个资源,所以P(customer);

5.

https://i-blog.csdnimg.cn/blog_migrate/221524cda9331bbcd326f52411919c84.png

解析

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

6.

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

解析

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