在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

詳解剖析Go語言調度模型的設計

馬哥Linux運維 ? 來源:愛戶外的程序猿 ? 作者:愛戶外的程序猿 ? 2021-07-26 10:12 ? 次閱讀

golang的MPG調度模型是保障Go語言效率高的一個重要特性,本文詳細介紹了Go語言調度模型的設計。

前言

Please remember that at the end of the day, all programs that work on UNIX machines end up using C system calls to communicate with the UNIX kernel and perform most of their tasks. 所有在 UNIX 系統上運行的程序最終都會通過 C 系統調用來和內核打交道。

用其他語言編寫程序進行系統調用,方法不外乎兩個:一是自己封裝,二是依賴 glibc、或者其他的運行庫。Go 語言選擇了前者,把系統調用都封裝到了 syscall 包。封裝時也同樣得通過匯編實現。

異步系統調用 G 會和MP分離(G掛到netpoller),同步系統調用 GM 會和P分離(P另尋M),生動的說明了GPM相對GM的精妙之處。

阻塞

在 Go 里面阻塞主要分為以下 4 種場景:

由于原子、互斥量或通道操作調用導致 Goroutine 阻塞,調度器將把當前阻塞的 Goroutine 切換出去,重新調度 LRQ 上的其他 Goroutine;

由于網絡請求和 IO 操作導致 Goroutine 阻塞。Go 程序提供了網絡輪詢器(NetPoller)來處理網絡請求和 IO 操作的問題,其后臺通過 kqueue(MacOS),epoll(Linux)或 iocp(Windows)來實現 IO 多路復用。通過使用 NetPoller 進行網絡系統調用,調度器可以防止 Goroutine 在進行這些系統調用時阻塞 M。

這可以讓 M 執行 P 的 LRQ 中其他的 Goroutines,而不需要創建新的 M。執行網絡系統調用不需要額外的 M,網絡輪詢器使用系統線程,它時刻處理一個有效的事件循環,有助于減少操作系統上的調度負載。

用戶層眼中看到的 Goroutine 中的“block socket”,實現了 goroutine-per-connection 簡單的網絡編程模式。實際上是通過 Go runtime 中的 netpoller 通過 Non-block socket + I/O 多路復用機制“模擬”出來的。

當調用一些系統方法的時候(如文件 I/O),如果系統方法調用的時候發生阻塞,這種情況下,網絡輪詢器(NetPoller)無法使用,而進行系統調用的 G1 將阻塞當前 M1。調度器引入 其它M 來服務 M1 的P。

如果在 Goroutine 去執行一個 sleep 操作,導致 M 被阻塞了。Go 程序后臺有一個監控線程 sysmon,它監控那些長時間運行的 G 任務然后設置可以強占的標識符,別的 Goroutine 就可以搶先進來執行。

系統調用

Go 語言通過 Syscall 和 Rawsyscall 等使用匯編語言編寫的方法封裝了操作系統提供的所有系統調用,其中 Syscall 在 Linux 386 上的實現如下:

TEXT ·Syscall(SB),NOSPLIT,$0-28

CALL runtime·entersyscall(SB)

MOVL trap+0(FP), AX // syscall entry

MOVL a1+4(FP), BX

MOVL a2+8(FP), CX

MOVL a3+12(FP), DX

MOVL $0, SI

MOVL $0, DI

INVOKE_SYSCALL

CMPL AX, $0xfffff001

JLS ok

MOVL $-1, r1+16(FP)

MOVL $0, r2+20(FP)

NEGL AX

MOVL AX, err+24(FP)

CALL runtime·exitsyscall(SB)

RET

ok:

MOVL AX, r1+16(FP)

MOVL DX, r2+20(FP)

MOVL $0, err+24(FP)

CALL runtime·exitsyscall(SB)

RET

Golang - 調度剖析 https://segmentfault.com/a/1190000016611742

Go: Goroutine, OS Thread and CPU Management https://medium.com/a-journey-with-go/go-goroutine-os-thread-and-cpu-management-2f5a5eaf518a

Go optimizes the system calls — whatever it is blocking or not — by wrapping them up in the runtime. This wrapper will automatically dissociate the P from the thread M and allow another thread to run on it.

異步系統調用

通過使用網絡輪詢器進行網絡系統調用,調度器可以防止 Goroutine 在進行這些系統調用時阻塞M。這可以讓M執行P的 LRQ 中其他的 Goroutines,而不需要創建新的M。有助于減少操作系統上的調度負載。

G1正在M上執行,還有 3 個 Goroutine 在 LRQ 上等待執行

