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

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

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

比如做延遲:

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


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

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

  1. 幫著省電;

  2. 如果是超線(xiàn)程CPU的機(jī)器,可以讓渡CPU給其他的線(xiàn)程;因?yàn)槲疫@個(gè)CPU目前沒(méi)什么正經(jīng)事情干,等的時(shí)間不如放慢節(jié)奏,讓別人多干點(diǎn);

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

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


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


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


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


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

#define cpu_relax() barrier()

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

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


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

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