大廠(chǎng)面試真題:并發(fā)和并行的區(qū)別(圖解)
不點(diǎn)藍(lán)字關(guān)注,我們哪來(lái)故事?
讀者應(yīng)該都知道,進(jìn)大廠(chǎng)的門(mén)檻還是比較高的,除了要有 985/211 學(xué)歷、具備應(yīng)用開(kāi)發(fā)能力以外,還得爆肝算法和操作系統(tǒng)。
如果說(shuō)應(yīng)用開(kāi)發(fā)是招式,那么算法和操作系統(tǒng)就是內(nèi)功。大廠(chǎng)的筆試重頭戲是算法,面試重頭戲是應(yīng)用開(kāi)發(fā)和操作系統(tǒng)。
前兩天有一個(gè)開(kāi)通了 VIP 會(huì)員的讀者,今年參加國(guó)內(nèi)某大廠(chǎng)的秋招,挺過(guò)了筆試階段,在面試階段被問(wèn)到了一個(gè)操作系統(tǒng)有關(guān)的問(wèn)題,他當(dāng)時(shí)沒(méi)有回答上來(lái),現(xiàn)在突然記起來(lái)了,就給我拋過(guò)來(lái)了:
操作系統(tǒng)有兩種多任務(wù)處理模式,分別是并發(fā)和并行,它們之間有什么區(qū)別呢?
握草,并發(fā)和并行難道不是一個(gè)意思嗎?面試官這么問(wèn),到底是幾個(gè)意思?

內(nèi)心慌亂的我,卻強(qiáng)裝淡定地給學(xué)員說(shuō):
稍等一下哈,我組織一下語(yǔ)言給你發(fā)過(guò)去哦。
好吧,其實(shí)我是在馬不停蹄地百度,趕緊惡補(bǔ)了一把。
在學(xué)習(xí)多線(xiàn)程/進(jìn)程編程時(shí),我們經(jīng)常會(huì)遇到并發(fā)和并行這兩個(gè)名詞,它們看起來(lái)是一個(gè)概念,都是“多個(gè)線(xiàn)程/進(jìn)程同時(shí)執(zhí)行”的意思,但實(shí)際上它們是有區(qū)別的,甚至說(shuō)不是一碼事。
很多教材也都解釋了并發(fā)和并行的區(qū)別,例如:
并行是指兩個(gè)或者多個(gè)事件在同一時(shí)刻發(fā)生,而并發(fā)是指兩個(gè)或多個(gè)事件在同一時(shí)間間隔發(fā)生。
并行是在不同實(shí)體上的多個(gè)事件,并發(fā)是在同一實(shí)體上的多個(gè)事件。
不過(guò)這種解釋非常晦澀難懂,估計(jì)只有作者自己才能搞明白。這篇文章,我將站在一個(gè)大叔程序員的視角,使用通俗易懂的語(yǔ)言來(lái)重新剖析并發(fā)和并行的區(qū)別,并配上優(yōu)雅的圖片,以加深讀者的理解。
01 并發(fā)(Concurrency)
早期計(jì)算機(jī)的 CPU 都是單核的,一個(gè) CPU 在同一時(shí)間只能執(zhí)行一個(gè)進(jìn)程/線(xiàn)程,當(dāng)系統(tǒng)中有多個(gè)進(jìn)程/線(xiàn)程等待執(zhí)行時(shí),CPU 只能執(zhí)行完一個(gè)再執(zhí)行下一個(gè)。
為了表述簡(jiǎn)單,下文我們將不再區(qū)分進(jìn)程和線(xiàn)程,而將它們統(tǒng)一稱(chēng)為“任務(wù)”。在不同的場(chǎng)景下,一個(gè)任務(wù)可能是進(jìn)程,也可能是線(xiàn)程。
計(jì)算機(jī)在運(yùn)行過(guò)程中,有很多指令會(huì)涉及 I/O 操作,而 I/O 操作又是相當(dāng)耗時(shí)的,速度遠(yuǎn)遠(yuǎn)低于 CPU,這導(dǎo)致 CPU 經(jīng)常處于空閑狀態(tài),只能等待 I/O 操作完成后才能繼續(xù)執(zhí)行后面的指令。
為了提高 CPU 利用率,減少等待時(shí)間,人們提出了一種 CPU 并發(fā)工作的理論。
所謂并發(fā),就是通過(guò)一種算法將 CPU 資源合理地分配給多個(gè)任務(wù),當(dāng)一個(gè)任務(wù)執(zhí)行 I/O 操作時(shí),CPU 可以轉(zhuǎn)而執(zhí)行其它的任務(wù),等到 I/O 操作完成以后,或者新的任務(wù)遇到 I/O 操作時(shí),CPU 再回到原來(lái)的任務(wù)繼續(xù)執(zhí)行。
下圖展示了兩個(gè)任務(wù)并發(fā)執(zhí)行的過(guò)程:
圖1:?jiǎn)魏?CPU 執(zhí)行兩個(gè)任務(wù)
雖然 CPU 在同一時(shí)刻只能執(zhí)行一個(gè)任務(wù),但是通過(guò)將 CPU 的使用權(quán)在恰當(dāng)?shù)臅r(shí)機(jī)分配給不同的任務(wù),使得多個(gè)任務(wù)在視覺(jué)上看起來(lái)是一起執(zhí)行的。CPU 的執(zhí)行速度極快,多任務(wù)切換的時(shí)間也極短,用戶(hù)根本感受不到,所以并發(fā)執(zhí)行看起來(lái)才跟真的一樣。
操作系統(tǒng)負(fù)責(zé)將有限的 CPU 資源分配給不同的任務(wù),但是不同操作系統(tǒng)的分配方式不太一樣,常見(jiàn)的有:
當(dāng)檢測(cè)到正在執(zhí)行的任務(wù)進(jìn)行 I/O 操作時(shí),就將 CPU 資源分配給其它任務(wù)。
將 CPU 時(shí)間平均分配給各個(gè)任務(wù),每個(gè)任務(wù)都可以獲得 CPU 的使用權(quán)。在給定的時(shí)間內(nèi),即使任務(wù)沒(méi)有執(zhí)行完成,也要將 CPU 資源分配給其它任務(wù),該任務(wù)需要等待下次分配 CPU 使用權(quán)后再繼續(xù)執(zhí)行。
將 CPU 資源合理地分配給多個(gè)任務(wù)共同使用,有效避免了 CPU 被某個(gè)任務(wù)長(zhǎng)期霸占的問(wèn)題,極大地提升了 CPU 資源利用率。
02 并行(Parallelism)
并發(fā)是針對(duì)單核 CPU 提出的,而并行則是針對(duì)多核 CPU 提出的。和單核 CPU 不同,多核 CPU 真正實(shí)現(xiàn)了“同時(shí)執(zhí)行多個(gè)任務(wù)”。
多核 CPU 內(nèi)部集成了多個(gè)計(jì)算核心(Core),每個(gè)核心相當(dāng)于一個(gè)簡(jiǎn)單的 CPU,如果不計(jì)較細(xì)節(jié),你可以認(rèn)為給計(jì)算機(jī)安裝了多個(gè)獨(dú)立的 CPU。
多核 CPU 的每個(gè)核心都可以獨(dú)立地執(zhí)行一個(gè)任務(wù),而且多個(gè)核心之間不會(huì)相互干擾。在不同核心上執(zhí)行的多個(gè)任務(wù),是真正地同時(shí)運(yùn)行,這種狀態(tài)就叫做并行。
例如,同樣是執(zhí)行兩個(gè)任務(wù),雙核 CPU 的工作狀態(tài)如下圖所示:

圖2:雙核 CPU 執(zhí)行兩個(gè)任務(wù)
雙核 CPU 執(zhí)行兩個(gè)任務(wù)時(shí),每個(gè)核心各自執(zhí)行一個(gè)任務(wù),和單核 CPU 在兩個(gè)任務(wù)之間不斷切換相比,它的執(zhí)行效率更高。
03 并發(fā)+并行
在圖2中,執(zhí)行任務(wù)的數(shù)量恰好等于 CPU 核心的數(shù)量,是一種理想狀態(tài)。但是在實(shí)際場(chǎng)景中,處于運(yùn)行狀態(tài)的任務(wù)是非常多的,尤其是電腦和手機(jī),開(kāi)機(jī)就幾十個(gè)任務(wù),而 CPU 往往只有 4 核、8 核或者 16 核,遠(yuǎn)低于任務(wù)的數(shù)量,這個(gè)時(shí)候就會(huì)同時(shí)存在并發(fā)和并行兩種情況:所有核心都要并行工作,并且每個(gè)核心還要并發(fā)工作。
例如一個(gè)雙核 CPU 要執(zhí)行四個(gè)任務(wù),它的工作狀態(tài)如下圖所示:

每個(gè)核心并發(fā)執(zhí)行兩個(gè)任務(wù),兩個(gè)核心并行的話(huà)就能執(zhí)行四個(gè)任務(wù)。當(dāng)然也可以一個(gè)核心執(zhí)行一個(gè)任務(wù),另一個(gè)核心并發(fā)執(zhí)行三個(gè)任務(wù),這跟操作系統(tǒng)的分配方式,以及每個(gè)任務(wù)的工作狀態(tài)有關(guān)系。
04 總結(jié)
并發(fā)針對(duì)單核 CPU 而言,它指的是 CPU 交替執(zhí)行不同任務(wù)的能力;并行針對(duì)多核 CPU 而言,它指的是多個(gè)核心同時(shí)執(zhí)行多個(gè)任務(wù)的能力。
單核 CPU 只能并發(fā),無(wú)法并行;換句話(huà)說(shuō),并行只可能發(fā)生在多核 CPU 中。
在多核 CPU 中,并發(fā)和并行一般都會(huì)同時(shí)存在,它們都是提高 CPU 處理任務(wù)能力的重要手段。
END
若覺(jué)得文章對(duì)你有幫助,隨手轉(zhuǎn)發(fā)分享,也是我們繼續(xù)更新的動(dòng)力。
長(zhǎng)按二維碼,掃掃關(guān)注哦
?「C語(yǔ)言中文網(wǎng)」官方公眾號(hào),關(guān)注手機(jī)閱讀教程??

