精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

鴻蒙內核源碼分析(原子操作篇) | 是誰在為原子操作保駕護航?

開發
文章由鴻蒙社區產出,想要了解更多內容請前往:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com

[[390980]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

本篇說清楚原子操作

讀本篇之前建議先讀鴻蒙內核源碼分析(總目錄)系列篇.

基本概念

在支持多任務的操作系統中,修改一塊內存區域的數據需要“讀取-修改-寫入”三個步驟。然而同一內存區域的數據可能同時被多個任務訪問,如果在修改數據的過程中被其他任務打斷,就會造成該操作的執行結果無法預知。

使用開關中斷的方法固然可以保證多任務執行結果符合預期,但這種方法顯然會影響系統性能。

ARMv6架構引入了LDREX和STREX指令,以支持對共享存儲器更縝密的非阻塞同步。由此實現的原子操作能確保對同一數據的“讀取-修改-寫入”操作在它的執行期間不會被打斷,即操作的原子性。

有多個任務對同一個內存數據進行加減或交換操作時,使用原子操作保證結果的可預知性。

看過鴻蒙內核源碼分析(總目錄)自旋鎖篇的應該對LDREX和STREX指令不陌生的,自旋鎖的本質就是對某個變量的原子操作,而且一定要通過匯編代碼實現,也就是說LDREX和STREX指令保證了原子操作的底層實現. 回顧下自旋鎖申請和釋放鎖的匯編代碼.

ArchSpinLock 申請鎖代碼

  1. FUNCTION(ArchSpinLock)  @死守,非要拿到鎖 
  2.     mov     r1, #1      @r1=1 
  3. 1:                      @循環的作用,因SEV是廣播事件.不一定lock->rawLock的值已經改變了 
  4.     ldrex   r2, [r0]    @r0 = &lock->rawLock, 即 r2 = lock->rawLock 
  5.     cmp     r2, #0      @r2和0比較 
  6.     wfene               @不相等時,說明資源被占用,CPU核進入睡眠狀態 
  7.     strexeq r2, r1, [r0]@此時CPU被重新喚醒,嘗試令lock->rawLock=1,成功寫入則r2=0 
  8.     cmpeq   r2, #0      @再來比較r2是否等于0,如果相等則獲取到了鎖 
  9.     bne     1b          @如果不相等,繼續進入循環 
  10.     dmb                 @用DMB指令來隔離,以保證緩沖中的數據已經落實到RAM中 
  11.     bx      lr          @此時是一定拿到鎖了,跳回調用ArchSpinLock函數 

ArchSpinUnlock 釋放鎖代碼

  1. FUNCTION(ArchSpinUnlock)    @釋放鎖 
  2.      mov     r1, #0          @r1=0                
  3.      dmb                     @數據存儲隔離,以保證緩沖中的數據已經落實到RAM中 
  4.      str     r1, [r0]        @令lock->rawLock = 0 
  5.      dsb                     @數據同步隔離 
  6.      sev                     @給各CPU廣播事件,喚醒沉睡的CPU們 
  7.      bx      lr              @跳回調用ArchSpinLock函數 

運作機制

鴻蒙通過對ARMv6架構中的LDREX和STREX進行封裝,向用戶提供了一套原子操作接口。

● LDREX Rx, [Ry] 讀取內存中的值,并標記對該段內存為獨占訪問:

◊ 讀取寄存器Ry指向的4字節內存數據,保存到Rx寄存器中。

◊ 對Ry指向的內存區域添加獨占訪問標記。

● STREX Rf, Rx, [Ry] 檢查內存是否有獨占訪問標記,如果有則更新內存值并清空標記,否則不更新內存:

◊ 有獨占訪問標記

◊ 將寄存器Rx中的值更新到寄存器Ry指向的內存。

◊ 標志寄存器Rf置為0。

◊ 沒有獨占訪問標記

◊ 不更新內存。

◊ 標志寄存器Rf置為1。

● 判斷標志寄存器 標志寄存器為0時,退出循環,原子操作結束。 標志寄存器為1時,繼續循環,重新進行原子操作。

功能列表

原子數據包含兩種類型Atomic(有符號32位數)與 Atomic64(有符號64位數)。原子操作模塊為用戶提供下面幾種功能,接口詳細信息可以查看源碼。

此處講述 LOS_AtomicAdd , LOS_AtomicSub,LOS_AtomicRead,LOS_AtomicSet 理解了函數的匯編代碼是理解的原子操作的關鍵.

LOS_AtomicAdd

  1. //對內存數據做加法 
  2. STATIC INLINE INT32 LOS_AtomicAdd(Atomic *v, INT32 addVal)   
  3.     INT32 val; 
  4.     UINT32 status; 
  5.  
  6.     do { 
  7.         __asm__ __volatile__("ldrex   %1, [%2]\n" 
  8.                              "add   %1, %1, %3\n"  
  9.                              "strex   %0, %1, [%2]" 
  10.                              : "=&r"(status), "=&r"(val) 
  11.                              : "r"(v), "r"(addVal) 
  12.                              : "cc"); 
  13.     } while (__builtin_expect(status != 0, 0)); 
  14.  
  15.     return val; 

這是一段C語言內嵌匯編,逐一解讀

● 1.先將 val status v addVal的值交由通用寄存器(R0~R3)接管.

● 2.%2代表了入參v,[%2]代表的是參數v指向地址的值,也就是 *v ,函數要獨占的就是它

● 3.%0 ~ %3 對應 val status v addVal

● 4.ldrex %1, [%2] 表示 val = *v ;

● 5.add %1, %1, %3 表示 val = val + addVal;

● 6.strex %0, %1, [%2] 表示 *v = val;

● 7.status 表示是否更新成功,成功了置0,不成功則為 1

● 8.__builtin_expect是結束循環的判斷語句,將最有可能執行的分支告訴編譯器。 這個指令的寫法為:

__builtin_expect(EXP, N)。

意思是:EXP==N 的概率很大。

綜合理解__builtin_expect(status != 0, 0)

說的是status = 1失敗的可能性很大,不成功就重新來一遍,直到strex更新成(status == 0)為止.

● 9."=&r"(val) 被修飾的操作符作為輸出,即將寄存器的值回給val,val為函數的返回值

● 10."cc"向GCC編譯器聲明以上信息.

LOS_AtomicSub

  1. //對內存數據做減法 
  2. STATIC INLINE INT32 LOS_AtomicSub(Atomic *v, INT32 subVal)   
  3.     INT32 val; 
  4.     UINT32 status; 
  5.  
  6.     do { 
  7.         __asm__ __volatile__("ldrex   %1, [%2]\n" 
  8.                              "sub   %1, %1, %3\n" 
  9.                              "strex   %0, %1, [%2]" 
  10.                              : "=&r"(status), "=&r"(val) 
  11.                              : "r"(v), "r"(subVal) 
  12.                              : "cc"); 
  13.     } while (__builtin_expect(status != 0, 0)); 
  14.  
  15.     return val; 

解讀

● 同 LOS_AtomicAdd解讀

volatile

這里要重點說下volatile,volatile 提醒編譯器它后面所定義的變量隨時都有可能改變,因此編譯后的程序每次需要存儲或讀取這個變量的時候,都要直接從變量地址中讀取數據。如果沒有volatile關鍵字,則編譯器可能優化讀取和存儲,可能暫時使用寄存器中的值,如果這個變量由別的程序更新了的話,將出現不一致的現象。

  1. //讀取內存數據 
  2. STATIC INLINE INT32 LOS_AtomicRead(const Atomic *v)  
  3.     return *(volatile INT32 *)v; 
  4. //寫入內存數據 
  5. STATIC INLINE VOID LOS_AtomicSet(Atomic *v, INT32 setVal)    
  6.     *(volatile INT32 *)v = setVal; 

編程實例

調用原子操作相關接口,觀察結果:

1.創建兩個任務

● 任務一用LOS_AtomicAdd對全局變量加100次。

● 任務二用LOS_AtomicSub對全局變量減100次。

2.子任務結束后在主任務中打印全局變量的值。

  1. #include "los_hwi.h" 
  2. #include "los_atomic.h" 
  3. #include "los_task.h" 
  4.  
  5. UINT32 g_testTaskId01; 
  6. UINT32 g_testTaskId02; 
  7. Atomic g_sum; 
  8. Atomic g_count; 
  9.  
  10. UINT32 Example_Atomic01(VOID) 
  11.     int i = 0; 
  12.     for(i = 0; i < 100; ++i) { 
  13.         LOS_AtomicAdd(&g_sum,1); 
  14.     } 
  15.  
  16.     LOS_AtomicAdd(&g_count,1); 
  17.     return LOS_OK; 
  18.  
  19. UINT32 Example_Atomic02(VOID) 
  20.     int i = 0; 
  21.     for(i = 0; i < 100; ++i) { 
  22.         LOS_AtomicSub(&g_sum,1); 
  23.     } 
  24.  
  25.     LOS_AtomicAdd(&g_count,1); 
  26.     return LOS_OK; 
  27.  
  28. UINT32 Example_TaskEntry(VOID) 
  29.     TSK_INIT_PARAM_S stTask1={0}; 
  30.     stTask1.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_Atomic01; 
  31.     stTask1.pcName       = "TestAtomicTsk1"
  32.     stTask1.uwStackSize  = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; 
  33.     stTask1.usTaskPrio   = 4; 
  34.     stTask1.uwResved     = LOS_TASK_STATUS_DETACHED; 
  35.  
  36.     TSK_INIT_PARAM_S stTask2={0}; 
  37.     stTask2.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_Atomic02; 
  38.     stTask2.pcName       = "TestAtomicTsk2"
  39.     stTask2.uwStackSize  = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; 
  40.     stTask2.usTaskPrio   = 4; 
  41.     stTask2.uwResved     = LOS_TASK_STATUS_DETACHED; 
  42.  
  43.     LOS_TaskLock(); 
  44.     LOS_TaskCreate(&g_testTaskId01, &stTask1); 
  45.     LOS_TaskCreate(&g_testTaskId02, &stTask2); 
  46.     LOS_TaskUnlock(); 
  47.  
  48.     while(LOS_AtomicRead(&g_count) != 2); 
  49.     dprintf("g_sum = %d\n", g_sum); 
  50.  
  51.     return LOS_OK; 

結果驗證

  1. g_sum = 0 

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2014-01-09 09:45:41

原子飛原子

2021-01-26 11:54:10

Mysql 操作日志

2020-11-27 06:44:22

原子加鎖x86

2013-01-10 11:32:12

阿里云雙十一云計算

2023-09-19 23:26:15

++i原子操作C++

2015-08-19 10:06:21

2012-09-12 09:40:36

云服務GIS技術彈性云計算

2021-06-30 09:11:17

KubernetesDevtronK8S

2011-12-16 11:11:24

戴爾

2014-03-13 14:55:45

云計算新媒體虛擬化

2010-06-14 23:32:04

綜合布線機場西蒙

2009-10-29 10:22:22

2013-12-09 16:16:29

初志科技數據動車

2019-12-16 16:30:19

網易游戲AWSre:Invent

2014-07-01 10:07:56

2021-07-14 13:30:44

KubernetesLinux文件

2012-06-25 16:57:07

2012-07-20 17:50:56

IT運維
點贊
收藏

51CTO技術棧公眾號

97免费视频在线播放| 日韩一级免费观看| 欧洲一区二区在线| 波多野结衣高清视频| 久久亚洲国产| 欧美一级黄色片| 五十路熟女丰满大屁股| 国产永久免费高清在线观看| 久久精品国产在热久久| 欧美激情18p| 日韩丰满少妇无码内射| 欧美aaaaaaaa| 亚洲成人av电影| 午夜精品一区二区在线观看的 | 欧美日韩亚洲系列| 日本一区二区久久精品| 国产av无码专区亚洲av| 午夜一区不卡| 欧美精品情趣视频| 亚洲午夜精品久久久久久高潮 | 日韩一区二区在线观看视频播放| 久草热视频在线观看| 日韩伦理在线观看| 久久综合久久99| 亚洲综合日韩在线| 最新黄色网址在线观看| 在线成人亚洲| 久久天天躁狠狠躁夜夜av| 特大黑人巨人吊xxxx| 精品999日本久久久影院| 在线观看www91| 精品视频免费在线播放| fc2ppv国产精品久久| 国产日产亚洲精品系列| 久久久精品动漫| www.色亚洲| 麻豆成人免费电影| 国产97免费视| 国产精品suv一区| 亚洲精品美女91| 欧美精品九九久久| 三级影片在线看| 先锋资源久久| 日韩视频精品在线| 四虎影视一区二区| 成人羞羞在线观看网站| 亚洲视频在线观看免费| 国产人妻人伦精品1国产丝袜 | 久久综合一区二区三区| 丁香花免费高清完整在线播放| 久久成人18免费观看| 国产精品入口福利| 国产美女www爽爽爽| 久久av最新网址| 日产日韩在线亚洲欧美| 久久久久久久久影院| 亚洲美洲欧洲综合国产一区| 久久久视频免费观看| 久久久久久久久精| 韩国久久久久| 欧美激情一区二区三级高清视频| www.毛片com| 欧美黄污视频| 97视频免费在线看| 中文字幕亚洲高清| 久久高清一区| 国产精品视频最多的网站| 中文字幕+乱码+中文乱码www| 秋霞国产午夜精品免费视频| 国产日韩精品电影| 国产手机视频在线| av资源站一区| 欧美一区二区三区四区夜夜大片| 国产一区精品| 亚洲视频香蕉人妖| 日韩国产小视频| 久久男人av资源站| 在线精品国精品国产尤物884a| 国产一级特黄a大片免费| 欧美性aaa| 日韩欧美国产精品一区| 欧美精品欧美极品欧美激情| 蜜桃tv一区二区三区| 日韩在线免费高清视频| 91porn在线视频| 99riav1国产精品视频| 国产成人精品免费视频| 国产普通话bbwbbwbbw| 成人久久久精品乱码一区二区三区 | 一级毛片精品毛片| 日韩av在线免费观看| 黄色工厂在线观看| 久久精品国产68国产精品亚洲| 久久久精品一区| 亚洲男人第一av| 久久精品国产久精国产| 国产伦精品一区二区三毛| 九色在线视频蝌蚪| 一区二区三区在线免费视频| 黄色片视频在线免费观看| 欧美天堂一区二区| 日韩精品在线观看一区| 午夜精品一区二区三级视频| 在线亚洲国产精品网站| 91免费看片网站| 深夜视频在线免费| 亚洲图片激情小说| 亚洲中文字幕无码中文字| 91国产一区| 亚洲人精品午夜在线观看| 国产一二三四区| 丝袜美腿成人在线| 国产精品区一区二区三含羞草| 自拍视频在线| 狠狠做深爱婷婷久久综合一区| 国产精欧美一区二区三区白种人| 婷婷国产精品| 欧美黑人狂野猛交老妇| 国产又粗又长又大视频| 久久免费视频色| 一二三四视频社区在线| 亚洲国产视频二区| 日韩在线视频网| 日韩黄色片网站| 97久久超碰国产精品| 第九区2中文字幕| 欧美爱爱视频| 在线精品国产成人综合| 超碰超碰超碰超碰| zzijzzij亚洲日本少妇熟睡| 国产 欧美 日韩 一区| 欧美一级做a| 综合国产在线观看| 少妇久久久久久久| 国产三级精品在线| 日韩精品视频一区二区在线观看| 永久免费精品视频| 美女av一区二区| 91av久久久| 国产精品国产精品国产专区不蜜| 国产a级片免费观看| 国产精品x8x8一区二区| 欧美激情欧美狂野欧美精品 | 日韩高清有码在线| 日产欧产va高清| www..com久久爱| 国产h视频在线播放| 欧美日韩一区二区三区四区不卡| 欧美激情在线播放| 国产综合在线播放| 亚洲h动漫在线| 亚洲成人av免费在线观看| 亚洲国产第一| 久久久久久久久久久久久9999| 国产色播av在线| 亚洲精品国产精品久久清纯直播| 日韩伦理在线视频| 久久综合久久鬼色中文字| 日本精品一区在线观看| av在线不卡免费观看| 国产精品久久在线观看| 伊人网在线视频观看| 粉嫩av一区二区夜夜嗨| 亚洲精品国产a| 韩国三级视频在线观看| 亚洲激情综合| 麻豆精品蜜桃一区二区三区| 人人鲁人人莫人人爱精品| 亚洲一区第一页| 91国产免费视频| 一区二区三区欧美日| 国产综合内射日韩久| 亚洲综合精品四区| 相泽南亚洲一区二区在线播放| japansex久久高清精品| 欧美黄色成人网| 你懂的视频在线免费| 欧美三级日本三级少妇99| 国产探花在线免费观看| 99麻豆久久久国产精品免费 | 麻豆精品在线看| 黄黄视频在线观看| 人人精品亚洲| 成人www视频在线观看| 男男gaygays亚洲| 亚洲欧美日韩中文在线制服| 一级片aaaa| 亚洲成人tv网| 男人天堂资源网| 成人毛片在线观看| 亚洲激情在线观看视频| 欧美在线免费一级片| 久久综合久久久| 免费精品一区二区三区在线观看| 91国内在线视频| 亚洲欧美视频一区二区| 亚洲аv电影天堂网| 欧美成人精品网站| 亚洲国产精品一区二区www| 性欧美一区二区| 成人免费视频免费观看| 最新天堂在线视频| 一本色道久久综合亚洲精品高清| 一区二区三区四区| 天堂av一区二区三区在线播放 | 99久久精品日本一区二区免费 | 台湾佬综合网| 亚洲最大成人免费视频| 少妇一区视频| 久久全球大尺度高清视频| 午夜免费播放观看在线视频| 亚洲精品国产精品久久清纯直播 | 国产精品啪啪啪视频| 狠狠色丁香婷婷综合影院| 91|九色|视频| 久久69成人| 热久久免费视频精品| 蜜臀av在线| 久久艳片www.17c.com| 国产区高清在线| 日韩av在线一区二区| 精品国产免费无码久久久| 欧美体内she精视频| 国语对白永久免费| 亚洲国产欧美一区二区三区丁香婷| 成年人网站在线观看视频| 国产午夜亚洲精品不卡| 国产一级二级视频| 国产成人精品三级麻豆| 日本中文字幕二区| 青青草成人在线观看| 韩国日本美国免费毛片| 丝袜诱惑亚洲看片| 激情综合网婷婷| 免费精品视频| 精品人妻一区二区三区四区在线| 亚洲高清av| 奇米精品一区二区三区| 悠悠资源网久久精品| 成年人网站国产| 精品动漫一区| 国产日韩欧美精品在线观看| 激情综合在线| 亚洲精品久久久久久久蜜桃臀| 欧美日本不卡高清| 97在线免费视频观看| 午夜久久美女| 久久99久久久久久| 在线日本高清免费不卡| 日本一道本久久| 国产日韩精品视频一区二区三区| 国产精品久久中文字幕| 日韩午夜黄色| 国产1区2区在线| 视频一区国产视频| 亚洲色图 在线视频| 久久69国产一区二区蜜臀| 高潮一区二区三区| 国产毛片精品一区| 国产高潮失禁喷水爽到抽搐 | 久久精品美女视频| 亚洲成av人片在线| 日日摸天天添天天添破| 欧美主播一区二区三区| 一区二区国产欧美| 日韩精品中文字幕一区| 欧美一级在线免费观看| 国产视频精品久久久| 国产鲁鲁视频在线观看免费| 色青青草原桃花久久综合| 大片免费在线观看| 国模吧一区二区| 东京一区二区| 国产在线视频91| xxxx日韩| 欧美一区二区三区四区在线观看地址| 日韩理论片av| 国产情侣第一页| 天堂一区二区在线免费观看| www.污网站| av在线这里只有精品| 成人无码av片在线观看| 亚洲免费观看在线观看| 久久久久久久久久免费视频| 欧美色倩网站大全免费| 国产高中女学生第一次| 亚洲另类xxxx| 精品国产丝袜高跟鞋| 91精品国产高清久久久久久| 国模私拍国内精品国内av| 国产精品日韩欧美一区二区三区| 国产日韩欧美一区二区三区| 午夜久久久久久久久久久| 国产精品毛片在线| 五月天婷婷在线观看视频| 97se亚洲国产综合在线| 中文字幕观看av| 一本到一区二区三区| 精品久久在线观看| 亚洲天堂av高清| 蜜桃传媒在线观看免费进入| 国产欧美中文字幕| 欧美一级色片| 男人的天堂视频在线| 久久久亚洲人| 人妻 日韩 欧美 综合 制服| 亚洲欧美综合另类在线卡通| 六月丁香婷婷综合| 欧美成人免费网站| 91最新在线| 国产99久久久欧美黑人 | 亚洲第一福利网| 蜜芽在线免费观看| 国产成人精品久久二区二区| 久草在线综合| 男人天堂新网址| 精品在线观看免费| 国产一二三四五区| 午夜视黄欧洲亚洲| 国内毛片毛片毛片毛片| 在线午夜精品自拍| 午夜日韩成人影院| 久久99精品久久久久久三级| 激情欧美一区| 免费欧美一级片| 自拍偷拍欧美激情| 中文字幕一二三四| 亚洲性视频网址| 老司机2019福利精品视频导航| 国产伦一区二区三区色一情| 影视亚洲一区二区三区| 九九热精品在线播放| 国产日产欧美一区| 国产成人无码av| 亚洲免费高清视频| 亚洲国产欧美日本视频| 久久天天狠狠| 国产精品九九九九九九| 欧美在线小视频| 高清福利在线观看| 国产成人亚洲综合| 精品国产一区二区三区久久久蜜臀| 91好吊色国产欧美日韩在线| heyzo一本久久综合| 日本天堂在线视频| 亚洲精品成人网| 欧亚在线中文字幕免费| 精品欧美国产| 欧美一级专区| 无码少妇精品一区二区免费动态| 色菇凉天天综合网| 国产系列在线观看| 国产精品久久久久9999| 久久精品国产大片免费观看| wwwwwxxxx日本| 成人欧美一区二区三区在线播放| 国产精品高潮呻吟久久久| 久久精品91久久久久久再现| 成人永久在线| 青春草国产视频| 99re亚洲国产精品| 亚洲国产成人精品女人久久| 国产午夜一区二区| 福利精品一区| 国产精品久久久影院| 不卡的电视剧免费网站有什么| 亚州国产精品视频| 亚洲欧美日韩一区二区三区在线| 色尼玛亚洲综合影院| 亚洲精品高清视频| 国产精品系列在线播放| 日本熟妇乱子伦xxxx| 亚洲性生活视频在线观看| www.欧美| 久草资源站在线观看| 中文字幕免费观看一区| 超碰在线人人干| 欧美亚洲另类激情另类| 精品一区二区三区中文字幕老牛| 午夜视频在线观| 婷婷成人综合网| 在线观看麻豆| 国产精品国模大尺度私拍| 美女日韩在线中文字幕| 老司机福利在线观看| 精品久久久三级丝袜| 欧美日韩精品免费观看视完整| 国产成人精品免费看在线播放 | 欧美日韩国产精选| www.综合网.com| 日本公妇乱淫免费视频一区三区| 国产伦精品一区二区三区免费迷| 三级黄色在线视频| 久久精品久久久久| 亚洲欧洲美洲国产香蕉| 91大神免费观看| 欧美伊人久久大香线蕉综合69 | 黑人极品videos精品欧美裸| 欧美午夜电影一区二区三区| 精品国产一区二区三区日日嗨|