第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)說,你們這些靚仔可以進去了。
------------------------------------------------------
總結
以上是生活随笔為你收集整理的第4章 原子操作 第二节的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于Linux内核代码不使用typede
- 下一篇: 日记html模板,【精选】初二日记模板集