Linux spin_lock的实现
Spin_lock是Linux内核的一种同步机制。内核代码可以通过获得spin_lock宣称对某一资源的占有,直到其释放该spin_lock;如果内核代码试图获得一个已经锁定的spin_lock,则这部分代码会一直忙等待,直到获得该spin_lock。
Spin_lock的kernel中的实现对单核(UP),多核(SMP)有不同的处理方式。对单核来说,如果spin_lock不处于中断上下文,则spin_lock锁定的代码丢失CPU拥有权,只会在内核抢占的时候发生。所以,对于单核来说,只需要在spin_lock获得锁的时候禁止抢占,释放锁的时候开放抢占。对多核来说,存在两段代码同时在多核上执行的情况,这时候才需要一个真正的锁来宣告代码对资源的占有。
在include/linux/spinlock.h文件中,给出了UP,SMP所涉及的不同的头文件,也很清楚的将两者实现的不同体现出来。/** include/linux/spinlock.h - generic spinlock/rwlock declarationshere's the role of the various spinlock/rwlock related include files:*
* on SMP builds:
**asm/spinlock_types.h: contains the arch_spinlock_t/arch_rwlock_t and theinitializers
** linux/spinlock_types.h:defines the generic type and initializers
** asm/spinlock.h: contains the arch_spin_*)/etc. lowl