亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > Go routine調(diào)度詳解

Go routine調(diào)度詳解

熱門標(biāo)簽:西部云谷一期地圖標(biāo)注 江西轉(zhuǎn)化率高的羿智云外呼系統(tǒng) 高德地圖標(biāo)注口訣 南通如皋申請開通400電話 學(xué)海導(dǎo)航地圖標(biāo)注 廣州呼叫中心外呼系統(tǒng) 地圖標(biāo)注的汽車標(biāo) 中國地圖標(biāo)注省會高清 浙江高速公路地圖標(biāo)注

goroutine簡介

goroutine是go語言中最為NB的設(shè)計,也是其魅力所在,goroutine的本質(zhì)是協(xié)程,是實(shí)現(xiàn)并行計算的核心。goroutine使用方式非常的簡單,只需使用go關(guān)鍵字即可啟動一個協(xié)程,并且它是處于異步方式運(yùn)行,你不需要等它運(yùn)行完成以后在執(zhí)行以后的代碼。

go func()//通過go關(guān)鍵字啟動一個協(xié)程來運(yùn)行函數(shù)

go routine的調(diào)度原理和操作系統(tǒng)的線層調(diào)度是比較相似的。這里我們將介紹go routine的相關(guān)知識。

goroutine(有人也稱之為協(xié)程)本質(zhì)上go的用戶級線程的實(shí)現(xiàn),這種用戶級線程是運(yùn)行在內(nèi)核級線程之上。當(dāng)我們在go程序中創(chuàng)建goroutine的時候,我們的這些routine將會被分配到不同的內(nèi)核級線程中運(yùn)行。一個內(nèi)核級線程可能會負(fù)責(zé)多個routine的運(yùn)行。而保證這些routine在內(nèi)內(nèi)核級線程安全、公平、高效運(yùn)行的工作,就由調(diào)度器來實(shí)現(xiàn)。

goroutine內(nèi)部原理

概念介紹

在進(jìn)行實(shí)現(xiàn)原理之前,了解下一些關(guān)鍵性術(shù)語的概念。

并發(fā)

一個cpu上能同時執(zhí)行多項(xiàng)任務(wù),在很短時間內(nèi),cpu來回切換任務(wù)執(zhí)行(在某段很短時間內(nèi)執(zhí)行程序a,然后又迅速得切換到程序b去執(zhí)行),有時間上的重疊(宏觀上是同時的,微觀仍是順序執(zhí)行),這樣看起來多個任務(wù)像是同時執(zhí)行,這就是并發(fā)。

并行

當(dāng)系統(tǒng)有多個CPU時,每個CPU同一時刻都運(yùn)行任務(wù),互不搶占自己所在的CPU資源,同時進(jìn)行,稱為并行。

進(jìn)程

cpu在切換程序的時候,如果不保存上一個程序的狀態(tài)(也就是我們常說的context--上下文),直接切換下一個程序,就會丟失上一個程序的一系列狀態(tài),于是引入了進(jìn)程這個概念,用以劃分好程序運(yùn)行時所需要的資源。因此進(jìn)程就是一個程序運(yùn)行時候的所需要的基本資源單位(也可以說是程序運(yùn)行的一個實(shí)體)。

線程

cpu切換多個進(jìn)程的時候,會花費(fèi)不少的時間,因?yàn)榍袚Q進(jìn)程需要切換到內(nèi)核態(tài),而每次調(diào)度需要內(nèi)核態(tài)都需要讀取用戶態(tài)的數(shù)據(jù),進(jìn)程一旦多起來,cpu調(diào)度會消耗一大堆資源,因此引入了線程的概念,線程本身幾乎不占有資源,他們共享進(jìn)程里的資源,內(nèi)核調(diào)度起來不會那么像進(jìn)程切換那么耗費(fèi)資源。

協(xié)程

協(xié)程擁有自己的寄存器上下文和棧。協(xié)程調(diào)度切換時,將寄存器上下文和棧保存到其他地方,在切回來的時候,恢復(fù)先前保存的寄存器上下文和棧。因此,協(xié)程能保留上一次調(diào)用時的狀態(tài)(即所有局部狀態(tài)的一個特定組合),每次過程重入時,就相當(dāng)于進(jìn)入上一次調(diào)用的狀態(tài),換種說法:進(jìn)入上一次離開時所處邏輯流的位置。線程和進(jìn)程的操作是由程序觸發(fā)系統(tǒng)接口,最后的執(zhí)行者是系統(tǒng);協(xié)程的操作執(zhí)行者則是用戶自身程序,goroutine也是協(xié)程。

