一、概述
自旋锁设计的核心思想是设计一个在多处理器之间共享的全局变量锁V,并定义当V=1时为上锁状态,V=0时为解锁状态。
自旋锁不会导致进程睡眠和进程被调度,可以在中断上下文中使用。
在使用自旋锁保护的临界区内,不能使用完成量将进程调度到等待队列上睡眠。
在linux中获取自旋锁使用的是排队机制,谁先申请,就谁先获得。
二、相关文件
<include/linux/spinlock.h>
三、数据结构
/* 内核中自旋锁结构 */
typedef struct spinlock {
} spinlock_t;
四、重要函数
/* 定义自旋锁 */
spinlock_t ***_lock;
/* 初始化自旋锁 */
spin_lock_init(spinlock_t *);
/* 上锁和解锁,只能解决多进程间引起的竞态问题,不能解决中断引起的竞态问题 */
void spin_lock(spinlock_t *);
void spin_unlock(spinlock_t *);
/* 上锁和解锁,可以解决多进程间和中断引起的竞态问题 */
void spin_lock_irq(spinlock_t *);
void spin_unlock_irq(spinlock_t *);
/* 上锁和解锁,可以解决多进程间和中断引起的竞态问题,并且保存中断状态寄存器,不会导致中断丢失 */
void spin_lock_irqsave(spinlock_t *, unsigned long);
void spin_unlock_irqrestore(spinlock_t *, unsigned long);
五、其它
在spin_lock()函数首先调用preempt_disable宏,关闭调度器的可抢占性,这样当前进程在上锁后,会一直死等,尝试进入临界区,不会被调度器调度出去。所有使用自旋锁保护的临界区执行时间短,否则降低系统性能。