概覽
這些內(nèi)容本身是昨天看的,但是沒有做記錄,今日來划纽,也忘了些許;在golang中GMP這部分知識感覺還是比較難懂锌畸,但是還是要寫下自己的一些只言片語理解勇劣。
1. 什么事GMP
- G 指的goroutine
- M 指的是系統(tǒng)級線程
- P 指的是使用核心數(shù),可以通過
runtime.GOMAXPROCS()
中的數(shù),默認(rèn)情況下它的數(shù)是機(jī)器的核心數(shù),我們可以通過上面的指令手動設(shè)置比默。
2. 什么是goroutine幻捏?
首先,我要知道協(xié)程-corountine;它是用戶級線程命咐;由應(yīng)用創(chuàng)建管理篡九;它是在用戶態(tài)下;因此不是普通的線程受操作系統(tǒng)直接管理醋奠;
在linux中叫做纖程;在go中實現(xiàn)的我們稱之為gorountine,也就是 go + corountine
;
3. gorountine有什么特點
- 它很輕量榛臼,初始大小只有2kb左右;而線程在2M;
- 雖然它初始很小窜司,但是它的容量是可以擴(kuò)展的沛善,最大可以大GB;所以還是要注意gorountine的數(shù)量
- 它在用戶態(tài)下創(chuàng)建塞祈,因此它的創(chuàng)建銷毀由go調(diào)度器直接控制路呜,不經(jīng)過操作系統(tǒng)控制
4. GMP之間的關(guān)系
P的個數(shù)我們非常容易理解,一個臺機(jī)器就那么幾個核心织咧;
這里主要說明的是G和M的關(guān)系胀葱;
他們是一種m:n的關(guān)系,啥意思笙蒙?m個gorountine映射到n個線程上抵屿;為啥要這樣設(shè)計;最大的壓榨機(jī)器性能捅位;提高并發(fā)能力轧葛;1:1 / n : 1 都有很大的缺點;這種涉及結(jié)合了兩種的優(yōu)點艇搀,但也最為復(fù)雜尿扯;
下面嘗試闡述下運行流程:
- 一個gorountine創(chuàng)建后,先看P的本地隊列是否能存放焰雕,如果能則存入衷笋,如果不能則放入全局P隊列
- M要執(zhí)行需要先獲取到P,獲取到P后矩屁,從P的本地隊列中領(lǐng)取goroutine來執(zhí)行辟宗;如果本地沒有則全局,如果還沒有則偷吝秕;本地>全局>偷
- 如果M執(zhí)行g(shù)orountine隊列過程中遇到阻塞,則直接換下一個gorountine泊脐;將阻塞的放回本地隊列等待下次執(zhí)行;因此gorountine阻塞不會阻塞M