www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 公眾號精選 > Linux閱碼場
[導(dǎo)讀]一個最典型的要使用pu_relax()鎖的場景是忙等待(也就是死循環(huán)等一個事情的發(fā)生),在內(nèi)核里面有大量的代碼,比如等寄存器狀態(tài):比如做延遲:簡單來說,你如果在內(nèi)核里面寫了忙等待的代碼,都沒有在循環(huán)里面加個cpu_relax()的話,這基本上是一種比較幼稚的表現(xiàn)。根據(jù)內(nèi)核文檔vo...

一個最典型的要使用pu_relax()鎖的場景是忙等待(也就是死循環(huán)等一個事情的發(fā)生),在內(nèi)核里面有大量的代碼,比如等寄存器狀態(tài):

比如做延遲:

簡單來說,你如果在內(nèi)核里面寫了忙等待的代碼,都沒有在循環(huán)里面加個cpu_relax()的話,這基本上是一種比較幼稚的表現(xiàn)。


根據(jù)內(nèi)核文檔volatile-considered-harmful,cpu_relax()的描述:

由此可見cpu_relax()至少具備三大功能:

  1. 幫著省電;

  2. 如果是超線程CPU的機器,可以讓渡CPU給其他的線程;因為我這個CPU目前沒什么正經(jīng)事情干,等的時間不如放慢節(jié)奏,讓別人多干點;

  3. 它是一個編譯屏障,讓volatile變地在內(nèi)核基本沒什么必要。

當(dāng)然,cpu_relax()的具體實現(xiàn)與體系架構(gòu)相關(guān),不同的體系架構(gòu)實現(xiàn)不一樣,可能只完成了上面3個功能中的1個,2個而不是全部。


我們看看它在ARM64的實現(xiàn):


其中"memory"的部分是服務(wù)于屏障功能,而前面的yield符合SMT系統(tǒng)讓渡的語義。在典型的超線程處理器中,每個超線程不是一個獨立的core,所以兩個或者多個超線程之間仍然在競爭一些資源,如果其中一個人調(diào)用了yield,那么它會在爭搶中放慢節(jié)奏,而旁邊的那個兄弟會搶地更多。


PowerPC的實現(xiàn)則是調(diào)節(jié)hardware multi-threading的優(yōu)先級:


當(dāng)然,硬件如果不具備這種超線程能力的話,cpu_relax()可以簡單地是一個編譯屏障,比如arch/alpha/include/asm/processor.h中:

#define cpu_relax() barrier()

在arch/x86/include/asm/vdso/processor.h的實現(xiàn)中:

REP NOP這種pause操作既可以省點,有可以避免忙等的CPU瘋狂去搶總線訪問內(nèi)存。如果純粹地不加pause暗示的忙等,瘋狂執(zhí)行指令,應(yīng)該是很耗電的,忙等中拼命訪問內(nèi)存,總線沖突也大。


總之,不管具體的體系架構(gòu)怎么實現(xiàn),忙等里面都適合加cpu_relax(),畢竟內(nèi)核多數(shù)的代碼要求是跨平臺的。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉
關(guān)閉