在具有多個(gè)執(zhí)行線程的系統(tǒng)中,某些資源可能不能同時(shí)被訪問(wèn)或者修改。這些資源可以是外圍設(shè)備或內(nèi)存緩沖區(qū)和數(shù)據(jù)結(jié)構(gòu),例如打印機(jī)不會(huì)在一個(gè)時(shí)刻響應(yīng)多個(gè)訪問(wèn)。這就需要一些同步機(jī)制去處理這些資源的同時(shí)控制(concurrency control)問(wèn)題。需要注意的是,這里說(shuō)的“同步”,不是同時(shí)的意思,而是協(xié)同的意思。某個(gè)資源使用受限的情況下,你用完了我用,大家協(xié)同工作。
可以通過(guò)“鎖(lock)”機(jī)制來(lái)實(shí)現(xiàn)同步,對(duì)這些不能同時(shí)被訪問(wèn)的共享資源提供一個(gè)鎖。線程在訪問(wèn)這些資源之前必須先獲得鎖權(quán)限。這時(shí),如果其它線程也想申請(qǐng)鎖,會(huì)發(fā)現(xiàn)鎖被占用,只能等待鎖被釋放。擁有鎖的線程在訪問(wèn)結(jié)束后,必須釋放鎖,以便其它的線程可以繼續(xù)訪問(wèn)。
可以使用內(nèi)存中的變量來(lái)實(shí)現(xiàn)簡(jiǎn)單的鎖,該變量可以包含兩個(gè)值(狀態(tài)):LOCKED和UNLOCKED。進(jìn)程如果發(fā)現(xiàn)這個(gè)鎖是UNLOCKED狀態(tài),即可以修改為L(zhǎng)OCKED,并擁有該資源的訪問(wèn)權(quán)限。

圖中的整個(gè)過(guò)程分為三個(gè)步驟:
讀內(nèi)存中的變量,并做狀態(tài)比較;
修改寄存器值;
寫(xiě)內(nèi)存變量。
在具有多個(gè)核或線程的系統(tǒng)中,此方法容易受到另一個(gè)線程的攻擊,即在變量值的第一次讀取和回寫(xiě)之間修改內(nèi)存中的值。
這個(gè)問(wèn)題可以用軟件解決,也可以用額外的硬件功能來(lái)解決。一種解決方案可以是使“讀-比較-修改-寫(xiě)(read-compare-modify-write)”的原子操作指令。ARM架構(gòu)的早期版本使用SWP指令實(shí)現(xiàn)類(lèi)似的功能。
ARMv8-A使用下面要介紹的,一種特殊類(lèi)型的加載和存儲(chǔ)指令來(lái)檢測(cè)內(nèi)存中的值自上次讀取以來(lái)是否發(fā)生了變化。ARMv8-A 64位指令集提供了兩條獨(dú)占指令LDXR(Load Exclusive)和STXR(Store Exclusive)。
當(dāng)使用LDXR指令讀取地址時(shí),會(huì)將其標(biāo)記為獨(dú)占訪問(wèn)。如果使用STXR指令向標(biāo)記為獨(dú)占的地址寫(xiě)入,則會(huì)清除獨(dú)占狀態(tài)。嘗試使用STXR指令向未標(biāo)記為獨(dú)占的地址寫(xiě)入將會(huì)失敗。地址的獨(dú)占狀態(tài)由稱(chēng)為獨(dú)占監(jiān)視器(Exclusive Monitor)的硬件維護(hù)。
使用獨(dú)占load/store后的鎖實(shí)現(xiàn):

