我們聊聊單核可以實(shí)現(xiàn)多線程嗎?
首先答案是“可以”,接下來就說說為啥可以。解釋此問題可以從兩個(gè)方面思考,一個(gè)是計(jì)算機(jī)如此復(fù)雜和強(qiáng)大的根本原因是什么?一個(gè)是硬件與軟件的依賴關(guān)系是怎樣的?明確了這兩個(gè)問題的答案后,再回頭看本問題,就會(huì)發(fā)現(xiàn)單核能夠?qū)崿F(xiàn)多線程是多么理所當(dāng)然的事。
一、計(jì)算機(jī)如此復(fù)雜和強(qiáng)大的原因
了解過計(jì)算機(jī)和操作系統(tǒng)歷史的人應(yīng)該很快就能發(fā)現(xiàn),計(jì)算機(jī)之所以會(huì)變得如此復(fù)雜和強(qiáng)大完全是“單核多任務(wù)”的實(shí)現(xiàn)與不斷擴(kuò)展導(dǎo)致的。計(jì)算機(jī)就是因?yàn)橐獙?shí)現(xiàn)“單核多任務(wù)”而變得復(fù)雜的,同時(shí)也是因?yàn)閷?shí)現(xiàn)了“單核多任務(wù)”變得強(qiáng)大,然后在對(duì)“單核多任務(wù)”的不斷擴(kuò)展中變得更加強(qiáng)大。比如操作系統(tǒng)在最開始就只是個(gè)簡(jiǎn)單的“批處理系統(tǒng)”,本質(zhì)就是個(gè)多任務(wù)管理工具,且是非并發(fā)的。
開始的計(jì)算機(jī)雖然龐大,但是遠(yuǎn)沒有今天體積小得多的計(jì)算機(jī)強(qiáng)大和復(fù)雜。為啥呢?因?yàn)樗幚淼娜蝿?wù)非常單一,而且并發(fā)性也很低。開始時(shí)就根本沒有并發(fā),只能執(zhí)行最基本的純數(shù)學(xué)計(jì)算,在徹底完成一個(gè)計(jì)算任務(wù)前無法開始第二個(gè)任務(wù),就算開始第二個(gè)任務(wù)都要人來輔助操作。而其復(fù)雜化則是隨著任務(wù)之自動(dòng)推進(jìn)的實(shí)現(xiàn),以及進(jìn)一步“并發(fā)”的實(shí)現(xiàn)開始跨越式發(fā)展的。
而所謂“單核實(shí)現(xiàn)多線程”的本質(zhì)是啥呢?本質(zhì)不就是“單核多任務(wù)”嗎?只是這個(gè)“任務(wù)模型”比傳統(tǒng)的“進(jìn)程模型”顆粒更小了一點(diǎn),從而進(jìn)一步增加并發(fā)提升效率,對(duì)計(jì)算機(jī)的“單核多任務(wù)”這個(gè)核心模型而言,僅僅是量變,這為啥不能支持?答案當(dāng)然就是支持。
二、計(jì)算機(jī)硬件與軟件的依賴關(guān)系
不同軟件對(duì)硬件的依賴程度區(qū)別很大,依賴最強(qiáng)的就是“固件”,它隨硬件的生產(chǎn)一起被燒錄在硬件上,一度只能讀不能寫,后面即使可以改動(dòng)也要用“非常”手段,這種軟件顯然受硬件影響最大,典型的比如BIOS系統(tǒng)。但還有一種軟件,其存在就是為了“無視硬件區(qū)別”的,賣點(diǎn)就是“跨平臺(tái)”,它受硬件的制約就非常小,比如Java程序。
“單核”其實(shí)描述的是一種“硬件狀態(tài)”,而“多線程”是一種軟件機(jī)制,而且是很“軟”那種,其實(shí)現(xiàn)離“硬件的細(xì)節(jié)”距離很遠(yuǎn),受硬件的影響很小,與硬件是一種“解耦”狀態(tài),是“跨平臺(tái)”的。就像學(xué)習(xí)匯編指令一般都會(huì)參照某個(gè)具體的機(jī)型進(jìn)行,因?yàn)樗且环N與硬件依賴性很強(qiáng)的軟件,但是學(xué)進(jìn)程或者線程這種任務(wù)機(jī)制,你有見過哪本教材要強(qiáng)調(diào)“機(jī)型”嗎?
為啥不強(qiáng)調(diào)呢?當(dāng)然就是與其無關(guān)或不受其影響,既然不受其影響,當(dāng)然就是單核也好多核也罷,多線程機(jī)制都無所謂,都可以基于它們進(jìn)行實(shí)現(xiàn)。
三、總結(jié)
最后補(bǔ)充一點(diǎn)的就是,本文標(biāo)題為了方便說明,直接援引了別人的提問方式,而嚴(yán)謹(jǐn)?shù)恼f法不應(yīng)該是“單核可以實(shí)現(xiàn)多線程嗎?”,而是“單核支持多線程嗎?”,因?yàn)槎嗑€程就不是“核”這個(gè)硬件實(shí)現(xiàn)的,而是一種純軟件的實(shí)現(xiàn)。

































