青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

原子操作

在多進程(線程)訪問資源時,能夠確保所有其他的進程(線程)都不在同一時間內訪問相同的資源。

  原子操作:UPSMP的異同

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

  原子操作是不可分割的,在執行完畢不會被任何其它任務或事件中斷。在單處理器系統(UniProcessor)中,能夠在單條指令中完成的操作都可以認為是" 原子操作",因為中斷只能發生于指令之間。這也是某些CPU指令系統中引入了test_and_set、test_and_clear等指令用于臨界資源互斥的原因。但是,在對稱多處理器(Symmetric Multi-Processor)結構中就不同了,由于系統中有多個處理器在獨立地運行,即使能在單條指令中完成的操作也有可能受到干擾。我們以decl (遞減指令)為例,這是一個典型的"讀-改-寫"過程,涉及兩次內存訪問。設想在不同CPU運行的兩個進程都在遞減某個計數值,可能發生的情況是:

  1 CPU A(CPU A上所運行的進程,以下同)從內存單元把當前計數值(2)裝載進它的寄存器中;

  2 CPU B從內存單元把當前計數值(2)裝載進它的寄存器中。

  3 CPU A在它的寄存器中將計數值遞減為1;

  4 CPU B在它的寄存器中將計數值遞減為1;

  5 CPU A把修改后的計數值(1)寫回內存單元。

  6 CPU B把修改后的計數值(1)寫回內存單元。

  我們看到,內存里的計數值應該是0,然而它卻是1。如果該計數值是一個共享資源的引用計數,每個進程都在遞減后把該值與0進行比較,從而確定是否需要釋放該共享資源。這時,兩個進程都去掉了對該共享資源的引用,但沒有一個進程能夠釋放它--兩個進程都推斷出:計數值是1,共享資源仍然在被使用。

  原子性不可能由軟件單獨保證--必須需要硬件的支持,因此是和架構相關的。x86 平臺上,CPU提供了在指令執行期間對總線加鎖的手段。CPU芯片上有一條引線#HLOCK pin,如果匯編語言的程序中在一條指令前面加上前綴"LOCK",經過匯編以后的機器代碼就使CPU在執行這條指令的時候把#HLOCK pin的電位拉低,持續到這條指令結束時放開,從而把總線鎖住,這樣同一總線上別的CPU就暫時不能通過總線訪問內存了,保證了這條指令在多處理器環境中的原子性。

  Linux內核中的原子操作

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

  原子操作大部分使用匯編語言實現,因為c語言并不能實現這樣的操作。

  * x86的原子操作實現代碼中,定義了LOCK宏,這個宏可以放在隨后的內聯匯編指令之前。如果是SMPLOCK宏被擴展為lock指令;否則被定義為空 -- CPU無需防止其它CPU的干擾,鎖內存總線完全是在浪費時間。

  #ifdef CONFIG_SMP

  #define LOCK "lock ; "

  #else

  #define LOCK ""

  #endif

  * typedef struct { volatile int counter; } atomic_t;

  在所有支持的體系結構上原子類型atomic_t都保存一個int值。在x86的某些處理器上,由于工作方式的原因,原子類型能夠保證的可用范圍只有24位。volatile是一個類型描述符,要求編譯器不要對其描述的對象作優化處理,對它的讀寫都需要從內存中訪問。

  

  * #define ATOMIC_INIT(i) { (i) }

  用于在定義原子變量時,初始化為指定的值。如:

  static atomic_t count = ATOMIC_INIT(1);

  * static __inline__ void atomic_add(int i, atomic_t *v)

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

  將v指向的原子變量加上i。該函數不關心原子變量的新值,返回void類型。

  在下面的實現中,使用了帶有C/C++表達式的內聯匯編代碼,格式如下(參考《AT&T ASM Syntax)

  __asm__ __volatile__("Instruction List" : Output : Input : Clobber/Modify);

  __asm__ __volatile__指示編譯器原封不動保留表達式中的匯編指令系列,不要考慮優化處理。涉及的約束還包括:

  1. 等號約束(=):只能用于輸出操作表達式約束,說明括號內的左值表達式v->counterwrite-only的。

  2. 內存約束(m):表示使用不需要借助寄存器,直接使用內存方式進行輸入或輸出。

  3. 立即數約束(i):表示輸入表達式是一個立即數(整數),不需要借助任何寄存器。

  4. 寄存器約束(r):表示使用一個通用寄存器,由GCC%eax/%ax/%al、%ebx/%bx/%bl、%ecx/%cx/%cl%edx/%dx/%dl中選取一個合適的。

  {

  __asm__ __volatile__(

  LOCK "addl %1,%0"

  :"=m" (v->counter)

  :"ir" (i), "m" (v->counter));

  }

  * static __inline__ int atomic_sub_and_test(int i, atomic_t *v)

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

  從v 指向的原子變量減去i,并測試是否為0。若為0,返回真,否則返回假。由于x86subl指令會在結果為0時設置CPUzero標志位,而且這個標志位是CPU私有的,不會被其它CPU影響。因此,可以執行一次加鎖的減操作,再根據CPUzero標志位來設置本地變量c,并相應返回。

  {

  unsigned char c;

  __asm__ __volatile__(

  LOCK "subl %2,%0; sete %1"

  :"=m" (v->counter), "=qm" (c)

  :"ir" (i), "m" (v->counter) : "memory");

  return c;

  }

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

  #define atomic_read(v) ((v)->counter)

  讀取v指向的原子變量的值。由于該操作本身就是原子的,只需要一次內存訪問就能完成,因此定義為一個宏,并用C代碼實現。

  #define atomic_set(v,i) (((v)->counter) = (i))

  設置v指向的原子變量的值為i。由于該操作本身就是原子的,只需要一次內存訪問就能完成,因此定義為一個宏,并用C代碼實現。

  static __inline__ void atomic_sub(int i, atomic_t *v)

  從v指向的原子變量減去i。

  static __inline__ void atomic_inc(atomic_t *v)

  遞增v指向的原子變量。

  static __inline__ void atomic_dec(atomic_t *v)

  遞減v指向的原子變量。

  static __inline__ int atomic_dec_and_test(atomic_t *v)

  遞減v指向的原子變量,并測試是否為0。若為0,返回真,否則返回假。

  static __inline__ int atomic_inc_and_test(atomic_t *v)

  遞增v指向的原子變量,并測試是否為0。若為0,返回真,否則返回假。

  static __inline__ int atomic_add_negative(int i, atomic_t *v)

  將v指向的原子變量加上i,并測試結果是否為負。若為負,返回真,否則返回假。這個操作用于實現semaphore。

