第4章 原子操作 第二节
发布日期:2021-06-30 18:59:12 浏览次数:2 分类:技术文章

本文共 1151 字,大约阅读时间需要 3 分钟。

640?wx_fmt=png640?wx_fmt=png640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

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

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

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

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

640?wx_fmt=jpeg

转载地址:https://linus.blog.csdn.net/article/details/98477031 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:周一地铁遐想
下一篇:16进制数组转字符串

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月10日 14时22分53秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章