几种常见的用于内核中的代码同步的方法:
- 原子操作
- spinlock
- 信号量
1. spinlock
使用自旋锁用来解决内核开发过程中遇见的一些常见的内核同步问题,它主要用在下面的几个方面:
- 在中断的上下文中,需要关闭本地中断,不然本地中断会打断自旋锁,造成自旋锁死锁的问题
- 没有需要睡眠等待的地方
- 短期的锁定
- 低开销的地方
自旋锁有点类似于互斥锁,但区别于互斥锁最大的地方在于二者是否会引起调用者进入睡眠如果要获取的锁此刻被别人占有的话,自旋锁因为持锁者所持锁的时间比较短,所以在没能立刻获取锁的时候,就在原地等待,而不是像互斥锁一样进入睡眠,所以说来,自旋锁spinlock的效率要高于互斥锁的。
spinlock的使用场景:
- 进程的上下文
- 中断的上下文
- 支持内核抢占的内核版本或者多核SMP的情况下需要
2. 信号量
信号量是内核同步的另一个主要的角色,它与spinlock有着不一样的应用场景
- 需要持有睡眠或者等待时间较长的地方
- 需要长期锁定的地方
信号量没有自旋锁使用的广泛,由于信号量自身有着自身的一些劣势,比如:
- 信号量在持有期间可以被其他抢占的
- 只能在进程的上下文,因为信号量在不能立即获取时候,将调用者置为睡眠的状态,所以,他只能活在进程的上下文
备注:
进程的上下文在Linux中是被做了定义的了,Linux的每一个进程有一个对应的结构体,即task_struct,进程相关的数据、代码、等都会被记录在该结构体中,也即该进程的上下文
—————————-未完成待续——————————–