竞争
- 竞争发生在当多线程或者进程同时访问同一个内存以及别的共享资源,但是执行的顺序有交叉时。
- 一般来说,局部变量和参数由于对每个线程是独立的,不会发生竞争。竞争通常发生在全局变量,堆变量等上。
- 临界区: 程序中共享内存在执行时会被访问的部分
被否决的解决方案
-
屏蔽中断
- 解决竞争最简单的方法就是进入临界区(开始读写公共内存)时屏蔽掉中断,但是这种方法对于多CPU无效,因为该内存可能会被别的CPU中的程序访问。现在更好的方法是屏蔽那片内存的访问(以前是通过锁住总线解决的)。但是还是会有问题,因为这样也屏蔽了时钟中断,可能会陷入死锁
-
锁变量
- 第二种想法就是加锁,但是在程序级别简单的加锁是没用的,因为加锁需要先测试相等,然后增加或减少锁变量两个步骤,这之间可能也会存在竞争。所以要么在硬件层面实现原子操作的加锁(TSL),要么使用下面的算法。
忙等待的互斥
-
自旋锁
- 自旋锁就是在测试变量不处理的时候进行忙等待。这种方法是假设忙等待的时间很短,一般在内核中使用。和别的方法比优点在于不用切换进程。在早期没有硬件支持的时候,有严格轮换法和Peterson算法两种程序级别的解决方案,但是现在有了硬件级别的TSL操作,更加简单了
- 注意含TSL的算法和Peterson遇到进程有优先级时都会遇到因为优先级反转而死锁的现象。 </
- 自旋锁就是在测试变量不处理的时候进行忙等待。这种方法是假设忙等待的时间很短,一般在内核中使用。和别的方法比优点在于不用切换进程。在早期没有硬件支持的时候,有严格轮换法和Peterson算法两种程序级别的解决方案,但是现在有了硬件级别的TSL操作,更加简单了