posted on 2009-10-19 18:47 肥仔 閱讀(845) 評論(0)  編輯 收藏 引用 所屬分類: C++ 基礎

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲综合视频1区| 国产精品免费aⅴ片在线观看| 欧美午夜无遮挡| 欧美国产日韩一二三区| 国产亚洲精品久久久久动| 性久久久久久久久| 久热精品视频在线| 亚洲高清三级视频| 麻豆精品一区二区综合av| 欧美激情第三页| 欧美国产日韩视频| 日韩午夜免费| 久久久久网址| 亚洲国产精品久久久久婷婷老年| 好吊日精品视频| 欧美成人免费在线观看| 亚洲视频一区二区免费在线观看| 国产一区在线播放| 欧美激情精品久久久久| 日韩一级视频免费观看在线| 日韩一区二区高清| 亚洲欧美国产高清| 亚洲福利精品| 免费在线欧美黄色| 亚洲电影免费观看高清完整版在线观看 | 欧美激情无毛| 欧美韩日亚洲| 亚洲精品一区二区三区福利| 免费欧美网站| 欧美在线看片a免费观看| 亚洲精品国产精品久久清纯直播 | 99精品视频免费观看| 亚洲一区二区三区欧美| 欧美日韩在线亚洲一区蜜芽| 久久国产天堂福利天堂| 亚洲精品国产视频| 免费视频一区| 中文国产成人精品| 蜜月aⅴ免费一区二区三区| 欧美性做爰猛烈叫床潮| 亚洲福利视频二区| 久久国产欧美日韩精品| 久久国产精品黑丝| 亚洲国产精品久久精品怡红院| 欧美电影免费观看高清| 久热精品在线视频| 一区二区三区欧美日韩| 亚洲一区二区在线视频| 亚洲专区在线视频| 欧美日本国产精品| 欧美深夜影院| 亚洲精选视频免费看| 亚洲最新在线视频| 99亚洲一区二区| 美女在线一区二区| 欧美在线亚洲在线| 欧美阿v一级看视频| 国外精品视频| 久久久久网址| 久久久久久久综合日本| 免费观看一区| 亚洲国产成人在线| 裸体一区二区| 久久这里只有| 欧美日韩免费观看一区=区三区| 欧美日韩一区二区三区免费| 亚洲福利视频一区二区| 欧美gay视频激情| 一区二区三区日韩精品| 欧美日韩性视频在线| 一区二区三区精品视频| 性欧美大战久久久久久久免费观看| 亚洲欧美视频在线| 蜜臀av在线播放一区二区三区| 久久精品国产精品亚洲综合| 国内精品嫩模av私拍在线观看| 久久久另类综合| 美日韩精品视频免费看| 日韩亚洲欧美成人| 久久久999精品免费| 亚洲黄色成人网| 蜜臀99久久精品久久久久久软件| 亚洲国产婷婷| 欧美在线播放高清精品| 欧美岛国在线观看| 欧美精品 日韩| 亚洲影院色在线观看免费| 午夜一区二区三视频在线观看| 国语自产偷拍精品视频偷| 女女同性女同一区二区三区91| 蜜臀av性久久久久蜜臀aⅴ| 亚洲欧洲三级| 欧美在线观看网址综合| 尤妮丝一区二区裸体视频| 亚洲一级在线观看| 亚洲欧美日韩国产成人精品影院| 欧美大片18| 亚洲自拍啪啪| 久久蜜桃香蕉精品一区二区三区| 国产精品一区二区久久久久| 亚洲欧洲免费视频| 久久九九精品99国产精品| 久久综合狠狠综合久久综青草 | 欧美人成在线| 久久久久久九九九九| 欧美精选一区| 久久在线免费观看视频| 亚洲一区二区三区激情| 亚洲国产福利在线| 亚洲一区二区在线视频| 亚洲精品一区二| 欧美一级片在线播放| 国产精品一香蕉国产线看观看| 免费永久网站黄欧美| 国产精品av久久久久久麻豆网| 久久婷婷久久| 国产乱码精品1区2区3区| 亚洲精品一区二区网址| 在线电影一区| 羞羞漫画18久久大片| 亚洲少妇诱惑| 亚洲视频一区| 一本色道久久99精品综合| 久久人体大胆视频| 久久精品亚洲一区二区| 欧美婷婷在线| 亚洲精品国产精品国自产观看浪潮| 韩国成人福利片在线播放| 午夜欧美不卡精品aaaaa| 午夜精品视频| 国产精品久久久久久影院8一贰佰| 亚洲精品小视频| 日韩午夜在线视频| 欧美精品一卡| 亚洲人成久久| 一区二区精品国产| 欧美人交a欧美精品| 亚洲精品美女免费| 一区二区三区四区精品| 欧美日韩国产三区| 久久成人人人人精品欧| 国产精品私房写真福利视频| 久久综合久久综合九色| 国产一区二区三区在线免费观看| 午夜精品美女自拍福到在线 | 夜夜狂射影院欧美极品| 亚洲精品在线观看视频| 欧美成人免费全部观看天天性色| 欧美福利网址| 一区二区激情| 国产九九精品| 国产一区 二区 三区一级| 亚洲欧美日韩国产成人| 欧美一区二区在线看| 欧美三级网址| 亚洲宅男天堂在线观看无病毒| 欧美一区二区福利在线| 国产一区二区中文字幕免费看| 久久精品一区二区三区不卡| 亚洲裸体俱乐部裸体舞表演av| 欧美成人激情在线| 亚洲免费大片| 欧美在线观看你懂的| 好吊色欧美一区二区三区视频| 免费观看一区| 亚洲免费网站| 欧美成人午夜77777| 日韩一级不卡| 国产亚洲激情在线| 欧美国产亚洲视频| 亚洲欧美日本在线| 免费在线观看精品| 亚洲综合精品自拍| 欲香欲色天天天综合和网| 欧美日韩成人一区| 欧美一区二区三区免费视频| 亚洲激情在线| 久久久91精品国产| 亚洲少妇自拍| 亚洲激情网站| 国产午夜亚洲精品理论片色戒| 亚洲小说春色综合另类电影| 久久综合九色九九| 亚洲一区二区三区四区五区黄| 狠狠色综合播放一区二区| 欧美精品一区二区精品网| 西瓜成人精品人成网站| 亚洲精品乱码视频| 美国十次成人| 久久精品国产v日韩v亚洲| 亚洲美女区一区| 在线观看一区| 久久字幕精品一区| 亚洲一区在线免费| 亚洲精品美女久久7777777| 美女露胸一区二区三区| 欧美在线高清| 性视频1819p久久| 亚洲一级影院| 一本久道久久久|