并发和竞态
1、什么是并发和竞态??
并发:指多个执行单元同时被执行,而并发执行单元对共享资源的访问容易导致竞态(共享资源:硬件资源和软件上的全局变量、静态变量)
2、并行的例子
(1)、多个cup:使用共同的系统总线,因为可以并发访问共同的外设和储存器
(2)、单个cpu:内核支持抢占,高优先级的进程可以打断正在内核执行的低优先级的进程
(3)、中断:(硬中断、软中断、Tasklet、底半部)如果中断处理程序正在访问进程的资源,中断也有可能被新的更高优先级的中断打断,因此,多个中断之间本身也可能引起并发而导致中断
3、怎样解决竞态问题??
互斥访问:一个执行单元在访问共享资源的时候,其他执行单元不能再访问这个资源
临界区:访问共享资源的代码区域称为临界区(critical sections),临界区需要某种互斥机制加以保护
互斥机制:(1)、中断屏蔽 (2)、原子操作 (3)、自旋锁 (4)、信号量
下面对几个互质机制分别讲解:
(1)、中断屏蔽
方法:进入临界区之前屏蔽系统中断,保证内核正在执行的进程不被中断处理程序所抢占。(linux内核的调度都依赖中断来实现,这样子内核抢占之间的并发也就避免了)
中断屏蔽使用的方法:
方法1
local_irq_disable() // 屏蔽中断
...
critical section // 临界区
...
local_irq_enable() // 开中断
方法2
local_irq_save(flags) // 屏蔽中断
...
critical section
...
local_irq_restore(flags)