一菜循、線程模型
1.1? 內(nèi)核級(jí)線程模型
每個(gè)線程由內(nèi)核調(diào)度器獨(dú)立的調(diào)度,所以如果一個(gè)線程阻塞則不影響其他的線程。
優(yōu)點(diǎn):在多核處理器的硬件的支持下涮母,內(nèi)核空間線程模型支持了真正的并行配深,當(dāng)一個(gè)線程被阻塞后携添,允許另一個(gè)線程繼續(xù)執(zhí)行,所以并發(fā)能力較強(qiáng)篓叶。
缺點(diǎn):每創(chuàng)建一個(gè)用戶級(jí)線程都需要?jiǎng)?chuàng)建一個(gè)內(nèi)核級(jí)線程與其對應(yīng)烈掠,這樣創(chuàng)建線程的開銷比較大,會(huì)影響到應(yīng)用程序的性能澜共。
1.2 用戶級(jí)線程模型
優(yōu)點(diǎn): 這種模型的好處是線程上下文切換都發(fā)生在用戶空間向叉,避免的模態(tài)切換(mode switch),從而對于性能有積極的影響嗦董。
缺點(diǎn):所有的線程基于一個(gè)內(nèi)核調(diào)度實(shí)體即內(nèi)核線程母谎,這意味著只有一個(gè)處理器可以被利用,在多處理器環(huán)境下這是不能夠被接受的京革,本質(zhì)上奇唤,用戶線程只解決了并發(fā)問題幸斥,但是沒有解決并行問題。如果線程因?yàn)?I/O 操作陷入了內(nèi)核態(tài)咬扇,內(nèi)核態(tài)線程阻塞等待 I/O 數(shù)據(jù)甲葬,則所有的線程都將會(huì)被阻塞,用戶空間也可以使用非阻塞而 I/O懈贺,但是不能避免性能及復(fù)雜度問題经窖。
1.3 兩級(jí)線程模型
>
二、Go并發(fā)調(diào)度: G-P-M模型
在操作系統(tǒng)提供的內(nèi)核線程之上梭灿,Go搭建了一個(gè)特有的兩級(jí)線程模型画侣。goroutine機(jī)制實(shí)現(xiàn)了M : N的線程模型,goroutine機(jī)制是協(xié)程(coroutine)的一種實(shí)現(xiàn)堡妒,golang內(nèi)置的調(diào)度器配乱,可以讓多核CPU中每個(gè)CPU執(zhí)行一個(gè)協(xié)程。
Go語言中支撐整個(gè)scheduler實(shí)現(xiàn)的主要有4個(gè)重要結(jié)構(gòu)皮迟,分別是M搬泥、G、P伏尼、Sched忿檩, 前三個(gè)定義在runtime.h中,Sched定義在proc.c中烦粒。
? Sched結(jié)構(gòu)就是調(diào)度器休溶,它維護(hù)有存儲(chǔ)M和G的隊(duì)列以及調(diào)度器的一些狀態(tài)信息等。
? M結(jié)構(gòu)是Machine扰她,系統(tǒng)線程兽掰,它由操作系統(tǒng)管理的,goroutine就是跑在M之上的徒役;M是一個(gè)很大的結(jié)構(gòu)孽尽,里面維護(hù)小對象內(nèi)存cache(mcache)、當(dāng)前執(zhí)行的goroutine忧勿、隨機(jī)數(shù)發(fā)生器等等非常多的信息杉女。
? P結(jié)構(gòu)是Processor,處理器鸳吸,它的主要用途就是用來執(zhí)行g(shù)oroutine的熏挎,它維護(hù)了一個(gè)goroutine隊(duì)列,即runqueue晌砾。Processor是讓我們從N:1調(diào)度到M:N調(diào)度的重要部分坎拐。
? G是goroutine實(shí)現(xiàn)的核心結(jié)構(gòu),它包含了棧,指令指針哼勇,以及其他對調(diào)度goroutine很重要的信息都伪,例如其阻塞的channel。