接下來,G1想要進行網絡系統調用,因此它被移動到網絡輪詢器并且處理異步網絡系統調用。然后,M可以從 LRQ 執行另外的 Goroutine。

最后:異步網絡系統調用由網絡輪詢器完成,G1被移回到P的 LRQ 中。一旦G1可以在M上進行上下文切換,它負責的 Go 相關代碼就可以再次執行。

同步系統調用

G1將進行同步系統調用以阻塞M1

調度器介入后:識別出G1已導致M1阻塞,此時,調度器將M1與P分離,同時也將G1帶走。然后調度器引入新的M2來服務P。

b030aa1a-db82-11eb-9e57-12bb97331649.png

阻塞的系統調用完成后:G1可以移回 LRQ 并再次由P執行。如果這種情況需要再次發生,M1將被放在旁邊以備將來使用。

b03e4c56-db82-11eb-9e57-12bb97331649.png

sysmon 協程

b04936ca-db82-11eb-9e57-12bb97331649.jpg

在 linux 內核中有一些執行定時任務的線程, 比如定時寫回臟頁的 pdflush, 定期回收內存的 kswapd0, 以及每個 cpu 上都有一個負責負載均衡的 migration 線程等。在 go 運行時中也有類似的協程 sysmon. sysmon 運行在 M,且不需要 P。它會每隔一段時間檢查 Go 語言runtime,確保程序沒有進入異常狀態。

系統監控的觸發時間就會穩定在 10ms,功能比較多:

檢查死鎖runtime.checkdead

運行計時器 — 獲取下一個需要被觸發的計時器;

定時從 netpoll 中獲取 ready 的協程

Go 的搶占式調度

當 sysmon 發現 M 已運行同一個 G(Goroutine)10ms 以上時,它會將該 G 的內部參數 preempt 設置為 true。然后,在函數序言中,當 G 進行函數調用時,G 會檢查自己的 preempt 標志,如果它為 true,則它將自己與 M 分離并推入“全局隊列”。由于它的工作方式(函數調用觸發),在 for{} 的情況下并不會發生搶占,如果沒有函數調用,即使設置了搶占標志,也不會進行該標志的檢查。

Go1.14 引入搶占式調度(使用信號的異步搶占機制),sysmon 仍然會檢測到運行了 10ms 以上的 G(goroutine)。然后,sysmon 向運行 G 的 P 發送信號(SIGURG)。Go 的信號處理程序會調用P上的一個叫作 gsignal 的 goroutine 來處理該信號,將其映射到 M 而不是 G,并使其檢查該信號。gsignal 看到搶占信號,停止正在運行的 G。

在滿足條件時觸發垃圾收集回收內存;

打印調度信息,歸還內存等定時任務。

轉自:bert.li@ximalaya.com

qiankunli.github.io/2020/11/21/goroutine_system_call.html

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • go語言
    +關注

    關注

    1

    文章

    158

    瀏覽量

    9290

