新聞中心
隨著計(jì)算機(jī)硬件技術(shù)的不斷發(fā)展,多核處理器已經(jīng)成為了現(xiàn)代計(jì)算機(jī)的重要組成部分。而Linux作為更流行的開(kāi)源操作系統(tǒng)之一,已經(jīng)提供了對(duì)多核處理器的完全支持。那么,Linux內(nèi)核支持多核是如何實(shí)現(xiàn)的呢?本文將探討Linux內(nèi)核支持多核的實(shí)現(xiàn)原理。

創(chuàng)新互聯(lián)公司主營(yíng)應(yīng)城網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都app軟件開(kāi)發(fā)公司,應(yīng)城h5微信小程序搭建,應(yīng)城網(wǎng)站營(yíng)銷推廣歡迎應(yīng)城等地區(qū)企業(yè)咨詢
了解多核處理器
在探討Linux內(nèi)核支持多核的實(shí)現(xiàn)原理之前,我們需要了解多核處理器的工作原理。多核處理器就是在一個(gè)物理處理器集成兩個(gè)或多個(gè)核心。每個(gè)核心都是一個(gè)完整的處理器,可以處理一個(gè)線程。因此,多核處理器可以同時(shí)處理多個(gè)線程,從而提高計(jì)算機(jī)的性能。
多核處理器的性能提高取決于多個(gè)因素,包括程序的并行性、內(nèi)存帶寬、線程間通信的效率等。有時(shí)候,由于多個(gè)線程競(jìng)爭(zhēng)同一個(gè)資源,可能會(huì)出現(xiàn)性能瓶頸。因此,合理地使用多核處理器需要更高的系統(tǒng)優(yōu)化水平。
Linux內(nèi)核如何支持多核?
1. 處理器親和性
處理器親和性是一種機(jī)制,用于將進(jìn)程綁定到特定的處理器核心上。在Linux內(nèi)核中,處理器親和性是通過(guò) sched_setaffinity() 系統(tǒng)調(diào)用實(shí)現(xiàn)的。這個(gè)系統(tǒng)調(diào)用可以將進(jìn)程綁定到一個(gè)或多個(gè)特定的處理器上。通過(guò)處理器親和性機(jī)制,可以使得進(jìn)程優(yōu)先在綁定的處理器上運(yùn)行,從而提高系統(tǒng)的性能。
2. 任務(wù)調(diào)度
Linux內(nèi)核對(duì)于多核處理器的支持,還涉及到任務(wù)調(diào)度機(jī)制。任務(wù)調(diào)度是指內(nèi)核決定哪個(gè)進(jìn)程占用處理器的時(shí)間。在多核處理器中,任務(wù)調(diào)度需要考慮許多因素,例如處理器親和性、負(fù)載均衡等。內(nèi)核的調(diào)度器必須合理地分配處理器內(nèi)核,從而保證每個(gè)進(jìn)程都可以獲得足夠的時(shí)間片,使系統(tǒng)保持高效運(yùn)行。
3. 中斷處理
中斷處理是指當(dāng)系統(tǒng)硬件設(shè)備發(fā)生需要處理的事件時(shí),中斷處理程序被調(diào)用處理這個(gè)事件。在多核處理器中,中斷處理需要考慮到每個(gè)核心的中斷處理程序的并發(fā)性。 Linux內(nèi)核通過(guò)使用自旋鎖和信號(hào)量等機(jī)制來(lái)處理并發(fā)中斷請(qǐng)求,保證每個(gè)內(nèi)核都可以按照正確的順序處理中斷請(qǐng)求,確保系統(tǒng)的穩(wěn)定運(yùn)行。
4. 線程同步
在多核處理器中,線程同步是非常重要的因素,如果沒(méi)有得到正確的處理,可能會(huì)導(dǎo)致系統(tǒng)的不穩(wěn)定。線程同步是指當(dāng)多個(gè)線程訪問(wèn)共享資源時(shí),確保每個(gè)線程訪問(wèn)時(shí)機(jī)的協(xié)調(diào)性。在Linux內(nèi)核中,線程同步是通過(guò)鎖機(jī)制來(lái)實(shí)現(xiàn)的。鎖機(jī)制確保每個(gè)線程能夠按照正確的先后順序訪問(wèn)共享資源,從而防止出現(xiàn)訪問(wèn)沖突,導(dǎo)致系統(tǒng)的不穩(wěn)定。
在多核處理器上,Linux內(nèi)核支持多核的實(shí)現(xiàn)是一個(gè)復(fù)雜而細(xì)致的工作。Linux內(nèi)核提供了處理器親和性、任務(wù)調(diào)度、中斷處理和線程同步等機(jī)制來(lái)優(yōu)化多核處理器的運(yùn)行。這樣就可以充分利用多核處理器的優(yōu)勢(shì),提高計(jì)算機(jī)的性能。了解Linux內(nèi)核支持多核的實(shí)現(xiàn)原理不僅可以讓我們更好地使用計(jì)算機(jī),還可以在優(yōu)化系統(tǒng)性能方面著手進(jìn)行更深層次的工作。
相關(guān)問(wèn)題拓展閱讀:
- 在Linux系統(tǒng)上,多個(gè)線程能否同時(shí)使用多個(gè)CPU核心?有人說(shuō)能,有人說(shuō)不能
- arm linux 多核同時(shí)運(yùn)行
- 并行編程技術(shù)是誰(shuí)的核心技術(shù)體系
在Linux系統(tǒng)上,多個(gè)線程能否同時(shí)使用多個(gè)CPU核心?有人說(shuō)能,有人說(shuō)不能
與超慎慎核線程CPU在邏輯上模擬雙核不同,多核CPU每個(gè)核心都可以獨(dú)立執(zhí)行一個(gè)線程,是真正意義的多個(gè)物理CPU。
第孝耐二個(gè)問(wèn)題,如果你的程序的線程數(shù)少于CPU的核心數(shù),且系統(tǒng)此時(shí)沒(méi)有其他進(jìn)程同時(shí)運(yùn)行,那么這個(gè)程序的每個(gè)線程會(huì)享有一個(gè)CPU,當(dāng)同時(shí)運(yùn)行的線程數(shù)多于CPU核心數(shù)時(shí),CPU會(huì)采用一定的調(diào)度算法每隔一段時(shí)間就將這些線程調(diào)入或調(diào)出CPU,以寬掘確保每個(gè)線程都能分享一部分CPU時(shí)間,實(shí)現(xiàn)多線程并發(fā)。
arm linux 多核同時(shí)運(yùn)行
多處理器可以被定義用來(lái)包含多個(gè)core的單個(gè)設(shè)備中含爛同時(shí)運(yùn)行二洞迅?jìng)€(gè)或多個(gè)指令?,F(xiàn)在廣泛應(yīng)用于通用應(yīng)用處理器和嵌談?lì)澛┤胧较到y(tǒng)中。
并行編程技術(shù)是誰(shuí)的核心技術(shù)體系
并行編程技術(shù)是誰(shuí)的核心技術(shù)體系
在摩爾定律失效之前,提升處理器性能通過(guò)主頻提升、硬件超線程等技術(shù)就能滿足應(yīng)用需要。隨著主頻提升慢慢接近撞上光速這道墻,摩爾定律開(kāi)始逐漸失效,多核集成為處理器性能提升的主流手段。現(xiàn)在市面上已經(jīng)很難看到單核的處理器,就是這一發(fā)展趨勢(shì)的佐證。要充分發(fā)揮多核豐富的計(jì)算資源優(yōu)勢(shì),多核下的并行編程就不可避免,Linux kernel就是一典型的多核并行編程嘩襲纖場(chǎng)景。但多核下的并行編程卻挑戰(zhàn)多多。
多核并行編程的挑戰(zhàn)
目前主流的計(jì)算機(jī)都是馮諾依曼架構(gòu),即共享內(nèi)存的計(jì)算模型,這種過(guò)程計(jì)算模亂仿型對(duì)并行計(jì)算并不友好。下圖是一種典型的計(jì)算機(jī)硬件體系架構(gòu)。
這種架構(gòu)中,有如下設(shè)計(jì)特點(diǎn):
多個(gè)CPU核改善處理器的計(jì)算處理能力;
多級(jí)cache改善CPU訪問(wèn)主存的效率;
各個(gè)CPU都有本地內(nèi)存(NUMA(非一致性內(nèi)存訪問(wèn))),進(jìn)一步改善CPU訪問(wèn)主存的效率;
store buffer模塊改善cache write由于應(yīng)答延遲而造成的寫(xiě)停頓問(wèn)題;
invalidate queue模塊改善使無(wú)效應(yīng)答的時(shí)延,把使無(wú)效命令放入queue后就立即發(fā)送應(yīng)答;
外設(shè)DMA支持直接訪問(wèn)主存,改善CPU使用效率;
這些硬件體系設(shè)計(jì)特點(diǎn)也引入很多問(wèn)題,更大的問(wèn)題就是cache一致性問(wèn)題和亂序執(zhí)行問(wèn)題。
cache一致性問(wèn)題由cache一致性協(xié)議MESI解決,MESI由硬件保禪逗證,對(duì)軟件來(lái)說(shuō)是透明的。MESI協(xié)議保證所有CPU對(duì)單個(gè)cache line中單個(gè)變量修改的順序保持一致,但不保證不同變量的修改在所有CPU上看到的是相同順序。這就造成了亂序。不僅如此,亂序的原因還有很多:
store buffer引起的延遲處理,會(huì)造成亂序;
invalidate queue引起的延遲處理,會(huì)造成亂序;
編譯優(yōu)化,會(huì)造成亂序;
分支預(yù)測(cè)、多流水線等CPU硬件優(yōu)化技術(shù),會(huì)造成亂序;
外設(shè)DMA,會(huì)造成數(shù)據(jù)亂序;
這種情況造成,就連簡(jiǎn)單的++運(yùn)算操作的原子性都無(wú)法保證。這些問(wèn)題必須采用多核并行編程新的技術(shù)手段來(lái)解決。
多核并行編程關(guān)鍵技術(shù)
鎖技術(shù)
Linux kernel提供了多種鎖機(jī)制,如自旋鎖、信號(hào)量、互斥量、讀寫(xiě)鎖、順序鎖等。各種鎖的簡(jiǎn)單比較如下,具體實(shí)現(xiàn)和使用細(xì)節(jié)這里就不展開(kāi)了,可以參考《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)》等書(shū)的相關(guān)章節(jié)。
自旋鎖,不休眠,無(wú)進(jìn)程上下文切換開(kāi)銷,可以用在中斷上下文和臨界區(qū)小的場(chǎng)合;
信號(hào)量,會(huì)休眠,支持同時(shí)多個(gè)并發(fā)體進(jìn)入臨界區(qū),可以用在可能休眠或者長(zhǎng)的臨界區(qū)的場(chǎng)合;
互斥量,類似與信號(hào)量,但只支持同時(shí)只有一個(gè)并發(fā)體進(jìn)入臨界區(qū);
讀寫(xiě)鎖,支持讀并發(fā),寫(xiě)寫(xiě)/讀寫(xiě)間互斥,讀會(huì)延遲寫(xiě),對(duì)讀友好,適用讀側(cè)重場(chǎng)合;
順序鎖,支持讀并發(fā),寫(xiě)寫(xiě)/讀寫(xiě)間互斥,寫(xiě)會(huì)延遲讀,對(duì)寫(xiě)友好,適用寫(xiě)側(cè)重場(chǎng)合;
鎖技術(shù)雖然能有效地提供并行執(zhí)行下的競(jìng)態(tài)保護(hù),但鎖的并行可擴(kuò)展性很差,無(wú)法充分發(fā)揮多核的性能優(yōu)勢(shì)。鎖的粒度太粗會(huì)限制擴(kuò)展性,粒度太細(xì)會(huì)導(dǎo)致巨大的系統(tǒng)開(kāi)銷,而且設(shè)計(jì)難度大,容易造成死鎖。除了并發(fā)可擴(kuò)展性差和死鎖外,鎖還會(huì)引入很多其他問(wèn)題,如鎖驚群、活鎖、饑餓、不公平鎖、優(yōu)先級(jí)反轉(zhuǎn)等。不過(guò)也有一些技術(shù)手段或指導(dǎo)原則能解決或減輕這些問(wèn)題的風(fēng)險(xiǎn)。
按統(tǒng)一的順序使用鎖(鎖的層次),解決死鎖問(wèn)題;
指數(shù)后退,解決活鎖/饑餓問(wèn)題;
范圍鎖(樹(shù)狀鎖),解決鎖驚群?jiǎn)栴};
優(yōu)先級(jí)繼承,解決優(yōu)先級(jí)反轉(zhuǎn)問(wèn)題 ;
原子技術(shù)
原子技術(shù)主要是解決cache和內(nèi)存不一致性和亂序執(zhí)行對(duì)原子訪問(wèn)的破壞問(wèn)題。Linux kernel中主要的原子原語(yǔ)有:
ACCESS_ONCE()、READ_ONCE() and WRITE_ONCE():禁止編譯器對(duì)數(shù)據(jù)訪問(wèn)的優(yōu)化,強(qiáng)制從內(nèi)存而不是緩存中獲取數(shù)據(jù);
barrier():亂序訪問(wèn)內(nèi)存屏障,限制編譯器的亂序優(yōu)化;
b_wmb():寫(xiě)內(nèi)存屏障,刷新store buffer,同時(shí)限制編譯器和CPU的亂序優(yōu)化;
b_rmb():讀內(nèi)存屏障,刷新invalidate queue,同時(shí)限制編譯器和CPU的亂序優(yōu)化;
b_mb():讀寫(xiě)內(nèi)存屏障,同時(shí)刷新store buffer和invalidate queue,同時(shí)限制編譯器和CPU的亂序優(yōu)化;
atomic_inc()/atomic_read()等:整型原子操作;
嚴(yán)格來(lái)說(shuō),Linux kernel作為系統(tǒng)軟件,實(shí)現(xiàn)受硬件影響很大,不同硬件有不同的內(nèi)存模型,因此,不同于高級(jí)語(yǔ)言,Linux kernel的原子原語(yǔ)語(yǔ)義并沒(méi)有一個(gè)統(tǒng)一模型。比如在P的ARM64 CPU上,barrier、b_wmb、b_rmb的實(shí)現(xiàn)與b_mb都是一樣的,都是volatile (“” ::: “memory”)。
另外,再多提一句的是,atomic_inc()原語(yǔ)為了保證原子性,需要對(duì)cache進(jìn)行刷新,而緩存行在多核體系下傳播相當(dāng)耗時(shí),其多核下的并行可擴(kuò)展性差。
無(wú)鎖技術(shù)
上一小節(jié)中所提到的原子技術(shù),是無(wú)鎖技術(shù)中的一種,除此之外,無(wú)鎖技術(shù)還包括RCU、Hazard pointer等。值得一提的是,這些無(wú)鎖技術(shù)都基于內(nèi)存屏障實(shí)現(xiàn)的。
Hazard pointer主要用于對(duì)象的生命周期管理,類似引用計(jì)數(shù),但比引用計(jì)數(shù)有更好的并行可擴(kuò)展性;
RCU適用的場(chǎng)景很多,其可以替代:讀寫(xiě)鎖、引用計(jì)數(shù)、垃圾回收器、等待事物結(jié)束等,而且有更好的并行擴(kuò)展性。但RCU也有一些不適用的場(chǎng)景,如寫(xiě)側(cè)重;臨界區(qū)長(zhǎng);臨界區(qū)內(nèi)休眠等場(chǎng)景。
不過(guò),所有的無(wú)鎖原語(yǔ)也只能解決讀端的并行可擴(kuò)展性問(wèn)題,寫(xiě)端的并行可擴(kuò)展性只能通過(guò)數(shù)據(jù)分割技術(shù)來(lái)解決。
數(shù)據(jù)分割技術(shù)
分割數(shù)據(jù)結(jié)構(gòu),減少共享數(shù)據(jù),是解決并行可擴(kuò)展性的根本辦法。對(duì)分割友好(即并行友好)的數(shù)據(jù)結(jié)構(gòu)有:
數(shù)組
哈希表
基樹(shù)(Radix Tree)/稀疏數(shù)組
跳躍列表(skip list)
使用這些便于分割的數(shù)據(jù)結(jié)構(gòu),有利于我們通過(guò)數(shù)據(jù)分割來(lái)改善并行可擴(kuò)展性。
除了使用合適的數(shù)據(jù)結(jié)構(gòu)外,合理的分割指導(dǎo)規(guī)則也很重要:
讀寫(xiě)分割:以讀為主的數(shù)據(jù)與以寫(xiě)為主的數(shù)據(jù)分開(kāi);
路徑分割:按獨(dú)立的代碼執(zhí)行路徑來(lái)分割數(shù)據(jù);
專項(xiàng)分割:把經(jīng)常更新的數(shù)據(jù)綁定到指定的CPU/線程中;
所有權(quán)分割:按CPU/線程個(gè)數(shù)對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行分割,把數(shù)據(jù)分割到per-cpu/per-thread中;
4種分割規(guī)則中,所有權(quán)分割是分割最徹底的。
以上這些多核并行編程內(nèi)容基本上涵蓋了Linux kernel中所有的并發(fā)編程關(guān)鍵技術(shù)。當(dāng)然并行編程還有很多其他技術(shù)沒(méi)有應(yīng)用到Linux kernel中的,如無(wú)副作用的并行函數(shù)式編程技術(shù)(Erlang/Go等)、消息傳遞、MapReduce等等。
關(guān)于linux 內(nèi)核 多核的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
分享文章:Linux內(nèi)核支持多核是如何實(shí)現(xiàn)的?(linux內(nèi)核多核)
分享路徑:http://www.fisionsoft.com.cn/article/cdocipo.html


咨詢
建站咨詢
