日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

golang goroutine实现_golang技术随笔(二)理解goroutine

發布時間:2025/4/16 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang goroutine实现_golang技术随笔(二)理解goroutine 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

進程、線程和協程

要理解甚么是goroutine,我們先來看看進程、線程和協程它們之間的區分,這能幫助我們更好的理解goroutine。

進程:分配完全獨立的地址空間,具有自己獨立的堆和棧,既不同享堆,亦不同享棧,進程的切換只產生在內核態,由操作系統調度。

線程:和其它本進程的線程同享地址空間,具有自己獨立的棧和同享的堆,同享堆,不同享棧,線程的切換1般也由操作系統調度(標準線程是的)。

協程:和線程類似,同享堆,不同享棧,協程的切換1般由程序員在代碼中顯式控制。

進程和線程的切換主要依賴于時間片的控制(關于進程和線程的調度方式,具體可參看這篇文章:http://blog.chinaunix.net/uid⑵0476365-id⑴942505.html),而協程的切換則主要依賴于本身,這樣的好處是避免了無意義的調度,由此可以提高性能,但也因此,程序員必須自己承當調度的責任。

goroutine可以看做是協程的go語言實現,從百度百科上看協程的定義:與子例程1樣,協程(coroutine)也是1種程序組件。相對子例程而言,協程更加1般和靈活,但在實踐中使用沒有子例程那樣廣泛。實際上,我們可以把子例程當作是協程的1種特例。1般來講,如果沒有顯式的讓出CPU,就會1直履行當前協程。

淺析goroutine

我們知道goroutine是協程的go語言實現,它是語言原生支持的,相對1般由庫實現協程的方式,goroutine更加強大,它的調度1定程度上是由go運行時(runtime)管理。其好處之1是,當某goroutine產生阻塞時(例猶如步IO操作等),會自動出讓CPU給其它goroutine。

goroutine的使用非常簡單,例如foo是1個函數:

go foo()

就1個關鍵字go弄定了,這里會啟動1個goroutine履行foo函數,然后CPU繼續履行后面的代碼。這里雖然啟動了goroutine,但其實不意味著它會得到馬上調度,關于goroutine的調度我們稍后再探討。

goroutine是非常輕量級的,它就是1段代碼,1個函數入口,和在堆上為其分配的1個堆棧(初始大小為4K,會隨著程序的履行自動增長刪除)。所以它非常便宜,我們可以很輕松的創建上萬個goroutine。

go運行時調度

默許的, 所有goroutine會在1個原生線程里跑,也就是只使用了1個CPU核。在同1個原生線程里,如果當前goroutine不產生阻塞,它是不會讓出CPU時間給其他同線程的goroutines的。除被系統調用阻塞的線程外,Go運行庫最多會啟動$GOMAXPROCS個線程來運行goroutine。

那末goroutine究竟是如何被調度的呢?我們從go程序啟動開始說起。在go程序啟動時會首先創建1個特殊的內核線程sysmon,從名字就能夠看出來它的職責是負責監控的,goroutine背后的調度可以說就是靠它來弄定。

接下來,我們再看看它的調度模型,go語言當前的實現是N:M。即1定數量的用戶線程映照到1定數量的OS線程上,這里的用戶線程在go中指的就是goroutine。go語言的調度模型需要弄清楚3個概念:M、P和G,以下圖表示:

M代表OS線程,G代表goroutine,P的概念比較重要,它表示履行的上下文,其數量由$GOMAXPROCS決定,1般來講正好等于處理器的數量。M必須和P綁定才能履行G,調度器需要保證所有的P都有G履行,以保證并行度。以下圖:

從圖中我們可以看見,當前有兩個P,各自綁定了1個M,并分別履行了1個goroutine,我們還可以看見每一個P上還掛了1個G的隊列,這個隊列是代表私有的任務隊列,它們實際上都是runnable狀態的goroutine。當使用go關鍵字聲明時,1個goroutine便被加入到運行隊列的尾部。1旦1個goroutine運行到1個調度點,上下文便從運行隊列中取出1個goroutine, 設置好棧和指令指針,便開始運行新的goroutine。

那末go中切換goroutine的調度點有哪些呢?具體有以下3種情況

調用runtime?gosched函數。goroutine主動放棄CPU,該goroutine會被設置為runnable狀態,然后放入1個全局等待隊列中,而P將繼續履行下1個goroutine。使用runtime?gosched函數是1個主動的行動,1般是在履行長任務時又想其它goroutine得到履行的機會時調用。

調用runtime?park函數。goroutine進入waitting狀態,除非對其調用runtime?ready函數,否則該goroutine將永久不會得到履行。而P將繼續履行下1個goroutine。使用runtime?park函數1般是在某個條件如果得不到滿足就不能繼續運行下去時調用,當條件滿足后需要使用runtime?ready以喚醒它(這里喚醒以后是不是會加入全局等待隊列還有待研究)。像channel操作,定時器中,網絡poll等都有可能park goroutine。

慢系統調用。這樣的系統調用會阻塞等待,為了使該P上掛著的其它G也能得到履行的機會,需要將這些goroutine轉到另外一個OS線程上去。具體的做法是:首先將該P設置為syscall狀態,然后該線程進入系統調用阻塞等待。之條件到過的sysmom線程會定期掃描所有的P,發現1個P處于了syscall的狀態,就將M和P分離(實際上只有當 Syscall 履行時間超越某個閾值時,才會將 M 與 P 分離)。RUNTIME會再分配1個M和這個P綁定,從而繼續履行隊列中的其它G。而當之前阻塞的M從系統調用中返回后,會將該goroutine放入全局等待隊列中,自己則sleep去。

該圖描寫了M和P的分離進程。

調度點的情況說清楚了,但全部模型還其實不完全。我們知道當使用go去調用1個函數,會生成1個新的goroutine放入當前P的隊列中,那末甚么時候生成別的OS線程,各個OS線程又是如何做負載均衡的呢?

當M從隊列中拿到1個可履行的G后,首先會去檢查1下,自己的隊列中是不是還有等待的G,如果還有等待的G,并且也還有空閑的P,此時就會通知runtime分配1個新的M(如果有在睡覺的OS線程,則直接喚醒它,沒有的話則生成1個新的OS線程)來分擔負務。

如果某個M發現隊列為空以后,會首先從全局隊列中取1個G來處理。如果全局隊列也空了,則會隨機從別的P那里直接截取1半的隊列過來(偷竊任務),如果發現所有的P都沒有可供偷竊的G了,該M就會墮入沉睡。

全部調度模型大致就是這模樣了,和所有協程的調度1樣,在響應時間上,這類協作式調度是硬傷。很容易致使某個協程長時間沒法得到履行。但整體來講,它帶來的好處更加讓人驚嘆。想要了解的更多可以看看我下面列出的1些參考資料,或是直接看它的源碼:http://golang.org/src/runtime/proc.c

總綱傳送門:golang技術隨筆總綱

參考資料

協程

goroutine背后的系統知識

The Go scheduler

goroutine與調度器

總結

以上是生活随笔為你收集整理的golang goroutine实现_golang技术随笔(二)理解goroutine的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 美女张开腿让男人桶爽 | 精品无码av在线 | 男插女视频在线观看 | 在线观看a视频 | av大全在线观看 | 尤物精品在线 | 午夜影视在线观看 | 人人超碰在线 | 中文字幕欧美另类精品亚洲 | 日韩免费视频观看 | 成年人在线观看网站 | 日韩性在线| 亚洲在线视频播放 | 欧美日韩视频无码一区二区三 | av播播| 色噜噜在线观看 | 国产视频1 | 一色桃子juy758在线播放 | 三级av网| xxxx日本免费 | 少妇视频在线播放 | 中国1级毛片 | 美女aaa | 粉嫩av在线播放 | 日日日网站 | 免费无码国产v片在线观看 三级全黄做爰在线观看 | 亚洲av永久无码精品国产精品 | 色综合久久精品亚洲国产 | 素人一区二区 | 夜夜涩 | 可以免费看的黄色 | 免费吸乳羞羞网站视频 | 日日干夜夜艹 | 久久亚洲av成人无码国产电影 | 2019国产精品 | 极品美妇后花庭翘臀娇吟小说 | 亚洲又粗又长 | 性一交一乱一乱一视频 | 抱着老师的嫩臀猛然挺进视频 | 欧美久久久精品 | www.av在线免费观看 | 在线观看精品 | 亚洲精品乱码久久久久久不卡 | 日韩美女啪啪 | 日本一级免费视频 | 在线h网 | 欧美日韩一区二区三区在线播放 | 天天做天天爱天天爽 | 乖女从小调教h尿便器小说 欧美韩一区二区 | 日本黄色免费大片 | 中文字幕一区在线 | 免费观看av网站 | 久久草精品 | 久久综合中文字幕 | 狠狠狠狠干 | 黄色一级大片免费看 | 国产乱淫av片免费看 | av一卡二卡 | 天天射寡妇射 | 五月婷婷综合激情 | 91精品久久久久久综合五月天 | 久久无毛 | 蜜臀av性久久久久蜜臀aⅴ麻豆 | 美女操操操 | 成人娱乐网 | 久久密| www成人免费视频 | 亚洲国产精品无码久久 | 中国黄色小视频 | 欧美三级网站在线观看 | 日日摸日日碰 | 综合天天色 | 葵司免费一区二区三区四区五区 | 男男巨肉啪啪动漫3d | 久久久久久人妻一区二区三区 | 中文在线日本 | 国产一线在线观看 | 日韩一级片网址 | 天堂在线国产 | 国产精品久久久久久亚洲调教 | 一区二区久久精品66国产精品 | 亚洲一区人妻 | 国产精品久久一区二区三区 | 青青草视频在线看 | 国产在线观看a | 毛片视频网址 | 亚洲精品国产suv | 超碰在线97国产 | 国产99999 | av片子在线观看 | 国产精品成人久久 | 丁香综合 | 国产极品久久 | 国产美女无遮挡免费 | 欧美第1页| av网站入口 | 欧美老熟妇一区二区三区 | 精品一二区 | 欧美色图视频在线 |