您的位置:首页 > 科技 > 能源 > 内核学习——3、自旋锁的作用及其实现

内核学习——3、自旋锁的作用及其实现

2024/9/24 5:28:26 来源:https://blog.csdn.net/wangyongh/article/details/139806187  浏览:    关键词:内核学习——3、自旋锁的作用及其实现
  • 作用:
    保护一段临界区的操作时独占的,不能由其他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寄存器

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com