-------------------------------------------------------------
上一章节说的原子操作,有同学在下面留言说,原子操作不是万能的吧?
确实是,原子操作不是万能的,体系结构在完成原子操作部分也是花费了很大的心思,不同下CPU 应该有自己的实现方式。
CPU 在进行原子操作的时候,其他代码是不能执行的,比如,教室里面只有一个游戏机,A 同学在游戏机上玩的时候,其他人是不能再去占领他的东西的,所以在编写原子操作相关的代码的实话,只能在那些特别重要的整型变量上去使用,不可能让一个函数去实现原子操作,这样系统调度就出现问题了。
原子操作代码位置:
./include/asm-generic/atomic.h
原子操作初始化:
#define ATOMIC_INIT(i) { (i) } |
原子数据类型,我们看Linux 内核代码,发现内核把原子当作成一个数据类型来声明,如果你这个变量是原子类型的,以后的操作就应该使用原子操作来使用它。
typedef struct { int counter; } atomic_t; #ifdef CONFIG_64BIT typedef struct { long counter; } atomic64_t; #endif |
原子操作自增:
static inline void atomic_add(int i, atomic_t *v) { atomic_add_return(i, v); } |
再调用
#ifndef atomic_add_return static inline int atomic_add_return(int i, atomic_t *v) { unsigned long flags; int temp; raw_local_irq_save(flags); /* Don't trace it in an irqsoff handler */ temp = v->counter; temp += i; v->counter = temp; raw_local_irq_restore(flags); return temp; } #endif |
其中的原理就是锁住中断,等操作完成后,再释放中断,比如这里有一个门,门后面的操作就是更换衣服,正常情况下,所有人都可以进去里面更换衣服,但是呢?有一个明星过来了,它就是原子,原子跟老板(CPU)说,我换衣服的时候,其他人都不能进来哈,然后它就进入里面换衣服了,等它换好衣服了,出来了,老板(CPU)说,你们这些靓仔可以进去了。
------------------------------------------------------