(Linux内核同步机制之自旋锁)
我们已经分析了Linux内核同步机制的信号量,发现信号量其实是基于自旋锁来实现的,现在我们就来看看Linux内核中的自旋锁吧!
那么自旋锁有什么特性呢?
自旋锁最多只能够被一个可执行线程持有,如果一个执行线程试图获得一个已经被持有的自旋锁,那么该线程就会一直进行忙等待,直到自旋锁被释放重新可用;如果锁没有被持有,请求自旋锁的线程便能立刻得到它,继续执行。那么何为线程呢?线程也就是CPU调度执行的最小单位,一个单独的执行流。 在任意时间,自旋锁都可以防止多于一个的执行线程同事进入临界区,同时,同一个锁可以用在多个位置上。
自旋锁数据结构如下:
1 typedef struct {
2 raw_spinlock_t raw_lock;
3 #ifdef CONFIG_GENERIC_LOCKBREAK
4 unsigned int break_lock;
5 #endif
6 #ifdef CONFIG_DEBUG_SPINLOCK
7 unsigned int magic, owner_cpu;
8 void *owner;
9 #endif
10 #ifdef CONFIG_DEBUG_LOCK_ALLOC
11 struct lockdep_map dep_map;
12 #endif
13 } spinlock_t;
自旋锁定义也提供静态和动态方式。
DEFINE_SPINLOCK(x)
该宏声明一个自旋锁x并初始化它。
SPIN_LOCK_UNLOCKED
这个宏也用于初始化一个自旋锁。
DEFINE_SPINLOCK(x)等同于spinlock_t x = SPIN_LOCK_UNLOCKED
下一篇继续讲解自旋锁的操作API。