在单cpu中解决竞态的一种简单而有效的方法是在进入临界代码段时屏蔽系统的中断。这样就能防止正在执行的代码段被中断出来程序所抢占,防止了某些竞态条件的发生。总之一句话,就是程序在执行临界代码段时,中断不会发生。这里我们要知道linux内核中进程的调度都是依靠中断来实现调度,因此屏蔽中断意味着内核中的各个进程停止调度,在临界代码段中cpu只执行一个进程,并发就避免了。
中断屏蔽的使用方法:
local_irq_disable(); //屏蔽中断
..............................
................................
...............................//临界代码段
local_irq_enable(); //开中断
在中断屏蔽期间,内核停止调度,以及中断无法得到处理,这就非常的危险,所以我们要尽可能的快速执行临界代码段。
在这里还要注意local_irq_disable(); 和local_irq_enable(); 都只能禁用本CPU中断。如果涉及到SMP多CPU时,并不能避免竞态。
local_irq_save(flags);是除了禁止中断以外,还保存CPU中断位信息,local_irq_restore(flags);则开中断并还原之前的中断信息。
在中断执行过程存在中断的底半部的概念,就存在local_bh_disable();和local_bh_enable();来完成底半部的调用。