亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

Go routine調度詳解

2020-04-01 18:50:26
字體:
來源:轉載
供稿:網友

goroutine簡介

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

go func()//通過go關鍵字啟動一個協程來運行函數

go routine的調度原理和操作系統的線層調度是比較相似的。這里我們將介紹go routine的相關知識。

goroutine(有人也稱之為協程)本質上go的用戶級線程的實現,這種用戶級線程是運行在內核級線程之上。當我們在go程序中創建goroutine的時候,我們的這些routine將會被分配到不同的內核級線程中運行。一個內核級線程可能會負責多個routine的運行。而保證這些routine在內內核級線程安全、公平、高效運行的工作,就由調度器來實現。

goroutine內部原理

概念介紹

在進行實現原理之前,了解下一些關鍵性術語的概念。

并發

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

并行

當系統有多個CPU時,每個CPU同一時刻都運行任務,互不搶占自己所在的CPU資源,同時進行,稱為并行。

進程

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

線程

cpu切換多個進程的時候,會花費不少的時間,因為切換進程需要切換到內核態,而每次調度需要內核態都需要讀取用戶態的數據,進程一旦多起來,cpu調度會消耗一大堆資源,因此引入了線程的概念,線程本身幾乎不占有資源,他們共享進程里的資源,內核調度起來不會那么像進程切換那么耗費資源。

協程

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

Go調度的組成

Go的調度主要有四個結構組成,分別是:

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

Go程序的啟動過程

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

創建goroutine:

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

創建內核級線程M

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

// 創建M的接口函數void newm(void (*fn)(void), P *p)// 分配P給Mif(m != &runtime·m0) {Â  acquirep(m->nextp);  m->nextp = nil;}// 獲取goroutine并開始運行schedule();

M的運行

