Linux内核同步方法

原子操作

“原子”不可分割,原子操作,就是不能被分割的指令。
原子类型实际上是一个整数:

typedef struct {
    volatile int counter;
} atomic_t;

使用

定义
atomic_t v;
atomic_t u=ATOMIC_INIT(0);//定义并初始化

atomic_set(&v,4);
atomic_add(2,&v);
atomic_inc(&v);


/*将给定的原子变量减1,如果结果为0,就返回真,否则返回假*/
int atomic_dec_and_test(atomic_t *v);

还有其他原子操作,看见文件

自旋锁–spin lock

自旋:如果一个执行线程试图获得一个已经被持有的的自旋锁,那么该线程就会一直进行忙-旋转-等待锁重新可用。

定义和初始化

方式1:

 spinlock_t spinlock = SPIN_LOCK_UNLOCKED; 

方式2:

spinlock_t     spinlock ;
spin_lock_init(spinlock )

方式3:

DEFINE_SPINLOCK(mr_lock)

使用

spin_lock(&mr_lock,flags);
/*临界区*/
spin_unlock(&mr_lock,flags);

自旋锁可以使用在中断处理函数中,在中断处理中使用自旋锁时一定要注意:在获取锁之前首先禁止本地中断(在当前处理器上的中断请求),否则,中断处理程序就会打断正持有的内核代码,有可能会试图去征用这个已经被持有的自旋锁,这样一来,中断处理程序就会自旋,等待该锁重新可用,但是锁的持有者在这个中断处理程序执行完毕前不能能运行,造成双重请求死锁;

unsigned long long flags;
spin_lock_irqsave(&mr_lock,flags);
/*临界区*/
spin_unlock_irqrestore(&mr_lock,flags);

spin_lock_irqsave()保存中断的当前状态,并禁止本地中断,然后再去获取执行的锁,spin_unlock_irqrestore()对指定的锁解锁,让中断恢复到加锁之前的状态。

未完待续

你可能感兴趣的:(linux,kernel)