一、并发
1、相关术语
- 原子操作(atomic operation)——不可分割的操作;
- 临界区(critical section)——不允许多个进程同时进入的一段访问共享资源的代码;
- 死锁(deadlock)——两个及以上进程因每个进程都在等待其他进程做完某事(如释放资源),而不能继续执行;
- 活锁(livelock)——两个及以上进程,为响应其他进程中的变化而不断改变自己的状态,但是没有做任何有用的工作;
- 互斥(mutual exclusion)——当一个进程在临界区访问共享资源时,不允许其他进程进入访问;
- 竞争状态(race state)——多个进程/线程读写共享数据,其结果依赖于它们执行的相对速度;
- 饥饿(starvation)——可运行的进程长期未被调度执行;
2、并发的基本特征
并发:在同一时间间隔内发生的进程或线程交替地共享相同的资源。
异步性:相对执行速度不可预测是多道程序系统的基本特征。
3、竞争
竞争出现的条件:
- 在并发环境中发生;
- 多个进程共享数据;
- 多个进程读取且至少一个进程写入;
- 共享数据的最终结果取决于进程执行的相对速度;
竞争引发的控制问题:互斥、死锁、饥饿。
4、操作系统需要考虑的问题
- 并发环境中跟踪每个进程,知道它们的状态;
- 为每个进程分配和回收各种资源:处理器、存储器、文件、I/O设备;
- 保护进程拥有的数据和物理资源;
- 保证进程的结果与相对执行速度无关;
5、进程间的互相作用
间接作用:因为共享而产生竞争,通过共享实现合作;
直接作用:通过通信的合作(进程知道其他进程的存在);
二、互斥
1、互斥的要求
- 在具有相同资源或共享对象的临界区的所有进程中,一次只允许一个进程进入临界区——强制排它;
- 一个在非临界区停止的进程必须不干涉其他进程——充分并发;
- 没有进程在临界区中时,任何需要访问临界区的进程必须能够立即进入——空闲让进;
- 决不允许出现一个需要访问临界区的进程被无限延迟——有限等待;
- 相关进程的执行速度和处理器数目没有任何要求或限制(满足异步条件)——满足异步;
- 若进程无法进入临界区则应该立即释放处理器以防止进程忙等待——让权等待;
2、实现互斥的尝试方案
1、第一种方案
该方案硬性规定了进程进入临界区的顺序——轮流进入,可以保证互斥,但难以支持并发处理。
存在的问题:
- 忙等待(busy waiting):为了等待一事件的发生,重复执行一段循环代码——浪费CPU时间;
- 必须轮流进入临界区的设计不合理,限制了进程的推进速度;
- 如果一个进程失败那么另一个进程将被永久阻塞;
2、第二种方案
该方案中每个进程有自己进入临界区的钥匙,每个进程控制一个标志位表示自己进入和离开临界区,进程先检查对方的标志再设置自己进入临界区的标志。
存在的问题:
- 一个进程在临界区内失败,则另一个进程将被永远阻塞
- 不能保证互斥——两个进程可能同时进入临界区
这是一个错误的方案,不能保证进程的运行结果与执行速度无关。