简介:
现代操作系统中,同一时间可能有多个内核执行流在执行,因此内核需要一些同步机制来同步对共享数据的访问。而且在对称多处理器系统(SMP)上,也需要同样的机制。多个执行线程同时访问和操作数据,就有可能出现共享数据被覆盖的情况,这是一种很难察觉的危险的情况。
原子操作可以保证指令以原子的方式执行,执行期间不会被打断。本人的理解是原子操作就是保证变量的读取-写入-回写这个过程原子的完成,不能够被打断,否则就有可能出现数据被覆盖的情况。linux内核提供了两组原子操作接口,分别是整数操作和单独的位操作。大多数体系结构会提供支持原子操作的简单指令。也就是把整个操作放到了一个指令中去执行,不会被中断打断(cpu在每条指令结束时候进行中断检测)。
原子整数操作:
针对整数的原子操作采用了一个特殊的数据类型,只能对atomic_t类型的数据进行处理。这里引入了一个新的数据类型,而不是使用c语言中的int直接定义一个整型变量。这样做让原子操作之接受atomic_t类型的数据,使之特殊化。这一结构的定义在<linux/types.h>中。
atomic_t结构:
typedef struct {
volatile int counter;
}atomic_t
原子操作的函数声明在<asm/atomic.h>中
ATOMIC_INIT(atomic_t *v,int i) 在声明一个atomic_t变量时候,将他初始化为i
int atomic_read(atomic_t *v); 读取原子变量
void atomic_set(atomic *v,int i); 设置原子变量
void atomic_add(int i,atomic *v); 原子变量之+i
void atomic_inc(atomic *v); 原子变量自加操作
void atomic_dec(atomic *v); 原子变量自减操作
int atomic_sub_and_test(int i,atomic_t *v); 原子变量-i,并判断是否为0
int atomic_add_negative(int i,atomic_t *v); 原子变量+i,并判断是否为负
int atomic_add_return(int i,atomic_t *v); 原子变量+i,并返回
int atomic_sub_return(int i,atomic_t *v); 原子变量-i,并返回
int atomic_inc_return(atomic_t *v); 原子变量自加并返回
int atomic_dec_return(atomic_t * v); 原子变量自减并返回