golang分析--goroutine,進程,線程

概念總覽

概述

定義 通訊方式
進程 一個運行中的程序,資源分配的最小單位 管道、信號、共享內存/信號量/消息隊列
線程 輕量級進程,操作系統調度(cpu調度)執行的最小單位 互斥鎖、條件變量、posix匿名信號量
協程 輕量級的線程 全局變量和鎖同步,Channel管道進行數據同步

三者聯繫及區別

![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20200112104425395.png在這裏插入圖片描述
聯繫
一個程序至少要有一個進程,一個進程至少要有一個線程,進程本身不運行是線程的容器,多線程就像火車上的每節車廂,進程就是火車,協程則是一種輕量級的線程,協程調度完全由用戶控制,而進程線程都由cpu內核調度。
區別
1.切換開銷更小
這是goroutine於線程的主要區別,也是golang能夠實現高併發的主要原因。線程的調度方式是搶佔式的,如果一個線程的執行時間超過了分配給它的時間片,就會被其它可執行的線程搶佔。在線程切換的過程中需要保存/恢復所有的寄存器信息,比如16個通用寄存器,PC(Program Counter),SP(Stack Pointer),段寄存器等等。
而goroutine的調度是協同式的,它不會直接地與操作系統內核打交道。當goroutine進行切換的時候,之後很少量的寄存器需要保存和恢復(PC和SP)。因此gouroutine的切換效率更高。
2.每個goroutine默認內存比java,c少,goroutine2kb,線程8MB.
3.由於線程創建時需要向操作系統申請資源,並且在銷燬時將資源歸還,因此它的創建和銷燬的開銷比較大。相比之下,goroutine的創建和銷燬是由go語言在運行時自己管理的,因此開銷更低。

Goroutine的調度

協同式goroutine的切換點:
1.Channel接受或者發送會造成阻塞的消息
2.當一個新的goroutine被創建時
3.可以造成阻塞的系統調用,如文件和網絡操作
4.垃圾回收
調度器工作方式:
M指的是OSThread,一個M直接關聯了一個內核線程。由操作系統管理。
P指的是”processor”,代表了M所需的上下文環境,也是處理用戶級代碼邏輯的處理器。它負責銜接M和G的調度上下文,將等待執行的G與M對接。(上下文P(Processor)的數量在啓動時設置爲GOMAXPROCS環境變量的值或通過運行時函數GOMAXPROCS()。)
G指的是Goroutine,其實本質上也是一種輕量級的線程。包括了調用棧,重要的調度信息,例如channel等。

支撐整個調度器的主要有4個重要結構,分別是M、G、P、Sched:
M代表內核級線程,一個M就是一個線程,goroutine就是跑在M之上的;M是一個很大的結構,裏面維護小對象內存cache(mcache)、當前執行的goroutine、隨機數發生器等等非常多的信息。
P全稱是Processor,處理器,它的主要用途就是用來執行goroutine的,所以它也維護了一個goroutine隊列,裏面存儲了所有需要它來執行的goroutine,這個P的角色可能有一點讓人迷惑,一開始容易和M衝突,後面重點聊一下它們的關係。
G就是goroutine實現的核心結構了,G維護了goroutine需要的棧、程序計數器以及它所在的M等信息。
Sched結構就是調度器,它維護有存儲M和G的隊列以及調度器的一些狀態信息等。

參考文檔:
https://segmentfault.com/a/1190000019220859?utm_source=tag-newest
https://blog.csdn.net/daaikuaichuan/article/details/82951084
https://baijiahao.baidu.com/s?id=1620972759226100794&wfr=spider&for=pc

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