<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Golang 協(xié)程調(diào)度

      一、線程模型

      • N:1模型,N個用戶空間線程在1個內(nèi)核空間線程上運行。優(yōu)勢是上下文切換非??斓菬o法利用多核系統(tǒng)的優(yōu)點。
      • 1:1模型,1個內(nèi)核空間線程運行一個用戶空間線程。這種充分利用了多核系統(tǒng)的優(yōu)勢但是上下文切換非常慢,因為每一次調(diào)度都會在用戶態(tài)和內(nèi)核態(tài)之間切換。(POSIX線程模型(pthread),Java)
      • M:N模型, 每個用戶線程對應(yīng)多個內(nèi)核空間線程,同時也可以一個內(nèi)核空間線程對應(yīng)多個用戶空間線程。Go打算采用這種模型,使用任意個內(nèi)核模型管理任意個goroutine。這樣結(jié)合了以上兩種模型的優(yōu)點,但缺點就是調(diào)度的復(fù)雜性。

      下面看看golang的協(xié)程調(diào)度

      • M:一個用戶空間線程,同時對應(yīng)一個內(nèi)核線程,類似posix pthread
      • P:代表運行的上下文環(huán)境, 也就是我們上一節(jié)實現(xiàn)的調(diào)度器,一個調(diào)度器也會對應(yīng)一個就緒隊列
      • G:goroutine,即協(xié)程

      二、調(diào)度模型簡介

      groutine能擁有強大的并發(fā)實現(xiàn)是通過GPM調(diào)度模型實現(xiàn),下面就來解釋下goroutine的調(diào)度模型。

      Go的調(diào)度器內(nèi)部有三個重要的結(jié)構(gòu):M,P,G
      M:M是對內(nèi)核級線程的封裝,數(shù)量對應(yīng)真實的CPU數(shù),一個M就是一個線程,goroutine就是跑在M之上的;M是一個很大的結(jié)構(gòu),里面維護小對象內(nèi)存cache(mcache)、當(dāng)前執(zhí)行的goroutine、隨機數(shù)發(fā)生器等等非常多的信息
      G:代表一個goroutine,它有自己的棧,instruction pointer和其他信息(正在等待的channel等等),用于調(diào)度。
      P:P全稱是Processor,處理器,它的主要用途就是用來執(zhí)行g(shù)oroutine的。每個Processor對象都擁有一個LRQ(Local Run Queue),未分配的Goroutine對象保存在GRQ(Global Run Queue )中,等待分配給某一個P的LRQ中,每個LRQ里面包含若干個用戶創(chuàng)建的Goroutine對象。

      Golang采用的是多線程模型,更詳細的說他是一個兩級線程模型,但它對系統(tǒng)線程(內(nèi)核級線程)進行了封裝,暴露了一個輕量級的協(xié)程goroutine(用戶級線程)供用戶使用,而用戶級線程到內(nèi)核級線程的調(diào)度由golang的runtime負責(zé),調(diào)度邏輯對外透明。goroutine的優(yōu)勢在于上下文切換在完全用戶態(tài)進行,無需像線程一樣頻繁在用戶態(tài)與內(nèi)核態(tài)之間切換,節(jié)約了資源消耗。

      調(diào)度實現(xiàn)

      從上圖中看,有2個物理線程M,每一個M都擁有一個處理器P,每一個也都有一個正在運行的goroutine。
      P的數(shù)量可以通過GOMAXPROCS()來設(shè)置,它其實也就代表了真正的并發(fā)度,即有多少個goroutine可以同時運行。
      圖中灰色的那些goroutine并沒有運行,而是出于ready的就緒態(tài),正在等待被調(diào)度。P維護著這個隊列(稱之為runqueue),
      Go語言里,啟動一個goroutine很容易:go function 就行,所以每有一個go語句被執(zhí)行,runqueue隊列就在其末尾加入一個
      goroutine,在下一個調(diào)度點,就從runqueue中取出(如何決定取哪個goroutine?)一個goroutine執(zhí)行。

       

      當(dāng)一個OS線程M0陷入阻塞時(如下圖),P轉(zhuǎn)而在運行M1,圖中的M1可能是正被創(chuàng)建,或者從線程緩存中取出。

       


      當(dāng)MO返回時,它必須嘗試取得一個P來運行g(shù)oroutine,一般情況下,它會從其他的OS線程那里拿一個P過來,
      如果沒有拿到的話,它就把goroutine放在一個global runqueue里,然后自己睡眠(放入線程緩存里)。所有的P也會周期性的檢查global runqueue并運行其中的goroutine,否則global runqueue上的goroutine永遠無法執(zhí)行。
       
      另一種情況是P所分配的任務(wù)G很快就執(zhí)行完了(分配不均),這就導(dǎo)致了這個處理器P很忙,但是其他的P還有任務(wù),此時如果global runqueue沒有任務(wù)G了,那么P不得不從其他的P里拿一些G來執(zhí)行。一般來說,如果P從其他的P那里要拿任務(wù)的話,一般就拿run queue的一半,這就確保了每個OS線程都能充分的使用,如下圖:

      三、GPM創(chuàng)建相關(guān)問題

      M和P的數(shù)量如何確定?或者說何時會創(chuàng)建M和P?

      1、P的數(shù)量:

      • 由啟動時環(huán)境變量$GOMAXPROCS或者是由runtime的方法GOMAXPROCS()決定(默認是1)。這意味著在程序執(zhí)行的任意時刻都只有$GOMAXPROCS個goroutine在同時運行。

      2、M的數(shù)量:

      • go語言本身的限制:go程序啟動時,會設(shè)置M的最大數(shù)量,默認10000.但是內(nèi)核很難支持這么多的線程數(shù),所以這個限制可以忽略。
      • runtime/debug中的SetMaxThreads函數(shù),設(shè)置M的最大數(shù)量
      • 一個M阻塞了,會創(chuàng)建新的M。

      M與P的數(shù)量沒有絕對關(guān)系,一個M阻塞,P就會去創(chuàng)建或者切換另一個M,所以,即使P的默認數(shù)量是1,也有可能會創(chuàng)建很多個M出來。

      3、P何時創(chuàng)建:在確定了P的最大數(shù)量n后,運行時系統(tǒng)會根據(jù)這個數(shù)量創(chuàng)建n個P。

      4、M何時創(chuàng)建:沒有足夠的M來關(guān)聯(lián)P并運行其中的可運行的G。比如所有的M此時都阻塞住了,而P中還有很多就緒任務(wù),就會去尋找空閑的M,而沒有空閑的,就會去創(chuàng)建新的M。

      M選擇哪一個P關(guān)聯(lián)?

      • M會選擇導(dǎo)致此M被創(chuàng)建的那個P關(guān)聯(lián)。

      什么時候會切換P與M的關(guān)聯(lián)關(guān)系?

      當(dāng)M因系統(tǒng)調(diào)用而阻塞時(M上運行的G進入了系統(tǒng)調(diào)用的時候),M與P會分開,如果此時P的就緒隊列中還有任務(wù),
      P就會去關(guān)聯(lián)一個空閑的M,或者創(chuàng)建一個M進行關(guān)聯(lián)。(也就是說go不是像libtask一樣處理IO阻塞的?不確定。)

      就緒的G如何選擇進入哪個P的就緒隊列?

      • 默認情況下:因為P的默認數(shù)量是1(M不一定是1),所以如果我們不改變GOMAXPROCS,無論我們在程序中用go語句創(chuàng)建多少個goroutine,它們都只會被塞入同一個P的就緒隊列中。
      • 有多個P的情況下:如果修改了GOMAXPROCS或者調(diào)用了runtime.GOMAXPROCS,運行時系統(tǒng)會把所有的G均勻的分布在各個P的就緒隊列中。

      如何保證每個P的就緒隊列中都會有G

      如果一個P的就緒隊列所有任務(wù)都執(zhí)行完了,那么P會嘗試從其他P的就緒隊列中取出一部分到自己的就緒隊列中,以保證每個P的就緒隊列都有任務(wù)可以執(zhí)行。

      posted @ 2019-03-31 16:31  林鍋  閱讀(8709)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲综合无码AV在线观看| 一级片黄色一区二区三区| 大香伊蕉在人线国产最新2005| 一个色综合国产色综合| 国产成人精品免费视频app软件| 亚洲精品动漫免费二区| 日韩av一区二区三区在线| 影音先锋人妻啪啪av资源网站| 日韩V欧美V中文在线| 亚洲综合视频一区二区三区| 99精品人妻少妇一区| 色偷一区国产精品| 中国熟女仑乱hd| 成人性生交大片免费看r老牛网站 中文字幕一区二区三区四区五区 久久久久久毛片免费播放 | 中文字幕波多野不卡一区| 欧美男男作爱videos可播放| 人妻蜜臀久久av不卡| 好紧好滑好湿好爽免费视频| 福利一区二区在线播放| 中文字幕日韩精品无码内射| 国产一区二区三区禁18| 亚洲中文字幕一区二区| 亚洲香蕉视频天天爽| 免费无码中文字幕A级毛片| 国产精品一区二区三区日韩| 婷婷六月色| 国产精品亚洲国际在线看| 手机无码人妻一区二区三区免费| 成在人线av无码免费看网站直播| 亚洲AV日韩AV高清在线观看| 亚洲国产日韩欧美一区二区三区| 国产成人无码综合亚洲日韩| 国内不卡的一区二区三区| 欧洲精品色在线观看| 亚洲丰满熟女一区二区蜜桃| 欧洲美熟女乱av在免费| 国产成人精品三级麻豆| 久久亚洲国产精品五月天| 精品国产乱码久久久久夜深人妻| 日本一区二区三区在线播放| 久久天天躁综合夜夜黑人鲁色 |