原子操作

1.原子变量:

原子操作函数所使用的变量。

变量定义在内核源码:include/linux/Types.h中

typedef struct {
    int counter;
} atomic_t;

2.原子操作:

原子操作从物理意义上来理解就是,操作的最小单位,不能在分割了。顾名思义,原子操作,就是对原子变量的操作,它将对一个数据的“读取→修改→回写”变成了一个不可打断的操作。它的执行是封闭的,不可打断的。

3.linux中设计原子操作机制的原因:

在允许多线程的程序中而对于某一资源我们只希望有一个线程操作它,我会想使用全局变量去作为标记变量。两个线程A、B,当A读取完该全局变量后正在修改它的值,而这时B进程正在读取该全局变量,对于B进程而言此全局变量的值和A进程是一样,这样A、B都可以正常进行,就与我们的意愿相违了,所以我们会想是不是可以定义一个变量,将对一个变量值得读取修改回写变成一个不可打断的操作,于是我们就有了原子变量。

(1)在单处理器中,防止进程并发(或者上述中的多线程程序中)对共享数据的修改,而出现不是想要的到的结果。也就是将每个线程对共享据的“读取→修改→回写”变成一条指令,一个不可打断的操作(原子操作)。

(2)在SMP(对称多处理结构)系统中,单独的原子操作就不能避免(1)中的现象(因为多个cpu可能同时访问某一个共享数据),因此产生了锁机制,其配合和锁机制防止(1)出现的现象。

4.原子操作API定义在include/linux/Atomic.h中,包括:

atomic_read(atomic_t *v);
//该函数对原子类型的变量进行原子读操作,它返回原子类型的变量v的值。

atomic_set(atomic_t *v, int i);
//该函数设置原子类型的变量v的值为i。 

void atomic_add(int i, atomic_t *v);
//该函数给原子类型的变量v增加值i。

atomic_sub(int i, atomic_t *v);
//该函数从原子类型的变量v中减去i。

int atomic_sub_and_test(int i, atomic_t *v);
//该函数从原子类型的变量v中减去i,并判断结果是否为0,如果为0,返回真,否则返回假。

void atomic_inc(atomic_t *v);
//该函数对原子类型变量v原子地增加1。

void atomic_dec(atomic_t *v);
//该函数对原子类型变量v原子地减1。

int atomic_dec_and_test(atomic_t *v);
//该函数对原子类型的变量v原子地减1,并判断结果是否为0,如果为0,返回真,否则返回假。

int atomic_inc_and_test(atomic_t  *v);
//该函数对原子类型的变量v原子地增加1,并判断结果是否为0,如果为0,返回真,否则返回假。

int atomic_add_negative(int i, atomic_t *v);
//该函数对原子类型的变量v原子地增加I,并判断结果是否为负数,如果是,返回真,否则返回假。

int atomic_add_return(int i, atomic_t *v);
//该函数对原子类型的变量v原子地增加i,并且返回指向v的指针。

int atomic_sub_return(int i, atomic_t *v);
//该函数从原子类型的变量v中减去i,并且返回指向v的指针。

int atomic_inc_return(atomic_t *v);
//该函数对原子类型的变量v原子地增加1并且返回指向v的指针。 

int atomic_dec_return(atomic_t *v);
//该函数对原子类型的变量v原子地减1并且返回指向v的指针。

你可能感兴趣的:(知识积累)