ITPub博客

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

第4章 原子操作 第二节

作者:dapan 时间:2019-08-06 12:57:07 0 删除 编辑








-------------------------------------------------------------


上一章节说的原子操作,有同学在下面留言说,原子操作不是万能的吧?

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

------------------------------------------------------


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

上一篇: Ansible 入门秘诀
请登录后发表评论 登录
全部评论

注册时间:2020-08-07

  • 博文量
    4504
  • 访问量
    87280