1.1 協(xié)程與進(jìn)程的區(qū)別
首先奕剃,我理解的操作系統(tǒng)調(diào)度等級為 進(jìn)程 —— 線程 —— 協(xié)程衷旅。其中進(jìn)程和線程的區(qū)別是本科學(xué)的知識,書上和網(wǎng)上都有纵朋。主要要說的就是協(xié)程和線程的區(qū)別柿顶。類比線程和進(jìn)程,一個(gè)進(jìn)程可以擁有多個(gè)線程操软,多個(gè)線程之間一起執(zhí)行來實(shí)現(xiàn)并發(fā)嘁锯,但是線程是操作系統(tǒng)級別提供的并發(fā)工具,線程太多會(huì)造成線程的切換聂薪,線程的切換需要系統(tǒng)調(diào)用家乘,就會(huì)耗時(shí)。
協(xié)程這個(gè)時(shí)候作為一種輕量級的線程胆建,那我們就可以理解成烤低,一個(gè)線程可以擁有多個(gè)協(xié)程。協(xié)程的切換笆载,只在用戶態(tài)切換扑馁,不需要操作系統(tǒng)的系統(tǒng)調(diào)用,就好像是多個(gè)協(xié)程共用一個(gè)線程來實(shí)現(xiàn)并發(fā)凉驻。線程的切換需要記錄上下文信息腻要,程序的執(zhí)行情況等,再進(jìn)行系統(tǒng)調(diào)用涝登,協(xié)程也需要記錄上下文信息雄家,程序的執(zhí)行情況,但是不需要系統(tǒng)調(diào)用胀滚。
1.2 Golang的GM模型
具體的分享推薦看最后的bilibili的視頻趟济,這個(gè)模型的優(yōu)缺點(diǎn),視頻中都有詳細(xì)的解釋咽笼。單純用它來理解一下協(xié)程顷编。
G 就是一個(gè)協(xié)程,M可以想成一個(gè)線程剑刑,一個(gè)M上可以運(yùn)行多個(gè)G媳纬。mcache是GO內(nèi)存模型中的概念双肤,不展開了。
1.3 GPM
這里的話钮惠,圓圈代表一個(gè)協(xié)程茅糜,一個(gè)G,M可以理解成一個(gè)線程素挽,P可以理解成一個(gè)CPU蔑赘,一個(gè)CPU上可以并發(fā)執(zhí)行多個(gè)線程,一個(gè)線程上也可以調(diào)度多個(gè)協(xié)程毁菱。和之前的思路差不多米死,只不過調(diào)度方式變了。大概意思是贮庞,在上一張圖,GM模型中究西,所有的協(xié)程會(huì)放到一個(gè)全局隊(duì)列窗慎,但是現(xiàn)在,對每個(gè)P來說卤材,都有本地的隊(duì)列來調(diào)度遮斥,根據(jù)調(diào)度算法來確定到底是哪個(gè)M來執(zhí)行G
=====================================
更新一波,根據(jù)這個(gè)理解的話扇丛,上面的說法其實(shí)有點(diǎn)錯(cuò)誤
都是個(gè)人的理解术吗,有不對的地方麻煩指出交流
參考文獻(xiàn)
一文摸清Go的并發(fā)調(diào)度
深入淺出 Golang Runtime 【 Go 夜讀 】
Golang深入理解GPM模型