



下載本文檔
版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 買賣車位合同范例
- 儲備人才崗位合同范例
- 個人減肥簽約合同范例
- 公司貸款服務(wù)合同范例
- 倉庫租賃合同范例-乳粉
- 醫(yī)療空間升級改造標準化施工流程與質(zhì)量控制
- 小兒高熱驚厥的護理
- 區(qū)塊鏈在商業(yè)合同執(zhí)行中的風(fēng)險控制與保險設(shè)計
- 企業(yè)投資股權(quán)合同范例
- 供早餐合同范例
- 貴州干部履歷表(2023版)
- 消火栓月檢查表
- 高血壓腦病-PPT課件
- 滿堂支架現(xiàn)澆砼連續(xù)箱梁的監(jiān)理實施細則
- 人防工程竣工資料(全套)
- 《電子病歷模板》word版參考模板
- 30萬噸年煤制甲醇變換工段初步設(shè)計
- (高清版)JGJ123-2012既有建筑地基基礎(chǔ)加固技術(shù)規(guī)范
- 蒸汽管道試運行方案2015.9.18
- 老年人助行器調(diào)研
- BrownBear自制可打印可涂色
評論
0/150
提交評論