Linux内核中自选锁API的选用

   spinlock_XXX有很多形式,有

   spin_lock()/spin_unlock(),

   spin_lock_irq()/spin_unlock_irq(),

   spin_lock_irqsave/spin_unlock_irqrestore()

   spin_lock_bh()/spin_unlock_bh()

   local_irq_disable/local_irq_enable

   local_bh_disable/local_bh_enable

那么,在什么情况下具体用哪个呢?这要看是在什么内核执行路径中,以及要与哪些内核
执行路径相互斥。我们知道,内核中的执行路径主要有:

 

1 用户进程的内核态,此时有进程context,主要是代表进程在执行系统调用等。

2 中断或者异常或者自陷等,从概念上说,此时没有进程context,不能进行 context switch。

3 bottom_half,从概念上说,此时也没有进程context。
4 同时,相同的执行路径还可能在其他的CPU上运行。

 

这样,考虑这四个方面的因素,通过判断我们要互斥的数据会被这四个因素中
的哪几个来存取,就可以决定具体使用哪种形式的spinlock。如果只要和其他CPU
互斥,就要用spin_lock/spin_unlock,如果要和irq及其他CPU互斥,就要用
spin_lock_irq/spin_unlock_irq,如果既要和irq及其他CPU互斥,又要保存
EFLAG的状态,就要用spin_lock_irqsave/spin_unlock_irqrestore,如果
要和bh及其他CPU互斥,就要用spin_lock_bh/spin_unlock_bh,如果不需要和
其他CPU互斥,只要和irq互斥,则用local_irq_disable/local_irq_enable,
如果不需要和其他CPU互斥,只要和bh互斥,则用local_bh_disable/local_bh_enable,
等等。值得指出的是,对同一个数据的互斥,在不同的内核执行路径中,
所用的形式有可能不同。

 

注意:对于单CPU且没有打开内核抢占,自旋锁定义为空函数。

 

摘自:

http://www.linuxforum.net/forum/showflat.php?Cat=&Board=linuxK&Number=377152&page=&view=&sb=&o=&fpart=all&vc=1

 

你可能感兴趣的:(api,linux内核)