一文理解Goland協(xié)程調(diào)度器scheduler的實現(xiàn)_第1頁
一文理解Goland協(xié)程調(diào)度器scheduler的實現(xiàn)_第2頁
一文理解Goland協(xié)程調(diào)度器scheduler的實現(xiàn)_第3頁
一文理解Goland協(xié)程調(diào)度器scheduler的實現(xiàn)_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第一文理解Goland協(xié)程調(diào)度器scheduler的實現(xiàn)目錄1.調(diào)度器scheduler的作用2.GMP模型3.調(diào)度機制

1.調(diào)度器scheduler的作用

我們都知道,在Go語言中,程序運行的最小單元是gorouines。

然而程序的運行最終都是要交給操作系統(tǒng)來執(zhí)行的,以Java為例,Java中的一個線程對應(yīng)的就是操作系統(tǒng)中的線程,以此來實現(xiàn)在操作系統(tǒng)中的運行。在Go中,gorouines比線程更輕量級,其與操作系統(tǒng)的線程也不是一一對應(yīng)的關(guān)系,然而,最終我們想要執(zhí)行程序,還是要借助操作系統(tǒng)的線程來完成,調(diào)度器scheduler的工作就是完成gorouines到操作系統(tǒng)線程的調(diào)度。

2.GMP模型

當我們運行g(shù)ofun(){}時,會生成一個g,優(yōu)先放置在創(chuàng)建他的p的本地隊列中,如果本地隊列已滿,那么會放置在全局隊列中。

g的運行需要借助p與m,p是執(zhí)行器,只有獲得p的g才能執(zhí)行,p的執(zhí)行需要掛在m上,m對應(yīng)的是操作系統(tǒng)中的線程,p的數(shù)量與CPU的核數(shù)相同。

goroutine運行所需要的上下文信息都是存放在g的數(shù)據(jù)結(jié)構(gòu)當中的,所以g可以依靠任意的p或者m執(zhí)行,而對于操作系統(tǒng)而言,其并不能看到p與g的調(diào)度過程,這些過程對于操作系統(tǒng)線程來說都是連續(xù)的,所以省去了線程上下文切換的開銷。

g的數(shù)據(jù)結(jié)構(gòu)如下所示:

typegstruct{

stackstack//g自己的棧

m*m//執(zhí)行當前g的m

schedgobuf//保存了g的現(xiàn)場,goroutine切換時通過它來恢復(fù)

atomicstatusuint32//g的狀態(tài)Gidle,Grunnable,Grunning,Gsyscall,Gwaiting,Gdead

goidint64

schedlinkguintptr//下一個g,g鏈表

preemptbool//搶占標記

lockedmmuintptr//鎖定的M,g中斷恢復(fù)指定M執(zhí)行

gopcuintptr//創(chuàng)建該goroutine的指令地址

startpcuintptr//goroutine函數(shù)的指令地址

}

p的數(shù)據(jù)結(jié)構(gòu)如下所示:

typepstruct{

idint32

statusuint32//狀態(tài)

linkpuintptr//下一個P,P鏈表

mmuintptr//擁有這個P的M

mcache*mcache

//P本地runnable狀態(tài)的G隊列

runqheaduint32

runqtailuint32

runq[256]guintptr

runnextguintptr//一個比runq優(yōu)先級更高的runnableG

//狀態(tài)為dead的G鏈表,在獲取G時會從這里面獲取

gFreestruct{

gList

nint32

gcBgMarkWorkerguintptr//(atomic)

gcwgcWork

}

m的數(shù)據(jù)結(jié)構(gòu)如下所示:

typemstruct{

g0*g//g0,每個M都有自己獨有的g0

curg*g//當前正在運行的g

ppuintptr//當前用于的p

nextppuintptr//當m被喚醒時,首先擁有這個p

idint64

spinningbool//是否處于自旋

parknote

alllink*m//onallm

schedlinkmuintptr//下一個m,m鏈表

mcache*mcache//內(nèi)存分配

lockedgguintptr//和G的lockedm對應(yīng)

freelink*m//onsched.freem

}

通過gmp模型,我們能解決gorouines到操作系統(tǒng)線程的映射問題,gorouines之間的切換是在用戶態(tài)完成的,在操作系統(tǒng)的視角來看,線程的上下文切換并不頻繁,因此就少了很多陷入內(nèi)核的過程,所以有更好的并發(fā)效果。

3.調(diào)度機制

1)workstealing機制

當一個p上的g執(zhí)行完之后,他會嘗試從其他的p隊列中竊取g來執(zhí)行,以減少操作系統(tǒng)線程的切換動作。

2)hand

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論