原文標題:Golang 系統調用與阻塞處理

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    如何借助大語言模型打造人工智能生態系統

    語言模型(LLMs)正以革命性的姿態重塑我們與科技的互動模式。然而,由于其龐大的規模,它們往往屬于資源密集型范疇,不僅大幅推高了成本,還造成了能源消耗的激增。本文深入剖析了大語言
    的頭像 發表于 04-27 09:19 ?462次閱讀
    如何借助大<b class='flag-5'>語言</b><b class='flag-5'>模型</b>打造人工智能生態系統

    一文詳解視覺語言模型

    視覺語言模型(VLM)是一種多模態、生成式 AI 模型,能夠理解和處理視頻、圖像和文本。
    的頭像 發表于 02-12 11:13 ?1524次閱讀
    一文<b class='flag-5'>詳解</b>視覺<b class='flag-5'>語言</b><b class='flag-5'>模型</b>

    語言模型管理的作用

    要充分發揮語言模型的潛力,有效的語言模型管理非常重要。以下,是對語言模型管理作用的分析,由AI部
    的頭像 發表于 01-02 11:06 ?332次閱讀

    語言模型開發框架是什么

    語言模型開發框架是指用于訓練、推理和部署大型語言模型的軟件工具和庫。下面,AI部落小編為您介紹大語言
    的頭像 發表于 12-06 10:28 ?473次閱讀

    語言模型開發語言是什么

    在人工智能領域,大語言模型(Large Language Models, LLMs)背后,離不開高效的開發語言和工具的支持。下面,AI部落小編為您介紹大語言
    的頭像 發表于 12-04 11:44 ?600次閱讀

    云端語言模型開發方法

    云端語言模型的開發是一個復雜而系統的過程,涉及數據準備、模型選擇、訓練優化、部署應用等多個環節。下面,AI部落小編為您分享云端語言模型的開發
    的頭像 發表于 12-02 10:48 ?616次閱讀

    在學習go語言的過程踩過的坑

    作為一個5年的phper,這兩年公司和個人都在順應技術趨勢,新項目慢慢從php轉向了go語言,從2021年到現在,筆者手上也先后開發了兩個go項目。在學習go
    的頭像 發表于 11-11 09:22 ?410次閱讀

    語言模型如何開發

    語言模型的開發是一個復雜且細致的過程,涵蓋了數據準備、模型架構設計、訓練、微調和部署等多個階段。以下是對大語言模型開發步驟的介紹,由AI部
    的頭像 發表于 11-04 10:14 ?540次閱讀

    go語言如何解決并發問題

    作為一個后端開發,日常工作中接觸最多的兩門語言就是PHP和GO了。無可否認,PHP確實是最好的語言(手動狗頭哈哈),寫起來真的很舒爽,沒有任何心智負擔,字符串和整型壓根就不用區分,開發速度真的是比
    的頭像 發表于 10-23 13:38 ?427次閱讀
    <b class='flag-5'>go</b><b class='flag-5'>語言</b>如何解決并發問題

    三十分鐘入門基礎Go Java小子版

    前言 Go語言定義 Go(又稱 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 開發的一種靜態、強類型、編譯型語言
    的頭像 發表于 08-12 14:32 ?944次閱讀
    三十分鐘入門基礎<b class='flag-5'>Go</b> Java小子版

    【《大語言模型應用指南》閱讀體驗】+ 基礎知識學習

    今天來學習大語言模型在自然語言理解方面的原理以及問答回復實現。 主要是基于深度學習和自然語言處理技術。 大語言
    發表于 08-02 11:03

    【《大語言模型應用指南》閱讀體驗】+ 基礎篇

    今天開始學習《大語言模型應用指南》第一篇——基礎篇,對于人工智能相關專業技術人員應該可以輕松加愉快的完成此篇閱讀,但對于我還是有許多的知識點、專業術語比較陌生,需要網上搜索學習更多的資料才能理解書中
    發表于 07-25 14:33

    【《大語言模型應用指南》閱讀體驗】+ 俯瞰全書

    上周收到《大語言模型應用指南》一書,非常高興,但工作項目繁忙,今天才品鑒體驗,感謝作者編寫了一部內容豐富、理論應用相結合、印刷精美的著作,也感謝電子發燒友論壇提供了一個讓我了解大語言模型
    發表于 07-21 13:35

    語言模型的預訓練

    隨著人工智能技術的飛速發展,自然語言處理(NLP)作為人工智能領域的一個重要分支,取得了顯著的進步。其中,大語言模型(Large Language Model, LLM)憑借其強大的語言
    的頭像 發表于 07-11 10:11 ?900次閱讀

    如何加速大語言模型推理

    隨著人工智能技術的飛速發展,大語言模型(LLM)已成為自然語言處理領域的核心工具,廣泛應用于智能客服、文本生成、機器翻譯等多個場景。然而,大語言模型
    的頭像 發表于 07-04 17:32 ?954次閱讀
    主站蜘蛛池模板: 天天操夜夜摸 | 欧美综合国产精品日韩一 | 天天操精品视频 | 天天射天天操天天 | 高h肉肉视频在线播放观看 高黄视频 | 黄色三级在线看 | 精品少妇一区二区三区视频 | 色偷偷资源网 | 欧美一级黄色片在线观看 | 你懂的免费 | 日本特黄特色免费大片 | 国产高清免费午夜在线视频 | 午夜免费片在线观看不卡 | 成人久久久久久 | 天天狠天天透 | 天天摸日日摸 | 免费我看视频在线观看 | 手机在线观看一级午夜片 | 永久免费观看午夜视频在线 | 女性一级全黄生活片在线播放 | 日韩在线三级视频 | 国内精品久久久久影 | 一级片aaaa| 性欧美f| 欧美色视频日本片免费高清 | 日本污视频在线观看 | 日韩特级 | 亚洲五月婷| 国产乱辈通伦影片在线播放 | 在线 | 一区二区三区 | 性欧美精品久久久久久久 | 91大神大战高跟丝袜美女 | 人人艹在线观看 | 788gao这里只有精品 | 天天爽夜夜爽人人爽曰喷水 | 久久国产精品夜色 | 日日干天天干 | 怡红院最新网址 | 欧美最猛黑人xxxx黑人猛交黄 | 天天天天天天天操 | 日韩亚洲欧美日本精品va |