对linux驱动编程中的“信号量”和“自旋锁”的一些理解

1. 如果一个非抢占的单处理器系统进入一个锁上的自旋, 它将永远自旋; 没有其他的线程再能够获得CPU 来释放这个锁. 因此, 自旋锁在没有打开抢占的单处理器系统上的操作被优化为什么不作;

2. 持有所的代码(临界代码),必须原子性的,即它不能睡眠,否则系统可能完全死锁。

3. 持有自旋锁时禁止中断

4. 不管是信号量还是自旋锁,都不允许第2次请求锁(在临界代码中调用另外一个函数,而这个函数也请求同一个锁)

 

自旋锁API

--加锁API----

void spin_lock(spinlock_t *lock); 
void spin_lock_irqsave(spinlock_t *lock, unsigned long flags); //禁止中断,flags 记录中断
void spin_lock_irq(spinlock_t *lock); //
void spin_lock_bh(spinlock_t *lock)//禁止软件中断,硬件中断还是打开

--对应的释放API----

void spin_unlock(spinlock_t *lock);
void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags);
void spin_unlock_irq(spinlock_t *lock);
void spin_unlock_bh(spinlock_t *lock);

 

一套非阻塞的自旋锁操作:
 
int spin_trylock(spinlock_t *lock);
int spin_trylock_bh(spinlock_t *lock);
这些函数成功时返回非零( 获得了锁 ), 否则 0. 没有"try"版本的禁止中断的自旋锁.

 

 

解锁

void read_unlock(rwlock_t *lock);
void read_unlock_irqrestore(rwlock_t *lock, unsigned long flags)
void read_unlock_irq(rwlock_t *lock);
void read_unlock_bh(rwlock_t *lock);

 

写自旋锁:

void write_lock(rwlock_t *lock);
void write_lock_irqsave(rwlock_t *lock, unsigned long flags);
void write_lock_irq(rwlock_t *lock);
void write_lock_bh(rwlock_t *lock);
int write_trylock(rwlock_t *lock);    // 
 解锁
void write_unlock(rwlock_t *lock);
void write_unlock_irqrestore(rwlock_t *lock, unsigned long flags);
void write_unlock_irq(rwlock_t *lock);
void write_unlock_bh(rwlock_t *lock);

 

你可能感兴趣的:(对linux驱动编程中的“信号量”和“自旋锁”的一些理解)