1.三種概念——內核線程、輕量級進程、用戶線程:
https://blog.csdn.net/qq_32252957/article/details/82983969
內核線程:
使用內核棧和和寄存器空間,但是調度成本高,等價於進程
內核線程就是內核的分身,一個分身可以處理一件特定事情。這在處理異步事件如異步IO時特別有用。內核線程的使用是廉價的,唯一使用的資源就是內核棧和上下文切換時保存寄存器的空間。支持多線程的內核叫做多線程內核。
輕量級進程(LWP):
共用父進程的資源,調度同普通進程
輕量級進程(LWP)是建立在內核之上並由內核支持的用戶線程,它是內核線程的高度抽象,每一個輕量級進程都與一個特定的內核線程關聯。內核線程只能由內核管理並像普通進程一樣被調度。
用戶線程:
與所屬進程共享進程地址空間和系統資源,調度:由在用戶空間實現的線程庫,在所屬進程內進行調度
用戶線程是完全建立在用戶空間的線程庫,用戶線程的創建、調度、同步和銷燬全又庫函數在用戶空間完成,不需要內核的幫助。因此這種線程是極其低消耗和高效的。
2.用戶多線程的實現方式:
https://blog.csdn.net/qq_32252957/article/details/82983969
a.LWP作爲多線程方案
缺點:LWP數量存在限制,LWP利用率較低
b.純用戶空間多線程方案
缺點:如果某個用戶線被阻塞,導致進程同樣被阻塞
c.混合版多線程方案
用戶線程底層對應多LWP,減少線程切換代價的同時,提升並行能力
3.linux的線程實現:
https://blog.csdn.net/tianyue168/article/details/7403693
Linux 線程採用LWP實現,一個線程對應一個LWP,一對一關係
4.核心線程和用戶線程的區別:
https://blog.csdn.net/gatieme/article/details/51892437
5.協程:
a.協程相比於線程的優勢
資源佔用小,堆棧大小隻有若干 kb,可以進行增減,並將數據存儲於堆空間中
OS內核線程複用程度更高,1個線程可以對應N個goroutine
協程使用信道(Channel)來進行通信。
簡單來說:調度(M:N)、單個協程資源佔用
b.Go的協程執行原理
白話文講解:https://blog.51cto.com/1427133/2160211
底層:http://www.sizeofvoid.net/goroutine-under-the-hood/
c.Go 調度器
調度原理圖:
M:核心線程
P:執行器
G:goroutine任務
goroutine任務會首先放到global queue中,然後再下放到具體的goroutine執行器隊列中