進程: 本質(zhì)上是一個獨立執(zhí)行的程序,進程是操作系統(tǒng)進行資源分配和調(diào)度的基本概念,操作系統(tǒng)進行資源分配和調(diào)度的一個獨立單位。
線程: 是操作系統(tǒng)能夠進行運算調(diào)度的最小單位。它被包含在進程之中,是進程中的實際運作單位。一個進程中可以并發(fā)多個線程,每條線程執(zhí)行不同的任務(wù),切換受系統(tǒng)控制。
協(xié)程: 又稱為微線程,是一種用戶態(tài)的輕量級線程,協(xié)程不像線程和進程需要進行系統(tǒng)內(nèi)核上的上下文切換,協(xié)程的上下文切換是由用戶自己決定的,有自己的上下文,所以說是輕量級的線程,也稱之為用戶級別的線程就叫協(xié)程,一個線程可以多個協(xié)程,線程進程都是同步機制,而協(xié)程則是異步Java的原生語法中并沒有實現(xiàn)協(xié)程,目前python、Lua和GO等語言支持。
關(guān)系:一個進程可以有多個線程,它允許計算機同時運行兩個或多個程序。線程是進程的最小執(zhí)行單位,CPU
的調(diào)度切換的是進程和線程,進程和線程多了之后調(diào)度會消耗大量的CPU,CPU上真正運行的是線程,線程可
以對應(yīng)多個協(xié)程。
協(xié)程對于多線程有什么優(yōu)缺點嗎?
優(yōu)點:
非常快速的上下文切換,不用系統(tǒng)內(nèi)核的上下文切換,減小開銷。
單線程即可實現(xiàn)高并發(fā),單核CPU可以支持上萬的協(xié)程。
由于只有一個線程,也不存在同時寫變量的沖突,在協(xié)程中控制共享資源不需要加鎖。
缺點:
協(xié)程無法利用多核資源,本質(zhì)也是個單線程。
協(xié)程需要和進程配合才能運行在多CPU上。
目前java沒成熟的第三方庫,存在風(fēng)險。
調(diào)試debug存在難度,不利于發(fā)現(xiàn)問題。