在开始之前,先引入一个情景:
环境是一个餐厅的厨房,人物当然是一群厨师。
每当饭点,厨房的厨师需要做菜。厨师中又分有主厨,副厨,一些打下手的,还有学徒。显然厨师之间需要配合协助,同时对于多个打下手的人之间又会出现一些竞争(比如:刀具的使用,食材的选择,餐盘的使用等等),还有一些与做菜无关的人员,对于学徒,也许只是让他们在旁边拖拖地,洗洗盘,并没有严格的融入到做菜这个行为中去。
如果我们将这个情景抽象为一个操作系统中的情景,那么对应应该是这样的,各种刀具,餐具,食材等等厨房的用具都是硬件资源,厨师(除了主厨)的行为可以代表为一个进程(或线程),厨师之间的配合规则是一个同步的机制,厨师之间对于某些资源的争用,则是该片主要内容互斥问题。
引入厨房和厨师的介绍,希望可以让大家对并发控制所涉及的处理对象有一个直观的印象,对于并发控制的介绍,先从基础开始(对于基础已知,可跳过此处)。
术语 | 说明 |
原子操作 | 一个或多个指令的序列,对外不可分;即没有其他进程可以看到其中间状态或中断 |
临界区 | 是一段代码,在这段代码中进程将访问共享资源,当另外一个进程在这段代码中运行时,这个进程 不能在这段代码中执行 |
死锁 | 两个或两个以上的进程因其中的每个进程都在等待其他进程昨晚某些事情而不能继续执行的情形 |
互斥 | 当一个进程在临界区访问共享资源时,其他进程不能进入该临界区访问任何共享资源的情形 |
竞争条件 | 多个线程或者进程在读写一个共享数据是,结果依赖于他们执行的相对时间的情形 |
饥饿 | 指一个可运行的进程尽管能继续执行,但被调度器无限期的忽视,而不能被调度执行的情况 |
交互程度 | 关系 | 进程之间的影响 | 潜在控制问题 |
进程之间不感知 | 竞争 | *一个进程的结果与其他进程的活动无关 *进程的执行时间可能会受影响 |
*互斥 *死锁(可复用的资源) *饥饿 |
进程之间间接感知 (如共享对象) |
共享合作 | *一个进程的结构可能依赖于从其他进程获得的消息 *进程的执行可能会受到影响 |
*互斥 *死锁(可复用的资源) *饥饿 *数据一致性 |
进程直接感知 (存在通信原语) |
通信合作 | *一个进程的结果可能依赖于从其他进程获得的信息 *进程的即使可能会受到影响 |
*死锁(可消费的资源) *饥饿 |
(注:上表,均参考操作系统精髓与设计原理第6版中文译本,陈向群、陈渝,机械工业出版社)
由于上述进程交互之间的关系,同时多道程序设计系统中交替和重叠的执行模式下,进程的相对执行速度不可预测,所以会带来一下困难。
1,全局资源的共享并不安全
2、很难做好资源的分配
3、程序设计错误很难调试。
并发控制就需要处理好上述的困难&