鎖值的更新不能保證是原子的,但現(xiàn)在可以檢測(cè)到初始讀取和更新之間的任何更改。如果獨(dú)占存儲(chǔ)失敗,軟件可以再次嘗試獲取鎖。
前面提到過(guò),需要對(duì)標(biāo)記為獨(dú)占的地址進(jìn)行監(jiān)控。獨(dú)占監(jiān)視器可以是一個(gè)簡(jiǎn)單的狀態(tài)機(jī),其狀態(tài)可以是開(kāi)放的(open)和獨(dú)占的(exclusive)。ARM架構(gòu)定義了兩種不同的狀態(tài)機(jī):本地獨(dú)占監(jiān)視器(Local Exclusive Monitor)和全局獨(dú)占監(jiān)視器(Global Exclusive Monitor)。
根據(jù)被訪問(wèn)地址的可共享性屬性,檢查本地監(jiān)視器或全局監(jiān)視器的獨(dú)占訪問(wèn)。
對(duì)于Non-shareable地址的獨(dú)占訪問(wèn)檢查僅在本地獨(dú)監(jiān)視器。
對(duì)shareable地址的獨(dú)占訪問(wèn)檢查在本地監(jiān)視器或全局監(jiān)視器。
每個(gè)處理器核都有一個(gè)與其關(guān)聯(lián)的本地監(jiān)視器。本地監(jiān)視器可以構(gòu)造為保存特定地址的獨(dú)占狀態(tài),也可以構(gòu)造為不保存該地址。本地監(jiān)視器作為處理器的一部分實(shí)現(xiàn)。
全局監(jiān)視器在多個(gè)處理器核之間共享。與本地監(jiān)視器一樣,它們只需要監(jiān)視一個(gè)地址,如果監(jiān)視器可以標(biāo)記多個(gè)地址,則每個(gè)地址都有自己的狀態(tài)機(jī)。
ARM體系結(jié)構(gòu)要求以下內(nèi)存類(lèi)型能夠與全局監(jiān)視器一起工作:

如果程序無(wú)法獲得鎖,會(huì)不斷嘗試申請(qǐng)鎖。但是這樣會(huì)浪費(fèi)處理器的資源,并且消耗不必要的功耗。有幾種方式可以改善這個(gè)問(wèn)題。對(duì)于在釋放鎖之前等待時(shí)間相對(duì)較長(zhǎng)的情況,鎖代碼可以返回給操作系統(tǒng)調(diào)度程序,這允許在釋放鎖之前調(diào)度其它線程。
對(duì)于鎖可能快速被釋放的情況,ARM架構(gòu)有一種機(jī)制,即允許處理器暫停執(zhí)行,進(jìn)入低功耗模式,等待鎖被釋放。ARM提供WFE(Wait For Event)指令,如果處理器申請(qǐng)鎖失敗,程序可以執(zhí)行WFE進(jìn)入等待。以前的做法是,負(fù)責(zé)釋放鎖的代碼中會(huì)執(zhí)行SEV(Send Event)指令,通過(guò)發(fā)送EVENT喚醒正在等待鎖資源的處理器核。現(xiàn)在ARMv8-A架構(gòu)中,清除全局監(jiān)視器會(huì)自動(dòng)向所有連接的處理器核發(fā)送EVENT喚醒。
審核編輯 :李倩
-
ARM
+關(guān)注
關(guān)注
135文章
9564瀏覽量
392533 -
寄存器
+關(guān)注
關(guān)注
31文章
5611瀏覽量
130135 -
變量
+關(guān)注
關(guān)注
0文章
616瀏覽量
29532
原文標(biāo)題:技術(shù)分享 | ARM系列 -- 同步原語(yǔ)
文章出處:【微信號(hào):Ithingedu,微信公眾號(hào):安芯教育科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
高效同步升壓DC/DC轉(zhuǎn)換器LTC3525系列:特性、應(yīng)用與設(shè)計(jì)要點(diǎn)
Xilinx FPGA輸入延遲原語(yǔ)介紹
LTC3622系列:高效雙路同步降壓調(diào)節(jié)器的卓越之選
德州儀器TPSM86325x系列同步降壓模塊:設(shè)計(jì)與應(yīng)用全解析
德州儀器TPSM86125x系列同步降壓模塊:高效電源解決方案
RDMA設(shè)計(jì)46:RoCE v2原語(yǔ)功能:?jiǎn)芜呎Z(yǔ)義
RDMA設(shè)計(jì)45:RoCE v2 原語(yǔ)功能驗(yàn)證與分析2
西門(mén)子EDA與Arm攜手合作加速系統(tǒng)設(shè)計(jì)驗(yàn)證進(jìn)程與軟件啟動(dòng)
Arm SystemReady研討會(huì)圓滿召開(kāi)
麥斯塔MST8011AI-12系列晶振:光模塊通信的“同步引擎”
ARM系列--同步原語(yǔ)
評(píng)論