目录
1.生产者消费者问题
消费者进程从缓冲区拿走数据。缓冲区有空闲的时候,生产者就可以继续生产,所以,当消费者从缓冲区拿走数据的时候,如果有生产者处于阻塞状态,消费者应该将生产者唤醒,让其进入就绪态,但是回到就绪态,不意味着生产者会立即写数据1
缓冲区是临界资源必须互斥访问,不然会发生数据覆盖。
分析pv操作:
代码实现:
执行V操作的进程会唤醒相应的执行P操作的进程。
同步和互斥的执行顺序能颠倒吗?
p顺序不可颠倒,可能出现死锁问题。
能否将使用产品的带啊放入pv操作之间,答案是可以的,但是这就造成了临界区间的代码变长,锁的时间也会变长, 不利于各个进程交替使用临界区资源。
2. 多生产者-多消费者模型
多指多类,所生产所消费的产品类型不一样。
代码实现:
父母在放入水果前首先要检查一下盘子是否为空,对盘子进行一个p操作,放入水果后,对水果这个信号量进行一个V操作,唤醒相应的水果P操作的进程,然后对盘子信号量进行V操作,唤醒对盘子信号量相应的P进程。
儿女检查是否有水果,拿走后对盘子进行V操作告诉盘子为空。
这就是同步关系的实现。对于放入水果和取走水果的过程是互斥的,只能有一个进程在放入或者拿走,所以要对临界区资源进行上锁:
可能会产生数据覆盖
3.吸烟者问题
生产者:可能生产三种不同类型的产品
实现:
提供者:
供应者:
4.读者 写者问题
可以多个读者读:
不会更改数据,多个读是可以允许的。更改包括清空,所以消费者不能。
写者不可以
问题分析:
这种没有办法实现读者与读者不可以同时访问这个共享文件的操作:解决:
解决办法,再设置一个信号量:
解决了写者解饿问题:
5.哲学家进餐问题
无根筷子,代表五个临界资源,每个哲学家要两个临街资源
哲学家两件事:
方案②
方案三:
6.管程
类似于类。
管城中定义的数据结构,只能通过调用管城的函数来实现。