來源:wahaha02 發(fā)布時(shí)間:2018-06-29 11:26:41 閱讀量:1304
在摩爾定律失效之前,提升處理器性能通過主頻提升、硬件超線程等技術(shù)就能滿足應(yīng)用需要。隨著主頻提升慢慢接近撞上光速這道墻,摩爾定律開始逐漸失效,多核集成為處理器性能提升的主流手段?,F(xiàn)在市面上已經(jīng)很難看到單核的處理器,就是這一發(fā)展趨勢(shì)的佐證。要充分發(fā)揮多核豐富的計(jì)算資源優(yōu)勢(shì),多核下的并行編程就不可避免,Linux kernel就是一典型的多核并行編程場(chǎng)景。但多核下的并行編程卻挑戰(zhàn)多多。
目前主流的計(jì)算機(jī)都是馮諾依曼架構(gòu),即共享內(nèi)存的計(jì)算模型,這種過程計(jì)算模型對(duì)并行計(jì)算并不友好。下圖是一種典型的計(jì)算機(jī)硬件體系架構(gòu)。
這種架構(gòu)中,有如下設(shè)計(jì)特點(diǎn):
·多級(jí)cache改善CPU訪問主存的效率;
·store buffer模塊改善cache write由于應(yīng)答延遲而造成的寫停頓問題;
外設(shè)DMA支持直接訪問主存,改善CPU使用效率;
cache一致性問題由cache一致性協(xié)議MESI解決,MESI由硬件保證,對(duì)軟件來說是透明的。MESI協(xié)議保證所有CPU對(duì)單個(gè)cache line中單個(gè)變量修改的順序保持一致,但不保證不同變量的修改在所有CPU上看到的是相同順序。這就造成了亂序。不僅如此,亂序的原因還有很多:
·invalidate queue引起的延遲處理,會(huì)造成亂序;
·分支預(yù)測(cè)、多流水線等CPU硬件優(yōu)化技術(shù),會(huì)造成亂序;
這種情況造成,就連簡(jiǎn)單的++運(yùn)算操作的原子性都無法保證。這些問題必須采用多核并行編程新的技術(shù)手段來解決。
鎖技術(shù)
·自旋鎖,不休眠,無進(jìn)程上下文切換開銷,可以用在中斷上下文和臨界區(qū)小的場(chǎng)合;
·互斥量,類似與信號(hào)量,但只支持同時(shí)只有一個(gè)并發(fā)體進(jìn)入臨界區(qū);
·順序鎖,支持讀并發(fā),寫寫/讀寫間互斥,寫會(huì)延遲讀,對(duì)寫友好,適用寫側(cè)重場(chǎng)合;
·按統(tǒng)一的順序使用鎖(鎖的層次),解決死鎖問題;
·范圍鎖(樹狀鎖),解決鎖驚群?jiǎn)栴};
原子技術(shù)
ACCESS_ONECE():只限制編譯器對(duì)內(nèi)存訪問的優(yōu)化;
smb_wmb():寫內(nèi)存屏障,刷新store buffer,同時(shí)限制編譯器和CPU的亂序優(yōu)化;
smb_mb():讀寫內(nèi)存屏障,同時(shí)刷新store buffer和invalidate queue,同時(shí)限制編譯器和CPU的亂序優(yōu)化;
多提一句的是,atomic_inc()原語為了保證原子性,需要對(duì)cache進(jìn)行刷新,而緩存行在多核體系下傳播相當(dāng)耗時(shí),其多核下的并行可擴(kuò)展性差。
上一小節(jié)中所提到的原子技術(shù),是無鎖技術(shù)中的一種,除此之外,無鎖技術(shù)還包括RCU、Hazard pointer等。值得一提的是,這些無鎖技術(shù)都基于內(nèi)存屏障實(shí)現(xiàn)的。
RCU適用的場(chǎng)景很多,其可以替代:讀寫鎖、引用計(jì)數(shù)、垃圾回收器、等待事物結(jié)束等,而且有更好的并行擴(kuò)展性。但RCU也有一些不適用的場(chǎng)景,如寫側(cè)重;臨界區(qū)長(zhǎng);臨界區(qū)內(nèi)休眠等場(chǎng)景。
數(shù)據(jù)分割技術(shù)
·數(shù)組
·基樹(Radix Tree)/稀疏數(shù)組
使用這些便于分割的數(shù)據(jù)結(jié)構(gòu),有利于我們通過數(shù)據(jù)分割來改善并行可擴(kuò)展性。
·讀寫分割:以讀為主的數(shù)據(jù)與以寫為主的數(shù)據(jù)分開;
·專項(xiàng)分割:把經(jīng)常更新的數(shù)據(jù)綁定到指定的CPU/線程中;
4種分割規(guī)則中,所有權(quán)分割是分割最徹底的。
<p white-space:normal;background-color:#ffffff;"="" style="word-wrap: break-word; margin-top: 0px; margin-bottom: 0px; padding: 20px 0px 0px; font-family: 宋體, Arial; white-space: normal; background-color: rgb(255, 255, 255); color: rgb(51, 51, 51); word-break: break-all; line-height: 2;"> 以上這些多核并行編程內(nèi)容基本上涵蓋了Linux kernel中所有的并發(fā)編程關(guān)鍵技術(shù)。當(dāng)然并行編程還有很多其他技術(shù)沒有應(yīng)用到Linux kernel中的,如無副作用的并行函數(shù)式編程技術(shù)(Erlang/Go等)、消息傳遞、MapReduce等等。
原文鏈接:https://www.cnblogs.com/wahaha02/p/9175637.html
在線
客服
服務(wù)時(shí)間:周一至周日 08:30-18:00
選擇下列產(chǎn)品馬上在線溝通:
客服
熱線
7*24小時(shí)客服服務(wù)熱線
關(guān)注
微信
關(guān)注官方微信