文章目录
- 9.1背景知识
- 9.2一些概念part1
- 9.3一些概念part2
- 9.4一些概念part3
- 9.5临界区
- 9.6禁用硬件中断
- 9.7基于软件的解决方案
- 9.8更高级的抽象 --- 基于原子操作
9.1背景知识
1、如果资源处理不当,可能会出现一些意想不到的情况,合作的风险
独立的线程:
- 不和其他线程共享资源或状态
- 确定性->输入状态决定结果
- 可重现->能够重现起始条件
- 调度顺序不重要
合作线程:
- 在多喝线程中共享状态
- 不确定性
- 不可重现(不可重复性)
这些不确定性和不可重复以意味着bug可能是间歇性发生的,也就是合作是有风险的。
2、为什么要合作
1)共享资源
资源是需要共享的,因为进程可能要访问同一个文件。
2)加速
通过并行和并发,可以提高系统的效率,实现更有效的资源的利用。相当于把一个大的任务,拆分成多个小的任务,每个任务通过并行的执行提高系统的性能。
3)模块化
在设计时将一个大的工作,变成一个小的工作,使之具有模块化,使系统便于扩展。
3、问题出现的原因
例子:
以上四条汇编指令的意思是:
1)把next_pid赋值给寄存器1(Reg1)
2)再把这个寄存器1存到了new_pid这个内存单元的去。此时new_pid就具有了next_pid这个值。
3)寄存器1加一操作。
4)完成next_pid的值增加了一个1的操作。
总的实现过程:
先把new_pid = next_pid,然后next_pid再加1.
但是,如果这时有两个进程,就会出现意想不到的情况:
问题产生的原因:
在第二次进程的上下文切换时候,进程1的寄存器恢复之后依然100的值,是的next的值无法更新称为102。最终产生了切换使得最终的结果不是想要的结果。这是一种典型的异常现象。
9.2一些概念part1
由于上述产生的异常现象(称之为竞态条件Race Condition),这就是为什么要引入同步互斥这些机制的原因,就是要解决这种不确定性的问题。
1、系统缺陷:结果依赖于并发执行或者事件的顺序/时间
不确定性
不可重现
2、怎样避免竞态?
让指令不被打断(比如上述的四条机器指令不被打断)
3、不被打断的方法:原子操作(Atomic Operation)—不可被打断操作
原子操作是指一次不存在任何中断或者失败的执行
- 该执行成功结束
- 或者根本没有执行
- 并且不应该发现任何部分执行的状态
实际上操作往往不是原子的
- 有些看上去是原子操作,实际不是
- 连x++这样简单的语句,实际上是由3条指令造成的
- 有时候甚至连条单条机器指令都不是原子的
例子:
所以需要后续的同步机制,确保或者是A赢或者是B赢。
4、一些基本概念
- 临界区(Critical section)
临界区是指进程中的一段需要访问共享资源并且当另一个进程处于相应代码区域时便不会被执行的代码区域