進程、線程、協程對比
通俗描述
有一個老闆想要開個工廠進行生產某件商品(例如剪子)
他需要花一些財力物力製作一條生產線,這個生產線上有很多的器件以及材料這些所有的 為了能夠生產剪子而準備的資源稱之為:進程只有生產線是不能夠進行生產的,所以老闆的找個工人來進行生產,這個工人能夠利用這些材料最終一步步的將剪子做出來,這個來做事情的工人稱之為:
線程
這個老闆為了提高生產率,想到3種辦法:
方式 1
在這條生產線上多招些工人,一起來做剪子,這樣效率是成倍増長,即單進程 多線程方式 2
老闆發現這條生產線上的工人不是越多越好,因為一條生產線的資源以及材料畢竟有限,所以老闆又花了些財力物力購置了另外一條生產線,然後再招些工人這樣效率又再一步提高了,即多進程 多線程方式 3
老闆發現,現在已經有了很多條生產線,並且每條生產線上已經有很多工人了(即程序是多進程的,每個進程中又有多個線程),為了再次提高效率,老闆想了個損招,
規定:如果某個員工在上班時臨時沒事或者再等待某些條件(比如等待另一個工人生產完謀道工序 之後他才能再次工作) ,那麼這個員工就利用這個時間去做其它的事情, 那麼也就是説:如果一個線程等待某些條件,可以充分利用這個時間去做其它事情,其實這就是:協程
簡單總結
進程是資源分配的單位線程是操作系統調度的單位進程切換需要的資源很最大,效率很低線程切換需要的資源一般,效率一般協程切換任務資源很小,效率高多進程、多線程根據cpu核數不一樣可能是並行的,也可能是併發的。協程的本質就是使用當前進程在不同的函數代碼中切換執行,可以理解為並行。協程是一個用户層面的概念,不同協程的模型實現可能是單線程,也可能是多線程。進程擁有自己獨立的堆和棧,既不共享堆,亦不共享棧,進程由操作系統調度。(全局變量保存在堆中,局部變量及函數保存在棧中)線程擁有自己獨立的棧和共享的堆,共享堆,不共享棧,線程亦由操作系統調度。(標準線程是這樣的)協程和線程一樣共享堆,不共享棧,協程由程序員在協程的代碼裏顯示調度。- 一個應用程序一般對應一個
進程,一個進程一般有一個主線程,還有若干個輔助線程,線程之間是平行運行的,在線程裏面可以開啓協程,讓程序在特定的時間內運行。 線程和協程的區別是:協程避免了無意義的調度,由此可以提高性能,但也因此,程序員必須自己承擔調度的責任,同時,協程也失去了標準線程使用多CPU的能力。