多線程的執(zhí)行效率一定高于單線程嗎?
一、什么是串行?什么是并行?
串行:任務(wù)進(jìn)行排隊(duì),一個(gè)一個(gè)執(zhí)行;
并行:多個(gè)任務(wù)齊頭并進(jìn)。
二、單核、多核這兩種情況下的并行。
單核情況下的并行:并非真的是多個(gè)任務(wù)同時(shí)進(jìn)行的,是需要在這任務(wù)之間來(lái)回切換(即上下文切換)的。
多核情況下的并行:是幾核,就能真正做到幾核同時(shí)執(zhí)行各自的任務(wù)。
三、任務(wù)的兩大類型。
“計(jì)算密集型”任務(wù):
特點(diǎn)是要進(jìn)行大量的計(jì)算,消耗CPU資源,比如計(jì)算圓周率、對(duì)視頻進(jìn)行高清解碼等等,全靠CPU的運(yùn)算能力。
這種計(jì)算密集型任務(wù)雖然也可以用多任務(wù)完成,但是任務(wù)越多,花在任務(wù)切換的時(shí)間就越多,CPU執(zhí)行任務(wù)的效率就越低,所以,要高效地利用CPU,計(jì)算密集型任務(wù)同時(shí)進(jìn)行的數(shù)量應(yīng)當(dāng)?shù)扔贑PU的核心數(shù)。
“IO密集型”任務(wù):
涉及到網(wǎng)絡(luò)、磁盤IO的任務(wù)都是IO密集型任務(wù),這類任務(wù)的特點(diǎn)是CPU消耗很少,任務(wù)的大部分時(shí)間都在等待IO操作完成(因?yàn)镮O(指把內(nèi)容從硬盤上讀到內(nèi)存的過(guò)程,或者是從網(wǎng)絡(luò)上接收信息到本機(jī)內(nèi)存的過(guò)程)的速度遠(yuǎn)遠(yuǎn)低于CPU和內(nèi)存的速度)。
對(duì)于IO密集型任務(wù),任務(wù)越多,CPU效率越高,但也有一個(gè)限度。常見(jiàn)的大部分任務(wù)都是IO密集型任務(wù),比如Web應(yīng)用。
四、看完了上面幾點(diǎn),我們就可以對(duì)“并行的執(zhí)行效率一定會(huì)高于串行嗎”這個(gè)問(wèn)題作出解答了。
答:并不一定,取決于機(jī)器的核數(shù)和任務(wù)類型。
1.如果是執(zhí)行多個(gè)計(jì)算密集型任務(wù):
①單核:串行 > 并行。
②多核:并行 > 串行。
2.如果是執(zhí)行多個(gè)IO密集型任務(wù):
①單核:并行 > 串行。
②多核:并行 > 串行。
在多核或多CPU,或支持Hyper-threading的CPU上使用多線程程序設(shè)計(jì)的好處是顯而易見(jiàn),即提高了程序的執(zhí)行吞吐率。
在單CPU或單核的計(jì)算機(jī)上,使用多線程技術(shù),也可以把進(jìn)程中負(fù)責(zé)I/O處理、人機(jī)交互而常被阻塞的部分與密集計(jì)算的部分分開(kāi)來(lái)執(zhí)行,編寫專門的workhorse線程執(zhí)行密集計(jì)算,從而提高了程序的執(zhí)行效率。