并发:concurrency
竟态:race condition
互斥:mutex
临界区:critical sections
解决竟态问题的方法是对共享资源实现互斥访问。
互斥访问:指一个执行单元在访问共享资源的时候,其他执行单元被禁止访问。
共享资源的代码区域称为临界区,临界区需要以某种互斥机制加以保护。
实现互斥的方法:中断屏蔽,原子操作,自旋锁 和 信号量。
1. 中断屏蔽
即在进入临界区之前屏蔽系统中断,系统一般具有屏蔽中断和打开中断的功能,这样可以防止某些竟态条件的发生。
local_irq_disable() //屏蔽中断
---
critical section //临界区
---
local_irq_enable() //开中断
还有:
local_irq_save(flags) //除了禁止中断外,还保存目前CPU的中断位信息
local_irq_restore(flags) //与上相反,解除禁止,并把CPU中断位信息上报。
local_bh_disable(); //禁止中断的底半部
local_bh_enable(); //使能中断的底半部
由于linux系统的异步I/O,进程调度等重要操作都依赖中断,中断对于内核运行非常重要,在屏蔽期间,所有的中断都无法得到处理,因此长时间屏蔽中断是很危险的。慎用。