進程
-
不共享任何狀態
-
調度由操作系統完成
-
有獨立的內存空間(上下文切換的時候需要保存棧、cpu寄存器、虛擬內存、以及打開的相關句柄等信息,開銷大)
-
通訊主要通過信號傳遞的方式來實現(實現方式有多種,信號量、管道、事件等,通訊都需要過內核,效率低)
線程
-
共享變量(解決了通訊麻煩的問題,但是對於變量的訪問需要加鎖)
-
調度由操作系統完成
-
一個進程可以有多個線程,每個線程會共享父進程的資源(創建線程開銷占用比進程小很多,可創建的數量也會很多)
-
通訊除了可使用進程間通訊的方式,還可以通過共享內存的方式進行通信(通過共享內存通信比通過內核要快很多)
-
線程的使用會給系統帶來上下文切換的額外負擔。
協程
-
調度完全由用戶控制
-
一個線程(進程)可以有多個協程
-
每個線程(進程)循環按照指定的任務清單順序完成不同的任務(當任務被堵塞時,執行下一個任務;當恢復時,再回來執行這個任務;任務間切換只需要保存任務的上下文,沒有內核的開銷,可以不加鎖的訪問全局變量)
-
協程需要保證是非堵塞的且沒有相互依賴
-
協程基本上不能同步通訊,多采用異步的消息通訊,效率比較高
作者:倚天杖
鏈接:https://www.imooc.com/article/40799
來源:慕課網