Go:內核線程、LWP、用戶線程? 還是協程?

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 調度器

http://skoo.me/go/2013/11/29/golang-schedule?utm_campaign=studygolang.com&utm_medium=studygolang.com&utm_source=studygolang.com

調度原理圖:

M:核心線程

P:執行器

G:goroutine任務

goroutine任務會首先放到global queue中,然後再下放到具體的goroutine執行器隊列中

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章