您的位置:首页 > 其它

内核同步方法(一)--原子操作

2014-02-13 12:39 169 查看
简介:

现代操作系统中,同一时间可能有多个内核执行流在执行,因此内核需要一些同步机制来同步对共享数据的访问。而且在对称多处理器系统(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); 原子变量自减并返回
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: