一些關于進程、線程、并發(fā)和并行的知識

來自:http://www.ehcoblog.ml/post/99/
進程
進程的出現(xiàn)是為了更好的利用CPU資源使得并發(fā)成為可能。 假設有兩個任務A和B,當A遇到IO操作, CPU默默的等待任務A讀取完操作再去執(zhí)行任務B,這樣無疑是對CPU資源的極大的浪費。
若在任務A讀取數(shù)據(jù)時,讓任務B執(zhí)行,當任務A讀取完數(shù)據(jù)后,再切換到任務A執(zhí)行。
既然是切換,就會涉及到程序運行的狀態(tài)
就需要有一個東西去記錄任務A和任務B分別需要什么資源,而進程的作用就是這個:記錄不同程序的運行狀態(tài) 通過進程來分配系統(tǒng)資源,標識任務。如何分配CPU去執(zhí)行進程稱之為調(diào)度, 進程狀態(tài)的記錄,恢復,切換稱之為上下文切換。

進程是系統(tǒng)資源分配的最小單位,進程占用的資源有:

地址空間
全局變量
文件描述符
各種硬件等等資源
線程
線程的出現(xiàn)是為了降低上下文切換的消耗, 提高系統(tǒng)的并發(fā)性,并突破一個進程只能干一樣事的缺陷,使到進程內(nèi)并發(fā)成為可能。
但線程的缺陷是:若一個線程掛掉了,整一個進程也掛掉了,這意味著其它線程也掛掉了,
進程卻沒有這個問題,一個進程掛掉,另外的進程還是活著。

協(xié)程
協(xié)程通過在線程中實現(xiàn)調(diào)度,避免了陷入內(nèi)核級別的上下文切換造成的性能損失,進而突破了線程在IO上的性能瓶頸。 當涉及到大規(guī)模的并發(fā)連接時:例如10K連接
當連接數(shù)很多 —> 需要大量的線程來干活 —> 可能大部分的線程處于ready狀態(tài) —> 系統(tǒng)會不斷地進行上下文切換。
既然性能瓶頸在上下文切換,那解決思路也就有了,在線程中自己實現(xiàn)調(diào)度,不陷入內(nèi)核級別的上下文切換。

小結
進程,線程,協(xié)程不斷突破,更高效的處理阻塞,不斷地提高CPU的利用率。
但是并不是說,線程就一定比進程快,而協(xié)程就一定不線程要快。
具體還是要看應用場景。具體我們舉下面幾個例子

多核CPU,CPU密集型應用 此時多線程的效率是最高的,多線程可以使到全部CPU核心滿載,又避免了協(xié)程間切換造成性能損失。
當CPU密集型任務時,CPU一直在利用著,切換反而會造成性能損失, 即便協(xié)程上下文切換消耗最小,但也還是有消耗的。

多核CPU,IO密集型應用 此時采用多線程多協(xié)程效率最高,多線程可以使到全部CPU核心滿載,而一個線程多協(xié)程,則更好的提高了CPU的利用率。

單核CPU,CPU密集型應用
單進程效率是最高,此時單個進程已經(jīng)使到CPU滿載了。

單核CPU,IO密集型應用
多協(xié)程,效率最高。

并行
并行就是指同一時刻有兩個或兩個以上的“工作單位”在同時執(zhí)行,
從硬件的角度上來看就是同一時刻有兩條或兩條以上的指令處于執(zhí)行階段。
所以:多核是并行的前提,單線程永遠無法達到并行狀態(tài)。可以利用多線程和度進程到達并行狀態(tài)。
Python的多線程由于GIL的存在,對于Python來說無法通過多線程到達并行狀態(tài)。

并發(fā)
并發(fā)實際上是一種設計模式,有了并發(fā)的設計,并行才得以實現(xiàn)
可以簡單粗暴的理解為:不管你有多少個線程,只要系統(tǒng)能在一段時間內(nèi)同時處理,就是并發(fā)的
并行與并發(fā)的關系: 并發(fā)的設計使到并發(fā)執(zhí)行成為可能,而并行是并發(fā)執(zhí)行的其中一種模式。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容