- 作用:
保护一段临界区的操作时独占的,不能由其他cpu或者线程同时访问破坏数据结构 - 多核系统SMP:
主要考虑一个cpu进入临界区之后,其他CPU不能再去进入这个临界代码区 - 单核系统:
不能被其他进程抢占 - 单核系统自旋锁实现:
两种情况打断:抢占、中断
preempt_disable():关闭抢占
preempt_enable():打开抢占 - 普通自旋锁接口:
spin_lock、spin_unlock:主要就是关闭和打开抢占
风险是关闭抢占只是组织了其他进程对CPU的抢占,但不能阻止中断程序对CPU的抢占,所以- 有更安全接口:
spin_lock_irqsave、spin_unlock_irqrestore:保存指令状态吗,关闭中断,关闭抢占
自旋锁保护的临界区代码和其调用的代码不允许睡眠 - 多处理器普通自旋锁:
typedef struct {
unsigned int slock; //自旋锁初始化是设为1,表示自旋锁可用
} raw_spinlock_t;
API:
spin_lock、__raw_spin_lock、raw_spin_lock_irqsave - 总结:
单处理器:
关闭内核抢占——》运行临界区代码——》开启内核抢占
更加安全的流程:
保存IF寄存器——》关闭当前CPU中断——》关闭内核抢占——》运行临界区代码——》开启抢占、cpu中断、恢复IF寄存器
SMP多处理器:
关闭内核抢占——》忙等待(获取自旋锁)——》运行临界区代码——》释放自旋锁——》开启内核抢占
更加安全的流程:
保存IF寄存器——》关闭当前CPU中断——》关闭内核抢占——》(忙等待)获取自旋锁——》运行临界区代码——》释放自旋锁、开启抢占、开启中断、恢复IF寄存器
04-21
1625
09-13
2万+