linux的原子操作:
原子操作就是不可中断的一个或者一系列操作。
我能理解原子操作的概念,但总是纠结它到底是怎么实现?
1.实现原理:CPU提供了在指令执行期间对总线加锁的手段。CPU上有一根引线连接到北桥,如果汇编语言中有相应的指令控制这根连接到北桥的引线,
经过汇编后,相应的机器码就使CPU在执行这条指令的时候拉低连接到北桥的引线,持续到这条指令结束时放开,从而把总线锁住。
2.原子操作只能对int和bit型的数据结构进行操作。
3.互斥锁是借助原子操作实现的。
4.原子整数操作的结构与函数
typedef struct {
volatile int
counter;
} atomic_t;
定义原子变量需使用 atomic_t 结构来定义,volatile 关键字的含义为不允许变量被缓存。
#define atomic_read(v) ((v)->counter)
#define atomic_set(v, i) (((v)->counter) = (i))
static inline void atomic_add(int i, atomic_t *v)
static inline void atomic_sub(int i, atomic_t *v)
static inline void atomic_inc(atomic_t *v)
static inline void atomic_dec(atomic_t *v)
static inline int atomic_sub_and_test(int i, atomic_t
*v)
static inline int atomic_dec_and_test(atomic_t *v)
static inline int atomic_inc_and_test(atomic_t *v)
static inline int atomic_add_negative(int i, atomic_t
*v)
static inline int atomic_add_return(int i, atomic_t *v)
static inline int atomic_sub_return(int i, atomic_t *v)
#define atomic_inc_return(v)
(atomic_add_return(1, v))
#define atomic_dec_return(v)
(atomic_sub_return(1, v))
static inline int atomic_add_unless(atomic_t *v, int a, int
u)
#define atomic_inc_not_zero(v) atomic_add_unless((v), 1,
0)
#define atomic_clear_mask(mask, addr)
#define atomic_set_mask(mask, addr)
5.原子位操作
#define set_bit(nr,p) ATOMIC_BITOP(set_bit,nr,p)
#define clear_bit(nr,p) ATOMIC_BITOP(clear_bit,nr,p)
#define change_bit(nr,p) ATOMIC_BITOP(change_bit,nr,p)
#define test_and_set_bit(nr,p)
ATOMIC_BITOP(test_and_set_bit,nr,p)
#define test_and_clear_bit(nr,p)
ATOMIC_BITOP(test_and_clear_bit,nr,p)
#define test_and_change_bit(nr,p)
ATOMIC_BITOP(test_and_change_bit,nr,p)