操作系统这本书里有一章是讲进程的,其中一节讲的进程同步,一开始看的有点懵,尤其里边那几行代码。后来看到个视频里讲解P–V操作,说的就是这个,豁然开朗。
P–V操作(也称同步操作):
同步机制应该遵循的准则:
1. 空闲让进
2. 忙则等待
3. 有限等待
4. 让权等待
一些概念:
临界资源:诸进程需要互斥方式对其进行共享资源,如打印机、磁带机。
临界区:每个进程访问临界资源的那段代码。
P操作(申请资源):也称为down()、wait()操作 使S=S-1,若S<0,进程暂停执行,放入信号量的等待队列。
V操作(释放资源):也称为up()、signal()操作,使S=S+1,若S<=0,唤醒等待队列的一个进程。
下面以一张仓库搬运工的图来看一下P–V操作是怎么进行的:
这整个的工作流程是把A仓库的货物搬到B仓库。
搬运工甲在中转站空闲的时候可以把A仓库的货物搬到中转站,也就是执行P操作。
搬到中转站之后换搬运工乙来执行V操作,把货物搬到B仓库。
这个是单缓冲区,也就是一个缓冲区的,下面来看一下书上的一个经典的进程同步问题:读者—写者问题:
首先这个问题的条件是:
- 允许多个读者同时执行读操作;
- 不允许读者、写者同时操作;
- 不允许多个写者同时操作。
读者优先:
读者来:
1. 无读者、写者,新读者可以读
2. 有写者等,但有其他读者正在读,则新读者也可以读
3. 有写者写,新读者等
写者来:
- 无读者,新写者可以写
- 有读者,新写者等
- 有其他写者,新写者等
它的PV原语可以写成如下:
生产者: | 消费者: |
---|---|
生产一个产品; | P(s2); |
P(s1); | P(mute); |
P(mute); | 从缓冲区取产品; |
送产品到缓冲区; | V(mute); |
V(mute); | V(s1); |
V(s2); | 消费产品; |
s1初值为n,s2初值为0,mute(缓冲区资源)初值为1.
先说到这里,理解不深,如果大家有不准确或不清楚的地方可以和小编交流交流。