Go調(diào)度的組成

Go的調(diào)度主要有四個結(jié)構(gòu)組成,分別是:

  • G:goroutine的核心結(jié)構(gòu),包括routine的棧、程序計數(shù)器pc、以及一些狀態(tài)信息等;
  • M:內(nèi)核級線程。goroutine在M上運(yùn)行。M中信息包括:正在運(yùn)行的goroutine、等待運(yùn)行的routine列表等。當(dāng)然也包括操作系統(tǒng)線程相關(guān)信息,這些此處不討論。
  • P:processor,處理器,只要用于執(zhí)行g(shù)oroutine,維護(hù)了一個goroutine列表。其實(shí)P是可以從屬于M的。當(dāng)P從屬于(分配給)M的時候,表示P中的某個goroutine得以運(yùn)行。當(dāng)P不從屬于M的時候,表示P中的所有g(shù)oroutine都需要等待被安排到內(nèi)核級線程運(yùn)行。
  • Sched:調(diào)度器,存儲、維護(hù)M,以及一個全局的goroutine等待隊(duì)列,以及其他狀態(tài)信息。

Go程序的啟動過程

  • 初始化Sched:一個存儲P的列表pidle。P的數(shù)量可以通過GOMAXPROCS設(shè)置;
  • 創(chuàng)建第一個goroutine。這個goroutine會創(chuàng)建一個M,這個內(nèi)核級線程(sysmon)的工作是對goroutine進(jìn)行監(jiān)控。之后,這個goroutine開始我們在main函數(shù)里面的代碼,此時,該goroutine就是我們說的主routine。

創(chuàng)建goroutine:

  • goroutine創(chuàng)建時指定了代碼段
  • 然后,goroutine被加入到P中去等待運(yùn)行。
  • 這個新建的goroutine的信息包含:棧地址、程序計數(shù)器

創(chuàng)建內(nèi)核級線程M

內(nèi)核級線程由go的運(yùn)行時根據(jù)實(shí)際情況創(chuàng)建,我們無法再go中創(chuàng)建內(nèi)核級線程。那什么時候回創(chuàng)建內(nèi)核級線程呢?當(dāng)前程序等待運(yùn)行的goroutine數(shù)量達(dá)到一定數(shù)量及存在空閑(為被分配給M)的P的時候,Go運(yùn)行時就會創(chuàng)建一些M,然后將空閑的P分配給新建的內(nèi)核級線程M,接著才是獲取、運(yùn)行g(shù)oroutine。創(chuàng)建M的接口函數(shù)如下:

// 創(chuàng)建M的接口函數(shù)
void newm(void (*fn)(void), P *p)

// 分配P給M
if(m != runtime·m0) {Â
  acquirep(m->nextp);
  m->nextp = nil;
}
// 獲取goroutine并開始運(yùn)行
schedule();

M的運(yùn)行

static void schedule(void)
{
  G *gp;

  gp = runqget(m->p);
  if(gp == nil)
    gp = findrunnable();

 // 如果P的類別不止一個goroutine,且調(diào)度器中有空閑的的P,就喚醒其他內(nèi)核級線程M
  if (m->p->runqhead != m->p->runqtail 
    runtime·atomicload(runtime·sched.nmspinning) == 0 
    runtime·atomicload(runtime·sched.npidle) > 0) // TODO: fast atomic
    wakep();
 // 執(zhí)行g(shù)oroutine
  execute(gp);
}

  • runqget: 從P中獲取goroutine即gp。gp可能為nil(如M剛創(chuàng)建時P為空;或者P的goroutine已經(jīng)運(yùn)行完了)。
  • findrunnable:尋找空閑的goroutine(從全局的goroutine等待隊(duì)列獲取goroutine;如果所有g(shù)oroutine都已經(jīng)被分配了,那么從其他M的P的goroutine的goroutine列表獲取一些)。如果獲取到goroutine,就將他放入P中,并執(zhí)行它;否則沒能獲取到任何的goroutine,該內(nèi)核級線程進(jìn)行系統(tǒng)調(diào)用sleep了。
  • wakep:當(dāng)當(dāng)前內(nèi)核級線程M的P中不止一個goroutine且調(diào)度器中有空閑的的P,就喚醒其他內(nèi)核級線程M。(為了找些空閑的M幫自己分擔(dān))。

Routine狀態(tài)遷移

