操作系统 day16(生产者-消费者问题)
生产者-消费者问题
- 分析

- “前V后P”,这里的P可以看作-1,这里的V可以看作+1 。
- 由于full初值为0,每放进一个临界资源就+1,所以在消费者消费之前,要先看看缓冲区里有没有临界资源,full能不能-1,即先P(full)。在消费者消费之后,就对empty+1,即V(empty)
- 由于empty的初值为n,每放进一个临界资源就-1,所以在生产者生产之前,要先看看缓冲区里有没有空位,empty能不能-1,即先P(empty) 。在生产者生产之后,就对full+1,即V(full)
- 互斥信号量的初值一般为1,同步信号量的初值要看对应资源的初值是多少
- 代码实现

- 实现互斥是在同一进程中进行一对PV操作。实现同步是在一个进程中执行P,另一个进程中执行V。
- 能否改变相邻的P、V操作顺序

- 实现互斥P操作一定要在实现同步的P操作之后,即P(mutex)一定要在另一个P的后面。这是由于P操作会导致阻塞,所以对顺序有要求
- V操作不会导致阻塞,只会唤醒,所以两个V操作的顺序可以交换
- 由于临界区的代码要尽可能短,否则会对系统的效能有一定的影响,所以红框中的代码就不放到PV操作之间了