精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧洲在线视频一区| 欧美成人激情图片网| 国产精品后入内射日本在线观看| 亚洲精品综合网| 在线高清一区| 日韩大陆毛片av| 五月婷婷深爱五月| 成人在线视频亚洲| 成人黄色网址在线观看| 欧美一级成年大片在线观看| 美女爆乳18禁www久久久久久| 朝桐光一区二区| 综合自拍亚洲综合图不卡区| 成人免费网站在线看| 久久香蕉精品视频| 亚洲第一福利专区| 欧洲生活片亚洲生活在线观看| 亚洲成人一区二区三区| www.日本在线观看| 久久久亚洲人| 中文字幕亚洲欧美在线| 国产精品igao网网址不卡| 俺来俺也去www色在线观看| 久久综合色婷婷| 成人免费高清完整版在线观看| 免费在线看黄网址| 欧美欧美黄在线二区| 欧美日韩一区不卡| 成人毛片一区二区| 男人的天堂在线视频免费观看| 国产宾馆实践打屁股91| 欧美亚洲另类激情另类| 国产又大又粗又爽的毛片| 国产免费av国片精品草莓男男| 天天操天天色综合| 强开小嫩苞一区二区三区网站 | 无码人妻丰满熟妇区毛片18| 男人资源在线播放| 久久综合久久99| 国产自产女人91一区在线观看| 国产精品成人av久久| 久久精品99久久无色码中文字幕| 精品国产自在久精品国产| 黄色手机在线视频| 老色鬼在线视频| 玉足女爽爽91| 亚洲精品中文字幕在线| 亚洲av成人精品毛片| 国产一区福利在线| 国产精品网址在线| 日本熟妇一区二区| 欧美日韩福利| 日韩中文在线中文网三级| 国产精品无码永久免费不卡| 永久免费精品视频| 欧美日韩国产免费| 亚洲一区在线不卡| 成人午夜视屏| 一本色道久久综合亚洲aⅴ蜜桃| 粉嫩av一区二区三区天美传媒| 日本中文字幕视频在线| 国产欧美一区二区精品性色| 国产日韩一区二区| www.精品久久| 丰满少妇久久久久久久| 成人黄色免费片| 亚洲天天综合网| 蜜臀精品一区二区三区在线观看| 国产成人精品电影| 青青草激情视频| 亚洲精品888| 久久久国产精彩视频美女艺术照福利 | 欧美久久婷婷综合色| 午夜精品在线免费观看| 日韩av中字| 欧美亚洲综合另类| 99日在线视频| 国产精品极品在线观看| 亚洲久久久久久久久久久| 日韩毛片无码永久免费看| 日韩欧美精品综合| 九九九久久久久久| 亚洲免费在线视频观看| 蜜桃av一区二区| 亚洲自拍av在线| 特级丰满少妇一级aaaa爱毛片| 久久你懂得1024| 国产四区在线观看| 高潮在线视频| 欧美日韩在线播放一区| 国产精品二区视频| 最新国产精品视频| 久久久精品2019中文字幕神马| 日韩高清免费av| 麻豆精品一区二区av白丝在线| 2019国产精品视频| 色视频免费在线观看| 国产精品久久网站| 成人性生活视频免费看| 国产私拍福利精品视频二区| 日韩一区二区三区免费观看| 爱爱免费小视频| 香蕉精品视频在线观看| 欧美在线视频网站| av手机免费看| 久久久久久久电影| 精品一二三四五区| 国产精品天堂蜜av在线播放| 日韩精品专区在线影院重磅| 97伦伦午夜电影理伦片| 一区二区三区四区电影| 欧美一区二区三区艳史| 国产www视频| 国产欧美日韩不卡免费| 国产玉足脚交久久欧美| 中文字幕日本一区| 国产午夜精品久久久| 国产性生活网站| 久久av中文字幕片| 品久久久久久久久久96高清| av中文在线资源库| 制服丝袜av成人在线看| www.黄色在线| 香蕉av777xxx色综合一区| 97视频资源在线观看| 色哟哟免费在线观看| 色香蕉成人二区免费| 香蕉视频色在线观看| 波多野结衣的一区二区三区| 欧美一级在线亚洲天堂| 狠狠躁夜夜躁av无码中文幕| 18欧美乱大交hd1984| 欧美一级裸体视频| 美女久久久久| 欧美孕妇毛茸茸xxxx| 人妻丰满熟妇av无码区hd| 亚洲精品国产精华液| 国产毛片久久久久久| 日韩在线观看| 国产精品黄色av| 麻豆app在线观看| 丰满岳妇乱一区二区三区| 色婷婷狠狠18禁久久| 欧美a级在线| 成人性生交xxxxx网站| 老司机午夜在线| 欧美日韩国产一级二级| 中文字幕在线观看二区| 日本sm残虐另类| 午夜精品区一区二区三| 国产精品传媒麻豆hd| 最新中文字幕亚洲| 亚洲天堂久久久久| 自拍偷在线精品自拍偷无码专区| 午夜剧场在线免费观看| 亚洲91视频| 国产成人久久久精品一区| 午夜福利理论片在线观看| 亚洲成av人影院| 黑丝av在线播放| 久久国产主播| 亚洲免费在线精品一区| 欧美午夜三级| 欧美巨乳美女视频| 丰满人妻一区二区三区无码av| 性做久久久久久| 精品人妻一区二区三区视频| 日日摸夜夜添夜夜添亚洲女人| 午夜欧美性电影| 亚洲青青一区| 欧美激情第一页xxx| 凸凹人妻人人澡人人添| 欧美性猛交xxxx免费看漫画| 91在线无精精品白丝| 狠狠色丁香婷婷综合| 久久久久久av无码免费网站下载| 国产亚洲成av人片在线观黄桃| 欧洲精品毛片网站| 成人免费黄色网页| 日韩写真欧美这视频| 国产精品999久久久| 国产喂奶挤奶一区二区三区| 伊人色在线视频| 在线播放一区| 日本在线成人一区二区| 国产精品一区二区三区av| 欧美激情性做爰免费视频| 毛片在线免费| 日韩女优av电影| av大片免费观看| 国产精品盗摄一区二区三区| 亚洲成a人无码| 日本最新不卡在线| 欧美精品久久96人妻无码| 精品亚洲精品| 国产精品揄拍一区二区| 超免费在线视频| 亚洲色图激情小说| 国产欧美久久久| 日韩欧美视频一区二区三区| 欧美一级片在线视频| 91色.com| 色哟哟免费视频| 老牛影视一区二区三区| 成人在线免费观看视频网站| 成人在线一区| 国产在线视频欧美一区二区三区| 六九午夜精品视频| 1769国产精品| 欧美家庭影院| 中文字幕亚洲无线码a| 色呦呦中文字幕| 欧美一区二区免费视频| 天天爱天天做天天爽| 亚洲福利视频一区| 成年人av电影| 国产女人18毛片水真多成人如厕 | 99精品久久99久久久久| 天天综合成人网| 日韩二区在线观看| 日韩五码在线观看| 一本精品一区二区三区| 日韩中文字幕一区二区| 天海翼亚洲一区二区三区| 91精品久久久久久蜜桃| 色999韩欧美国产综合俺来也| 亲爱的老师9免费观看全集电视剧| 在线观看a级片| 少妇高潮久久77777| 国产综合视频一区二区三区免费| 亚洲精品白浆高清久久久久久| 精品久久久无码中文字幕| 911国产精品| 一级特黄aa大片| 在线观看国产精品网站| 黄色免费av网站| 福利微拍一区二区| 日韩熟女精品一区二区三区| 亚洲在线视频网站| 妺妺窝人体色www聚色窝仙踪| 日韩理论片在线| 美女福利视频网| 欧美国产丝袜视频| 国产精品无码无卡无需播放器| 2020国产精品自拍| 欧美性xxxx图片| 久久精品这里都是精品| 一区二区视频观看| 久久人人爽爽爽人久久久| 日本少妇色视频| 久久综合色天天久久综合图片| 欧洲一级黄色片| 久久久国产综合精品女国产盗摄| 蜜桃av免费看| 国产日韩视频一区二区三区| 亚洲区自拍偷拍| 国产精品情趣视频| 久久国产高清视频| 悠悠色在线精品| 国产在线拍揄自揄拍| 性感美女久久精品| 欧产日产国产69| 欧美在线短视频| 国产美女www爽爽爽视频| 日韩欧美一区在线| 手机在线精品视频| 亚洲区一区二区| 免费大片黄在线| 欧美高清视频在线| 蜜桃麻豆av在线| 国产精品一区久久久| 免费欧美网站| 精品视频免费观看| 菠萝蜜一区二区| 秋霞在线一区二区| 亚洲激情一区| 在线免费观看av的网站| 经典一区二区三区| 国产白袜脚足j棉袜在线观看| 久久九九全国免费| 青花影视在线观看免费高清| 午夜精品视频一区| 亚洲精品无码久久久久| 日韩一区二区三区视频| 日本亚洲一区| 久久天堂av综合合色| 96av在线| 国产在线观看91精品一区| 中文字幕久久精品一区二区 | 亚洲影院免费观看| 久久久久久少妇| 91精品国产综合久久婷婷香蕉| 天堂网在线观看视频| 色久欧美在线视频观看| 男人天堂亚洲| 国产精品视频一| 精品嫩草影院| 成人手机视频在线| 在线亚洲成人| 91欧美一区二区三区| 久久久久久久电影| 久草网在线观看| 欧美日韩在线不卡| 日本国产在线| 欧美精品激情在线观看| 欧美男女视频| 日本一区二区高清视频| 亚洲激情女人| 一级片免费在线观看视频| 久久精品一区二区三区不卡牛牛| 91视频综合网| 欧美视频一区在线观看| 天天综合网在线观看| 久久国产色av| 欧美成人高清视频在线观看| 玛丽玛丽电影原版免费观看1977| 欧美69视频| 四虎1515hh.com| 国产精品色婷婷久久58| 97久久久久久久| 精品日韩av一区二区| 超碰在线caoporn| 国产精品视频永久免费播放| 香蕉视频一区| 免费国产a级片| 成人激情午夜影院| 青娱乐免费在线视频| 欧美夫妻性生活| 在线视频1区2区| 国产成人一区二区三区电影| 日韩美女毛片| 波多野结衣家庭教师在线播放| 国产mv日韩mv欧美| 在线免费观看亚洲视频| 欧美电影影音先锋| 麻豆av在线导航| 91美女福利视频高清| 99久久久久| 国产精品嫩草影院8vv8| 中文字幕av在线一区二区三区| 91视频久久久| 亚洲偷熟乱区亚洲香蕉av| 在线日韩影院| 欧美日韩中文国产一区发布| 国产精品美女久久久| 国产男女猛烈无遮挡a片漫画 | 91福利免费视频| 色老头一区二区三区在线观看| 黄色成人在线视频| 亚洲精品欧美精品| 九一久久久久久| www.超碰在线观看| 精品欧美久久久| 午夜裸体女人视频网站在线观看| 激情五月综合色婷婷一区二区| 亚洲美女啪啪| 久久精品一区二区免费播放| 91久久精品一区二区三区| av在线收看| 91精品久久久久| 欧美激情麻豆| 国产精品久久AV无码| 色综合激情久久| av在线免费一区| 91久久国产婷婷一区二区| 欧美日韩精品| 午夜一区二区三区免费| 日本韩国精品在线| 69久久夜色| 成人午夜影院在线观看| 中文在线一区| 国产一级淫片久久久片a级| 欧美一区二区三区视频免费播放 | 99久久99久久精品国产片果冰| 中文字幕乱码在线人视频| 午夜在线成人av| 国产高清免费av在线| 91视频免费网站| 中国女人久久久| 国产精品精品软件男同| 亚洲国产精品热久久| 影音成人av| www.av91| 国产亚洲女人久久久久毛片| 国产精品视频一二区| 97人人做人人爱| 日韩av久操| 日韩Av无码精品| 欧美日韩精品系列| 国产黄色大片在线观看| 日韩精品不卡| 岛国精品在线播放| 欧美国产一级片| 色综合五月天导航| 日韩在线欧美| 在线免费观看污视频| 欧美美女一区二区| 美脚恋feet久草欧美| 成年人深夜视频| 亚洲国产电影在线观看|