前面說的是G,M是怎樣創(chuàng)建的以及什么時候創(chuàng)建、運(yùn)行。那么goroutine在M是是怎樣進(jìn)行調(diào)度的呢?這個才是goroutine的調(diào)度核心問題,即上面代碼中的schedule。在說調(diào)度之前,我們必須知道goroutine的狀態(tài)有什么,以及各個狀態(tài)之間的關(guān)系。

  • Gidle:創(chuàng)建中的goroutine,實(shí)際上這個狀態(tài)沒有什么用;
  • Grunnable:新創(chuàng)建完成的goroutine在完成了資源的分配及初始化后,會進(jìn)入這個狀態(tài)。這個新創(chuàng)建的goroutine會被分配到創(chuàng)建它的M的P中;
  • Grunning:當(dāng)Grunnable中的goroutine等到了空閑的cpu或者到了自己的時間片的時候,就會進(jìn)入Grunning狀態(tài)。這個裝下的goroutine可以被前文提到的findrunnable函數(shù)獲取;
  • Gwaiting:當(dāng)正在運(yùn)行的goroutine進(jìn)行一些阻塞調(diào)用的時候,就會從Grunning狀態(tài)進(jìn)入Gwaiting狀態(tài)。常見的調(diào)用有:寫入一個滿的channel、讀取空的channel、IO操作、定時器Ticker等。當(dāng)阻塞調(diào)用完成后,goroutine的狀態(tài)就會從Gwaiting轉(zhuǎn)變?yōu)镚runnable;
  • Gsyscall:當(dāng)正在運(yùn)行的goroutine進(jìn)行系統(tǒng)調(diào)用的時候,其狀態(tài)就會轉(zhuǎn)變?yōu)镚syscall。當(dāng)系統(tǒng)調(diào)用完成后goroutine的狀態(tài)就會變?yōu)镚runnable。(前文提到的sysmon進(jìn)程會監(jiān)控所有的P,如果發(fā)現(xiàn)有的P的系統(tǒng)調(diào)用是阻塞式的或者執(zhí)行的時間過長,就會將P從原來的M分離出來,并新建一個M,將P分配給這個新建的M)。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • 詳解Golang編程中的常量與變量
  • Golang學(xué)習(xí)筆記(二):類型、變量、常量
  • GO語言中的常量
  • Go語言中常量定義方法實(shí)例分析
  • Go系列教程之反射的用法
  • GOLANG使用Context實(shí)現(xiàn)傳值、超時和取消的方法
  • GOLANG使用Context管理關(guān)聯(lián)goroutine的方法
  • Go并發(fā)調(diào)用的超時處理的方法
  • 淺談GoLang幾種讀文件方式的比較
  • Golang常量iota的使用實(shí)例

