[初级知识]Linux内核开发中的同步问题

几种常见的用于内核中的代码同步的方法:


  • 原子操作
  • spinlock
  • 信号量

1. spinlock

使用自旋锁用来解决内核开发过程中遇见的一些常见的内核同步问题,它主要用在下面的几个方面:

  • 在中断的上下文中,需要关闭本地中断,不然本地中断会打断自旋锁,造成自旋锁死锁的问题
  • 没有需要睡眠等待的地方
  • 短期的锁定
  • 低开销的地方

自旋锁有点类似于互斥锁,但区别于互斥锁最大的地方在于二者是否会引起调用者进入睡眠如果要获取的锁此刻被别人占有的话,自旋锁因为持锁者所持锁的时间比较短,所以在没能立刻获取锁的时候,就在原地等待,而不是像互斥锁一样进入睡眠,所以说来,自旋锁spinlock的效率要高于互斥锁的。

spinlock的使用场景:

  • 进程的上下文
  • 中断的上下文
  • 支持内核抢占的内核版本或者多核SMP的情况下需要

2. 信号量

信号量是内核同步的另一个主要的角色,它与spinlock有着不一样的应用场景

  • 需要持有睡眠或者等待时间较长的地方
  • 需要长期锁定的地方

信号量没有自旋锁使用的广泛,由于信号量自身有着自身的一些劣势,比如:

  • 信号量在持有期间可以被其他抢占的
  • 只能在进程的上下文,因为信号量在不能立即获取时候,将调用者置为睡眠的状态,所以,他只能活在进程的上下文

备注:
进程的上下文在Linux中是被做了定义的了,Linux的每一个进程有一个对应的结构体,即task_struct,进程相关的数据、代码、等都会被记录在该结构体中,也即该进程的上下文

—————————-未完成待续——————————–

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值