來源:wahaha02 發(fā)布時間:2018-06-29 11:26:41 閱讀量:1504
在摩爾定律失效之前,提升處理器性能通過主頻提升、硬件超線程等技術(shù)就能滿足應(yīng)用需要。隨著主頻提升慢慢接近撞上光速這道墻,摩爾定律開始逐漸失效,多核集成為處理器性能提升的主流手段?,F(xiàn)在市面上已經(jīng)很難看到單核的處理器,就是這一發(fā)展趨勢的佐證。要充分發(fā)揮多核豐富的計算資源優(yōu)勢,多核下的并行編程就不可避免,Linux kernel就是一典型的多核并行編程場景。但多核下的并行編程卻挑戰(zhàn)多多。
目前主流的計算機都是馮諾依曼架構(gòu),即共享內(nèi)存的計算模型,這種過程計算模型對并行計算并不友好。下圖是一種典型的計算機硬件體系架構(gòu)。
這種架構(gòu)中,有如下設(shè)計特點:
·多級cache改善CPU訪問主存的效率;
·store buffer模塊改善cache write由于應(yīng)答延遲而造成的寫停頓問題;
外設(shè)DMA支持直接訪問主存,改善CPU使用效率;
cache一致性問題由cache一致性協(xié)議MESI解決,MESI由硬件保證,對軟件來說是透明的。MESI協(xié)議保證所有CPU對單個cache line中單個變量修改的順序保持一致,但不保證不同變量的修改在所有CPU上看到的是相同順序。這就造成了亂序。不僅如此,亂序的原因還有很多:
·invalidate queue引起的延遲處理,會造成亂序;
·分支預(yù)測、多流水線等CPU硬件優(yōu)化技術(shù),會造成亂序;
這種情況造成,就連簡單的++運算操作的原子性都無法保證。這些問題必須采用多核并行編程新的技術(shù)手段來解決。
鎖技術(shù)
·自旋鎖,不休眠,無進程上下文切換開銷,可以用在中斷上下文和臨界區(qū)小的場合;
·互斥量,類似與信號量,但只支持同時只有一個并發(fā)體進入臨界區(qū);
·順序鎖,支持讀并發(fā),寫寫/讀寫間互斥,寫會延遲讀,對寫友好,適用寫側(cè)重場合;
·按統(tǒng)一的順序使用鎖(鎖的層次),解決死鎖問題;
·范圍鎖(樹狀鎖),解決鎖驚群問題;
原子技術(shù)
ACCESS_ONECE():只限制編譯器對內(nèi)存訪問的優(yōu)化;
smb_wmb():寫內(nèi)存屏障,刷新store buffer,同時限制編譯器和CPU的亂序優(yōu)化;
smb_mb():讀寫內(nèi)存屏障,同時刷新store buffer和invalidate queue,同時限制編譯器和CPU的亂序優(yōu)化;
多提一句的是,atomic_inc()原語為了保證原子性,需要對cache進行刷新,而緩存行在多核體系下傳播相當(dāng)耗時,其多核下的并行可擴展性差。
上一小節(jié)中所提到的原子技術(shù),是無鎖技術(shù)中的一種,除此之外,無鎖技術(shù)還包括RCU、Hazard pointer等。值得一提的是,這些無鎖技術(shù)都基于內(nèi)存屏障實現(xiàn)的。
RCU適用的場景很多,其可以替代:讀寫鎖、引用計數(shù)、垃圾回收器、等待事物結(jié)束等,而且有更好的并行擴展性。但RCU也有一些不適用的場景,如寫側(cè)重;臨界區(qū)長;臨界區(qū)內(nèi)休眠等場景。
數(shù)據(jù)分割技術(shù)
·數(shù)組
·基樹(Radix Tree)/稀疏數(shù)組
使用這些便于分割的數(shù)據(jù)結(jié)構(gòu),有利于我們通過數(shù)據(jù)分割來改善并行可擴展性。
·讀寫分割:以讀為主的數(shù)據(jù)與以寫為主的數(shù)據(jù)分開;
·專項分割:把經(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