目录
恋词强化
操作系统C2-2.3.1~2.3.9
2.3.1 进程同步、进程互斥
- 临界资源访问过程四个部分
- 进入区:设置标志,阻止其他进入 -> 上锁
- 临界区:访问临界资源的那段代码,又称临界段
- 退出区:清除标志 -> 解锁
- 剩余区:代码中的其他部分
2.3.2 进程互斥的软件实现方法
Peterson 算法主要思想:进入区:
- 主动争取
- 主动谦让
- 检查对方是否也想使用,且最后一次是不是自己数列“客气话”(过年收红包)
其实双标志先检查的算法思想其实是很好的,先检查临界区资源是否有人要使用,如果没人使用我自己就给他上一个锁,但是导致这个算法问题的关键在于检查和上锁这两个动作并不能一气呵成(下面小节用硬件来令这两个动作一气呵成就很完美了。
2.3.3 进程互斥的硬件实现方法
- 硬件方法的优点:适用于任意数目的进程,而不管是单处理机还是多处理机;简单、容易验证其正确性。可以支持进程内有多个临界区,只需为每个临界区设立一个布尔变量。
- 硬件方法的缺点:进程等待进入临界区时要耗费处理机时间,不能实现“让权等待”。从等待进程中随机选择一个进入临界区,有的进程可能一直选不上,从而导致“饥饿”现象。
2.3.4 信号量机制
- 记录型信号量很重要!!!!! PV操作自己多写多理解!
2.3.5 用信号量实现进程互斥、同步、前驱关系
- 实现进程互斥
- 临界区之前对信号量执行
P
操作 - 临界区之后对信号量执行
V
操作
- 临界区之前对信号量执行
- 实现进程同步
- “前操作”之后执行
V
操作 - “后操作”之前执行
P
操作
- “前操作”之后执行
- 实现进程的前驱关系
- 在每个“前操作”之后执行
V
操作 - 在每个“后操作”之前执行
P
操作
- 在每个“前操作”之后执行
- 这是考试的重点!大题必定会考信号量!!
2.3.6 经典问题 - 生产者-消费者问题
单生产者-单消费者
单生产者-多消费者
多生产者-多消费者
2.3.7 经典问题 - 读者-写者问题
2.3.8 经典问题 - 哲学家进餐问题
2.3.9 管程
- 管程其实应用了封装的思想,把进程同步、互斥这些复杂的细节隐藏在了管程定义的函数之内,而对外只提供了一个简单易用的函数调用的接口,就有点像面向对象程序设计中的“类”。