進程的出現是爲了更好的利用CPU資源使到併發成爲可能。 假設有兩個任務A和B,當A遇到IO操做,CPU默默的等待任務A讀取完操做再去執行任務B,這樣無疑是對CPU資源的極大的浪費。聰明的老大們就在想若在任務A讀取數據時,讓任務B執行,當任務A讀取完數據後,再切換到任務A執行。注意關鍵字切換,天然是切換,那麼這就涉及到了狀態的保存,狀態的恢復,加上任務A與任務B所須要的系統資源(內存,硬盤,鍵盤等等)是不同的。天然而然的就須要有一個東西去記錄任務A和任務B分別須要什麼資源,怎樣去識別任務A和任務B等等。登登登,進程就被髮明出來了。經過進程來分配系統資源,標識任務。如何分配CPU去執行進程稱之爲調度,進程狀態的記錄,恢復,切換稱之爲上下文切換。進程是系統資源分配的最小單位,進程佔用的資源有:地址空間,全局變量,文件描述符,各類硬件等等資源。多線程
線程的出現是爲了下降上下文切換的消耗,提升系統的併發性,並突破一個進程只能幹同樣事的缺陷,使到進程內併發成爲可能。假設,一個文本程序,須要接受鍵盤輸入,將內容顯示在屏幕上,還須要保存信息到硬盤中。若只有一個進程,勢必形成同一時間只能幹同樣事的尷尬(當保存時,就不能經過鍵盤輸入內容)。如有多個進程,每一個進程負責一個任務,進程A負責接收鍵盤輸入的任務,進程B負責將內容顯示在屏幕上的任務,進程C負責保存內容到硬盤中的任務。這裏進程A,B,C間的協做涉及到了進程通訊問題,並且有共同都須要擁有的東西-------文本內容,不停的切換形成性能上的損失。如有一種機制,可使任務A,B,C共享資源,這樣上下文切換所須要保存和恢復的內容就少了,同時又能夠減小通訊所帶來的性能損耗,那就行了。是的,這種機制就是線程。線程共享進程的大部分資源,並參與CPU的調度, 固然線程本身也是擁有本身的資源的,例如,棧,寄存器等等。 此時,進程同時也是線程的容器。線程也是有着本身的缺陷的,例如健壯性差,若一個線程掛掉了,整一個進程也掛掉了,這意味着其它線程也掛掉了,進程卻沒有這個問題,一個進程掛掉,另外的進程仍是活着。併發
協程經過在線程中實現調度,避免了陷入內核級別的上下文切換形成的性能損失,進而突破了線程在IO上的性能瓶頸。 當涉及到大規模的併發鏈接時,例如10K鏈接。以線程做爲處理單元,系統調度的開銷仍是過大。當鏈接數不少 —> 須要大量的線程來幹活 —> 可能大部分的線程處於ready狀態 —> 系統會不斷地進行上下文切換。既然性能瓶頸在上下文切換,那解決思路也就有了,在線程中本身實現調度,不陷入內核級別的上下文切換。說明一下,在歷史上協程比線程要出現得早,在1963年首次提出, 但沒有流行開來。爲何沒有流行,沒有找到信服的資料,先挖個坑,之後那天瞭解後,再補上。性能
進程,線程,協程不斷突破,更高效的處理阻塞,不斷地提升CPU的利用率。可是並非說,線程就必定比進程快,而協程就必定不線程要快。具體仍是要看應用場景。能夠簡單粗暴的把應用分爲IO密集型應用以及CPU密集型應用。線程
多核CPU,CPU密集型應用
此時多線程的效率是最高的,多線程可使到所有CPU核心滿載,又避免了協程間切換形成性能損失。當CPU密集型任務時,CPU一直在利用着,切換反而會形成性能損失,即使協程上下文切換消耗最小,但也仍是有消耗的。設計
多核CPU,IO密集型應用
此時採用多線程多協程效率最高,多線程可使到所有CPU核心滿載,而一個線程多協程,則更好的提升了CPU的利用率。協程
單核CPU,CPU密集型應用
單進程效率是最高,此時單個進程已經使到CPU滿載了。進程
單核CPU,IO密集型應用
多協程,效率最高。例如,看了上面應該也是知道的了內存
並行就是指同一時刻有兩個或兩個以上的「工做單位」在同時執行,從硬件的角度上來看就是同一時刻有兩條或兩條以上的指令處於執行階段。因此,多核是並行的前提,單線程永遠沒法達到並行狀態。能夠利用多線程和度進程到達並行狀態。另外的,Python的多線程因爲GIL的存在,對於Python來講沒法經過多線程到達並行狀態。資源
對於併發的理解,要從兩方面去理解,1.併發設計 2.併發執行。先說併發設計,當說一個程序是併發的,更多的是指這個程序採起了併發設計。部署
併發設計的標準:使多個操做能夠在重疊的時間段內進行 ,這裏的重點在於重疊的時間內, 重疊時間能夠理解爲一段時間內。例如:在時間1s秒內, 具備IO操做的task1和task2都完成,這就能夠說是併發執行。因此呢,單線程也是能夠作到併發運行的。固然啦,並行確定是併發的。一個程序可否併發執行,取決於設計,也取決於部署方式。例如, 當給程序開一個線程(協程是不開的),它不多是併發的,由於在重疊時間內根本就沒有兩個task在運行。當一個程序被設計成完成一個任務再去完成下一個任務的時候,即使部署是多線程多協程的也是沒法達到併發運行的。
並行與併發的關係: 併發的設計使到併發執行成爲可能,而並行是併發執行的其中一種模式。