static void schedule(void){  G *gp;  gp = runqget(m->p);  if(gp == nil)    gp = findrunnable(); // 如果P的類別不止一個goroutine,且調度器中有空閑的的P,就喚醒其他內核級線程M  if (m->p->runqhead != m->p->runqtail &&    runtime·atomicload(&runtime·sched.nmspinning) == 0 &&    runtime·atomicload(&runtime·sched.npidle) > 0) // TODO: fast atomic    wakep(); // 執行goroutine  execute(gp);}
  • runqget: 從P中獲取goroutine即gp。gp可能為nil(如M剛創建時P為空;或者P的goroutine已經運行完了)。
  • findrunnable:尋找空閑的goroutine(從全局的goroutine等待隊列獲取goroutine;如果所有goroutine都已經被分配了,那么從其他M的P的goroutine的goroutine列表獲取一些)。如果獲取到goroutine,就將他放入P中,并執行它;否則沒能獲取到任何的goroutine,該內核級線程進行系統調用sleep了。
  • wakep:當當前內核級線程M的P中不止一個goroutine且調度器中有空閑的的P,就喚醒其他內核級線程M。(為了找些空閑的M幫自己分擔)。

Routine狀態遷移

前面說的是G,M是怎樣創建的以及什么時候創建、運行。那么goroutine在M是是怎樣進行調度的呢?這個才是goroutine的調度核心問題,即上面代碼中的schedule。在說調度之前,我們必須知道goroutine的狀態有什么,以及各個狀態之間的關系。

Go,routine,調度

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品视频免费看| 久久久久久久国产| 国产在线观看精品| 欧美亚洲一区在线| 国语自产精品视频在线看| 九九久久久久久久久激情| 色悠悠国产精品| 亚洲精品日韩激情在线电影| 日韩中文字幕av| 正在播放亚洲1区| 亚洲国产精品网站| 久久综合色影院| 日韩精品一区二区三区第95| 亚洲女人天堂成人av在线| 日韩精品小视频| 欧日韩在线观看| 国产成人中文字幕| 国产午夜精品免费一区二区三区| 粗暴蹂躏中文一区二区三区| 国产精品最新在线观看| 亚洲成**性毛茸茸| 国产精品亚洲自拍| 成人做爰www免费看视频网站| 97国产在线观看| 成人在线免费观看视视频| 日韩欧美一区视频| 日韩成人高清在线| 亚洲综合色av| 国语自产精品视频在免费| 国产一区二区香蕉| 国产精品成人久久久久| 91av视频在线播放| 国产精品精品一区二区三区午夜版| 黄色一区二区在线观看| 欧美激情视频给我| 少妇精69xxtheporn| 日韩成人av网址| 欧美国产第一页| 91精品视频一区| 亚洲天堂av图片| 亚洲视频在线观看免费| 欧美成人精品三级在线观看| 在线成人激情视频| 欧美国产日本高清在线| 亚洲欧美精品一区| 久久久久久国产精品| 亚洲成人a**站| 国产亚洲精品美女久久久久| 日韩三级成人av网| 国产精品国产三级国产aⅴ浪潮| 欧美视频一区二区三区…| 91精品在线国产| 欧美日韩国产精品一区二区三区四区| 国产欧美日韩免费看aⅴ视频| 中文字幕综合在线| 国产日韩欧美综合| 疯狂欧美牲乱大交777| 国产一区二区激情| 国产日韩精品综合网站| 亚洲国产欧美一区二区三区久久| 国产精品大陆在线观看| 亚洲精品丝袜日韩| 91香蕉嫩草影院入口| 4k岛国日韩精品**专区| 久久韩剧网电视剧| 国产精品久久久久久久久免费看| 亚洲成人av中文字幕| 久久久久久久91| 精品国产一区二区三区四区在线观看| 国产精品美女视频网站| 亚洲综合中文字幕在线观看| 国产日韩欧美在线观看| 国产91久久婷婷一区二区| 亚洲乱码一区二区| 国产成人精品综合| 欧美亚洲激情视频| 最近2019中文字幕第三页视频| 亚洲国产天堂网精品网站| 中文字幕一精品亚洲无线一区| 亚洲男女性事视频| 午夜精品美女自拍福到在线| 亚洲无线码在线一区观看| 欧美成人精品一区二区三区| 一本色道久久88综合亚洲精品ⅰ| 久久久久久久久久久亚洲| 亚洲午夜国产成人av电影男同| 国产成人精品一区二区| 中文字幕亚洲一区二区三区| 欧美巨乳美女视频| 亚洲区中文字幕| 精品久久久中文| 亚洲天堂男人的天堂| 国产亚洲视频中文字幕视频| 92看片淫黄大片看国产片| 国产97人人超碰caoprom| 欧美另类极品videosbestfree| 国产精品美女免费看| 美女啪啪无遮挡免费久久网站| 亚洲精品午夜精品| 欧美激情区在线播放| 色久欧美在线视频观看| 日韩黄色在线免费观看| 一区二区日韩精品| 亚洲精品视频中文字幕| 丰满岳妇乱一区二区三区| 最近中文字幕日韩精品| 欧美性资源免费| 日韩精品中文字幕久久臀| 亚洲成av人影院在线观看| 在线成人中文字幕| 午夜精品久久久久久久99热浪潮| 欧美一级视频免费在线观看| 国产伦精品免费视频| 蜜臀久久99精品久久久无需会员| 成人444kkkk在线观看| 欧美电影在线观看网站| 不卡av日日日| 国产精品久久久久国产a级| 日本精品久久久久久久| 欧美激情一区二区三区成人| 91成人精品网站| 色综合久久悠悠| 一区二区中文字幕| 欧美国产日韩中文字幕在线| 亚洲精品www久久久久久广东| 国产精品高潮粉嫩av| 欧美极品少妇xxxxⅹ免费视频| 国产日韩精品在线| 91精品国产91久久久久久不卡| 国产在线98福利播放视频| 久久久亚洲欧洲日产国码aⅴ| 亚洲三级黄色在线观看| 在线成人免费网站| 久久夜色精品国产欧美乱| 欧美激情在线观看| 日韩欧美成人精品| 久久69精品久久久久久久电影好| 国产91精品最新在线播放| 亚洲精品自拍第一页| 91最新在线免费观看| 欧美猛少妇色xxxxx| 欧美一区在线直播| 18性欧美xxxⅹ性满足| 国产欧美日韩精品在线观看| 国产日韩欧美日韩| 国产精品一区专区欧美日韩| 国产suv精品一区二区三区88区| 亚洲欧美另类国产| 日韩av中文字幕在线| 亚洲日韩欧美视频| 国产精品第七影院| 国产欧美精品va在线观看| 日韩av在线影视| 欧洲精品在线视频| 国产欧美精品在线| 精品一区二区三区电影| 国产精品第七十二页| 青草热久免费精品视频| 成人精品久久av网站| 亚洲第一区中文字幕| 日韩中文在线视频| 久久精品国产亚洲精品| 95av在线视频| 一本一本久久a久久精品牛牛影视|