第4章 原子操作 第二节
-------------------------------------------------------------
上一章節(jié)說的原子操作,有同學(xué)在下面留言說,原子操作不是萬能的吧?
確實是,原子操作不是萬能的,體系結(jié)構(gòu)在完成原子操作部分也是花費了很大的心思,不同下CPU 應(yīng)該有自己的實現(xiàn)方式。
CPU 在進(jìn)行原子操作的時候,其他代碼是不能執(zhí)行的,比如,教室里面只有一個游戲機(jī),A 同學(xué)在游戲機(jī)上玩的時候,其他人是不能再去占領(lǐng)他的東西的,所以在編寫原子操作相關(guān)的代碼的實話,只能在那些特別重要的整型變量上去使用,不可能讓一個函數(shù)去實現(xiàn)原子操作,這樣系統(tǒng)調(diào)度就出現(xiàn)問題了。
原子操作代碼位置:
./include/asm-generic/atomic.h
原子操作初始化:
#define ATOMIC_INIT(i) { (i) } |
原子數(shù)據(jù)類型,我們看Linux 內(nèi)核代碼,發(fā)現(xiàn)內(nèi)核把原子當(dāng)作成一個數(shù)據(jù)類型來聲明,如果你這個變量是原子類型的,以后的操作就應(yīng)該使用原子操作來使用它。
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); } |
再調(diào)用
#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 |
其中的原理就是鎖住中斷,等操作完成后,再釋放中斷,比如這里有一個門,門后面的操作就是更換衣服,正常情況下,所有人都可以進(jìn)去里面更換衣服,但是呢?有一個明星過來了,它就是原子,原子跟老板(CPU)說,我換衣服的時候,其他人都不能進(jìn)來哈,然后它就進(jìn)入里面換衣服了,等它換好衣服了,出來了,老板(CPU)說,你們這些靚仔可以進(jìn)去了。
------------------------------------------------------
總結(jié)
以上是生活随笔為你收集整理的第4章 原子操作 第二节的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于Linux内核代码不使用typede
- 下一篇: jni调试