標(biāo)簽:保定 許昌 德宏 東營 貴州 曲靖 吐魯番 常州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Go routine調(diào)度詳解》,本文關(guān)鍵詞  routine,調(diào)度,詳解,routine,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Go routine調(diào)度詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于Go routine調(diào)度詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    青青青草影院| 精品国产一区二区三区久久久狼| 亚州视频一区二区| 韩国妈妈的朋友在线播放| 夜夜操网| 九九九国产| 欧美大片毛片aaa免费看| 中文字幕Aⅴ资源网| 日韩在线观看免费| 国产麻豆精品hdvideoss| 色综合久久久久综合体桃花网| 精品视频在线观看免费| 亚久久伊人精品青青草原2020| 久久国产精品只做精品| 99色精品| 你懂的在线观看视频| 亚洲第一视频在线播放| 天天色色色| 亚洲精品久久玖玖玖玖| 国产激情一区二区三区| 台湾毛片| 国产精品自拍在线观看| 午夜在线亚洲男人午在线| 日本伦理黄色大片在线观看网站| 你懂的在线观看视频| 日韩专区一区| 精品视频免费在线| 亚洲精品久久久中文字| 日韩专区一区| 天天色成人| 欧美日本韩国| 国产亚洲精品aaa大片| 国产伦精品一区三区视频| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 韩国妈妈的朋友在线播放| 麻豆网站在线免费观看| 91麻豆精品国产片在线观看| 日韩专区在线播放| 精品久久久久久中文字幕2017| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 亚洲女人国产香蕉久久精品 | 日韩一级黄色| 午夜在线亚洲| 999久久久免费精品国产牛牛| 成人高清视频在线观看| 国产伦久视频免费观看 视频 | 国产成人精品影视| 欧美激情一区二区三区在线| 四虎影视精品永久免费网站| 亚洲不卡一区二区三区在线 | 国产a网| 成人a大片高清在线观看| 精品久久久久久影院免费| 国产亚洲精品aaa大片| 黄色免费网站在线| 精品国产香蕉伊思人在线又爽又黄| 日韩avdvd| 国产91素人搭讪系列天堂| 你懂的在线观看视频| 精品视频在线看 | 国产一区免费观看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产激情一区二区三区| 日日日夜夜操| 亚洲精品久久久中文字| 尤物视频网站在线| 天天做日日爱| 你懂的日韩| 久久99这里只有精品国产| 欧美电影免费看大全| 黄色免费三级| 精品国产香蕉伊思人在线又爽又黄| 日本免费看视频| 天天做日日爱夜夜爽| 日本伦理片网站| 亚久久伊人精品青青草原2020| 999久久狠狠免费精品| 91麻豆精品国产综合久久久| 欧美a级大片| 久久国产精品永久免费网站| 九九久久99| 久久精品店| 99久久精品国产国产毛片| 日韩av东京社区男人的天堂| 精品视频一区二区三区免费| 国产精品1024永久免费视频 | 国产视频在线免费观看| 精品视频在线看 | 国产美女在线一区二区三区| 国产激情一区二区三区| a级黄色毛片免费播放视频 | 99热热久久| 国产一区二区高清视频| 毛片高清| 999精品在线| 韩国毛片免费大片| 日韩男人天堂| 精品毛片视频| 日韩欧美一二三区| 久久久成人影院| 色综合久久久久综合体桃花网| 国产精品自拍亚洲| 久久精品欧美一区二区| 免费国产在线观看| 精品视频免费观看| 999久久狠狠免费精品| 国产一区二区精品在线观看| 日本特黄特黄aaaaa大片| 可以免费在线看黄的网站| 黄色福利片| 四虎影视久久久| 久草免费在线观看| 欧美激情一区二区三区视频 | 日韩中文字幕在线观看视频| 色综合久久天天综合| 国产亚洲男人的天堂在线观看| 你懂的在线观看视频| 欧美一级视频免费观看| 一级毛片视频在线观看| 国产不卡在线播放| 国产高清在线精品一区a| 欧美一级视频免费观看| 成人免费观看网欧美片| 青青久在线视频| 亚洲精品中文一区不卡| 国产网站免费视频| 麻豆系列 在线视频| 日韩中文字幕在线播放| 欧美大片a一级毛片视频| 久久国产精品只做精品| 欧美激情中文字幕一区二区| 欧美电影免费| 国产原创视频在线| 韩国妈妈的朋友在线播放| 国产视频网站在线观看| 天天色色网| 国产a免费观看| 日本在线www| 九九精品久久久久久久久| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 99久久精品国产高清一区二区| 久草免费资源| 91麻豆国产| 精品视频免费在线| 久久成人性色生活片| 久久99中文字幕| 999精品视频在线| 四虎影视精品永久免费网站| 色综合久久天天综合| 精品视频在线看 | 精品国产一区二区三区久| 九九精品久久久久久久久| 亚欧视频在线| 国产91精品一区| 精品久久久久久中文| 国产一区二区精品| 91麻豆国产级在线| 天天做人人爱夜夜爽2020毛片| 亚洲精品中文一区不卡| 国产成人精品综合在线| 久久久久久久免费视频| 日韩男人天堂| 日韩专区亚洲综合久久| 国产伦精品一区二区三区在线观看| 一本高清在线| 麻豆系列 在线视频| 成人a大片高清在线观看| 麻豆系列 在线视频| 亚洲第一视频在线播放| 麻豆系列 在线视频| 成人免费观看男女羞羞视频| 亚洲 男人 天堂| 亚洲不卡一区二区三区在线 | 欧美电影免费| 中文字幕一区二区三区精彩视频 | 国产极品精频在线观看| 四虎影视库国产精品一区| 精品国产香蕉伊思人在线又爽又黄| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 99久久精品国产国产毛片| 日韩专区一区| 国产一区二区精品久久91| 韩国三级视频在线观看| 可以免费在线看黄的网站| 精品视频在线观看一区二区 | 欧美激情一区二区三区视频 | 久久99中文字幕| 美女免费黄网站| 国产网站在线| 国产91视频网| 韩国三级视频网站| 九九精品久久久久久久久| 日本免费乱理伦片在线观看2018| 日本在线不卡免费视频一区| 精品视频在线看| 你懂的日韩| 国产韩国精品一区二区三区| 国产网站在线| 国产一区二区精品|