來(lái)自:http://www.ehcoblog.ml/post/99/
進(jìn)程
進(jìn)程的出現(xiàn)是為了更好的利用CPU資源使得并發(fā)成為可能懊昨。 假設(shè)有兩個(gè)任務(wù)A和B窄潭,當(dāng)A遇到IO操作, CPU默默的等待任務(wù)A讀取完操作再去執(zhí)行任務(wù)B酵颁,這樣無(wú)疑是對(duì)CPU資源的極大的浪費(fèi)嫉你。
若在任務(wù)A讀取數(shù)據(jù)時(shí),讓任務(wù)B執(zhí)行躏惋,當(dāng)任務(wù)A讀取完數(shù)據(jù)后幽污,再切換到任務(wù)A執(zhí)行。
既然是切換簿姨,就會(huì)涉及到程序運(yùn)行的狀態(tài)
就需要有一個(gè)東西去記錄任務(wù)A和任務(wù)B分別需要什么資源距误,而進(jìn)程的作用就是這個(gè):記錄不同程序的運(yùn)行狀態(tài) 通過(guò)進(jìn)程來(lái)分配系統(tǒng)資源簸搞,標(biāo)識(shí)任務(wù)。如何分配CPU去執(zhí)行進(jìn)程稱之為調(diào)度准潭, 進(jìn)程狀態(tài)的記錄趁俊,恢復(fù),切換稱之為上下文切換刑然。
進(jìn)程是系統(tǒng)資源分配的最小單位寺擂,進(jìn)程占用的資源有:
地址空間
全局變量
文件描述符
各種硬件等等資源
線程
線程的出現(xiàn)是為了降低上下文切換的消耗, 提高系統(tǒng)的并發(fā)性泼掠,并突破一個(gè)進(jìn)程只能干一樣事的缺陷怔软,使到進(jìn)程內(nèi)并發(fā)成為可能。
但線程的缺陷是:若一個(gè)線程掛掉了择镇,整一個(gè)進(jìn)程也掛掉了挡逼,這意味著其它線程也掛掉了,
進(jìn)程卻沒(méi)有這個(gè)問(wèn)題腻豌,一個(gè)進(jìn)程掛掉家坎,另外的進(jìn)程還是活著。
協(xié)程
協(xié)程通過(guò)在線程中實(shí)現(xiàn)調(diào)度饲梭,避免了陷入內(nèi)核級(jí)別的上下文切換造成的性能損失乘盖,進(jìn)而突破了線程在IO上的性能瓶頸。 當(dāng)涉及到大規(guī)模的并發(fā)連接時(shí):例如10K連接
當(dāng)連接數(shù)很多 —> 需要大量的線程來(lái)干活 —> 可能大部分的線程處于ready狀態(tài) —> 系統(tǒng)會(huì)不斷地進(jìn)行上下文切換憔涉。
既然性能瓶頸在上下文切換,那解決思路也就有了析苫,在線程中自己實(shí)現(xiàn)調(diào)度兜叨,不陷入內(nèi)核級(jí)別的上下文切換。
小結(jié)
進(jìn)程衩侥,線程国旷,協(xié)程不斷突破,更高效的處理阻塞茫死,不斷地提高CPU的利用率跪但。
但是并不是說(shuō),線程就一定比進(jìn)程快峦萎,而協(xié)程就一定不線程要快屡久。
具體還是要看應(yīng)用場(chǎng)景。具體我們舉下面幾個(gè)例子
多核CPU爱榔,CPU密集型應(yīng)用 此時(shí)多線程的效率是最高的被环,多線程可以使到全部CPU核心滿載,又避免了協(xié)程間切換造成性能損失详幽。
當(dāng)CPU密集型任務(wù)時(shí)筛欢,CPU一直在利用著浸锨,切換反而會(huì)造成性能損失, 即便協(xié)程上下文切換消耗最小版姑,但也還是有消耗的柱搜。
多核CPU,IO密集型應(yīng)用 此時(shí)采用多線程多協(xié)程效率最高剥险,多線程可以使到全部CPU核心滿載聪蘸,而一個(gè)線程多協(xié)程,則更好的提高了CPU的利用率炒嘲。
單核CPU宇姚,CPU密集型應(yīng)用
單進(jìn)程效率是最高,此時(shí)單個(gè)進(jìn)程已經(jīng)使到CPU滿載了夫凸。
單核CPU浑劳,IO密集型應(yīng)用
多協(xié)程,效率最高夭拌。
并行
并行就是指同一時(shí)刻有兩個(gè)或兩個(gè)以上的“工作單位”在同時(shí)執(zhí)行魔熏,
從硬件的角度上來(lái)看就是同一時(shí)刻有兩條或兩條以上的指令處于執(zhí)行階段。
所以:多核是并行的前提鸽扁,單線程永遠(yuǎn)無(wú)法達(dá)到并行狀態(tài)蒜绽。可以利用多線程和度進(jìn)程到達(dá)并行狀態(tài)桶现。
Python的多線程由于GIL的存在躲雅,對(duì)于Python來(lái)說(shuō)無(wú)法通過(guò)多線程到達(dá)并行狀態(tài)。
并發(fā)
并發(fā)實(shí)際上是一種設(shè)計(jì)模式骡和,有了并發(fā)的設(shè)計(jì)相赁,并行才得以實(shí)現(xiàn)
可以簡(jiǎn)單粗暴的理解為:不管你有多少個(gè)線程,只要系統(tǒng)能在一段時(shí)間內(nèi)同時(shí)處理慰于,就是并發(fā)的
并行與并發(fā)的關(guān)系: 并發(fā)的設(shè)計(jì)使到并發(fā)執(zhí)行成為可能钮科,而并行是并發(fā)執(zhí)行的其中一種模式。