首页 > > > 第4章 原子操作 第二节






-------------------------------------------------------------
上一章节说的原子操作,有同学在下面留言说,原子操作不是万能的吧?
确实是,原子操作不是万能的,体系结构在完成原子操作部分也是花费了很大的心思,不同下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)说,你们这些靓仔可以进去了。
------------------------------------------------------

原文作者:;如有侵权,请联系管理员删除。