談談進程、線程、協程


進程

進程的出現是為了更好的利用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在運行。當一個程序被設計成完成一個任務再去完成下一個任務的時候,即便部署是多線程多協程的也是無法達到並發運行的。

並行與並發的關系: 並發的設計使到並發執行成為可能,而並行是並發執行的其中一種模式

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM