欲渡黄河冰塞川,将登太行雪满山
文章目录
- 2.3.7 生产者消费者问题
- 能否改变相邻的PV操作的顺序
- 知识回顾
- 2.3.8 多生产者多消费者问题
- 问题描述
- 关系分析
- 各个进程之间的PV操作
- 设置信号量
- 若是不设置互斥信号量
- 缓冲区大于一
- 知识回顾
- 2.3.9 吸烟者问题
- 知识回顾
- 2.3.10读者写者问题
- 实现
- 实现2
- 实现3
- 知识回顾
- 2.3.11哲学家进餐问题
- 解决方式
- 方案三
- 知识回顾
- 2.3.12 管程
- 知识总览
- 为什么引入管程?
- 管程的定义和基本特征
- 管程解决生产者消费者问题
- Java中类似管程的机制
- 知识回顾
- 2.4.1 死锁的概念
- 知识总览
- 什么是死锁
- 饥饿,死循环的区别
- 死锁产生的必要条件
- 什么时候会发生死锁
- 死锁的处理策略
- 知识回顾
- 2.4.2预防死锁
- 破坏互斥条件
- 破坏不剥夺条件
- 破坏请求和保持条件
- 破坏循环等待条件
- 知识回顾
- 2.4.3 避免死锁(银行家算法)
- 知识总览
- 什么是安全序列
- 银行家算法
- 安全状态
- 不安全状态
- 知识回顾
- 2.4.4死锁的检测和解除
- 死锁的检测
- 死锁的解除
- 知识回顾
2.3.7 生产者消费者问题
PV操作题目分析步骤:
1.关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。
2.整理思路。根据各进程的操作流程确定P、V操作的大致顺序。
3.设置信号量。并根据题目条件确定信号量初值.(互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少)
能否改变相邻的PV操作的顺序
这里没有将使用产品放入到PV之间是因为放入之后,原则上是可以的,但是对临界资源锁的时间也会变长,对系统的效率造成影响
知识回顾
2.3.8 多生产者多消费者问题
前V后P:同步关系中,前面时间发生之后发生V操作,后面事件发生之前发生P操作
问题描述
关系分析
各个进程之间的PV操作
互斥关系很简单:就是在访问临界资源之后分别对临界变量实行一个P操作 一个V操作,
同步关系:前面事件发生之后我们实行一个V操作,后面事件发生之前执行一个P操作
设置信号量
对于实现互斥关系来说,我们当然需要设置一个初值为1的互斥信号量
对于同步关系我们需要根据具体的情况设置同步变量的值,这里由于刚开始的时候盘中是没苹果的,所以设置apple 设置为0,同样的srange也设置为0 ,刚开始的时候盘子本来就是空的所以设置为1
若是不设置互斥信号量
通过分析我们发现即使不设置专门的互斥变量mutex,也不会出现多个进程同时访问盘中的现象,原因在于,本题中的缓冲区大小为1,在任何时刻,apple,orange,plate 三个同步信号量最多只有一个是1 ,因此在任何时刻,最多只有一个进程的P操作不会被阻塞,并顺利的进入临界区
缓冲区大于一
这个盘子并不是是一个人一个盘子,有可能两个进程申请的是一个盘子,所以有可能会数据覆盖,
知识回顾
2.3.9 吸烟者问题
知识回顾
2.3.10读者写者问题
实现
实现2
这里说一下为什么要加mutex。
比如:当count=0时,第一个读者进程执行到p(rw),rw=0,假设此时时间片到了,切换到第二个读者进程,第二个进程发现count=0,则执行p(rw),但是此时rw=0,于是第二个进程被堵在p(rw)这里,同理,后面的可能会有多个进程堵在p(rw),只有当第一个进程再次获得时间片,执行count++,让count不为0,然后其他进程就可以直接绕过if直接进行count++来访问文件,但是第三个读者进程和后面的几个可能堵在p(rw)的多个读者进程则必须得等count–为0后才可以再次和写进程竞争来访问文件,对count的访问没有做到一气呵成,会导致本来一些进程一直堵在p(rw)。
实现3
在上面的算法中,读进程是优先的,即当存在读进程时,写操作将被延迟,且只要有 一个读进程活跃,随后而来的读进程都将被允许访问文件。这样的方式会导致写进程可能长时间等待,且存在写进程“饿死”的情况。
若希望写进程优先,即当有读进程正在读共享文件时,有写进程请求访问,这时应禁止后续读进程的请求,等到已在共享文件的读进程执行完毕,立即让写进程执行,只有在无写进程执行的情况下才允许读进程再次运行。为此,增加一个信号量并在上面程序的writer()和 reader()函数中各增加一对PV操作,就可以得到写进程优先的解决程序
加了之后依然是可以实现多个读进程并行的,若是此时有读进程申请w释放w之后,此时count不为零,下一个读不会p(rw),所以依然进入读文件,若是此时是读过写,最后一个读文件未完成的时候rw未释放所以是不支持写的,但是写进程也申请了P(w),所以下一个读进程需要等这个写进程释放才能继续读
知识回顾
2.3.11哲学家进餐问题
解决方式
方案三
增加一个互斥信号量,使得只有左右筷子都存在的时候才会取,并且取筷子操作一气呵成,若是先进行第一个哲学家,然后进行4号哲学家,则依然可能会拿到一个筷子
知识回顾
2.3.12 管程
知识总览
为什么引入管程?
管程的定义和基本特征
管程解决生产者消费者问题
Java中类似管程的机制
知识回顾
2.4.1 死锁的概念
知识总览
什么是死锁
饥饿,死循环的区别
死锁产生的必要条件
什么时候会发生死锁
死锁的处理策略
知识回顾
2.4.2预防死锁
破坏互斥条件
破坏不剥夺条件
破坏请求和保持条件
破坏循环等待条件
(那如果说P3进程需要使用到1不是就要一直堵塞了?)
知识回顾
2.4.3 避免死锁(银行家算法)
知识总览
什么是安全序列
银行家算法
安全状态
不安全状态
知识回顾
2.4.4死锁的检测和解除
死锁的检测