chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳解剖析Go語言調(diào)度模型的設(shè)計(jì)

馬哥Linux運(yùn)維 ? 來源:愛戶外的程序猿 ? 作者:愛戶外的程序猿 ? 2021-07-26 10:12 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

golang的MPG調(diào)度模型是保障Go語言效率高的一個(gè)重要特性,本文詳細(xì)介紹了Go語言調(diào)度模型的設(shè)計(jì)。

前言

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 系統(tǒng)上運(yùn)行的程序最終都會(huì)通過 C 系統(tǒng)調(diào)用來和內(nèi)核打交道。

用其他語言編寫程序進(jìn)行系統(tǒng)調(diào)用,方法不外乎兩個(gè):一是自己封裝,二是依賴 glibc、或者其他的運(yùn)行庫。Go 語言選擇了前者,把系統(tǒng)調(diào)用都封裝到了 syscall 包。封裝時(shí)也同樣得通過匯編實(shí)現(xiàn)。

異步系統(tǒng)調(diào)用 G 會(huì)和MP分離(G掛到netpoller),同步系統(tǒng)調(diào)用 GM 會(huì)和P分離(P另尋M),生動(dòng)的說明了GPM相對(duì)GM的精妙之處。

阻塞

在 Go 里面阻塞主要分為以下 4 種場(chǎng)景:

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

由于網(wǎng)絡(luò)請(qǐng)求和 IO 操作導(dǎo)致 Goroutine 阻塞。Go 程序提供了網(wǎng)絡(luò)輪詢器(NetPoller)來處理網(wǎng)絡(luò)請(qǐng)求和 IO 操作的問題,其后臺(tái)通過 kqueue(MacOS),epoll(Linux)或 iocp(Windows)來實(shí)現(xiàn) IO 多路復(fù)用。通過使用 NetPoller 進(jìn)行網(wǎng)絡(luò)系統(tǒng)調(diào)用,調(diào)度器可以防止 Goroutine 在進(jìn)行這些系統(tǒng)調(diào)用時(shí)阻塞 M。

這可以讓 M 執(zhí)行 P 的 LRQ 中其他的 Goroutines,而不需要?jiǎng)?chuàng)建新的 M。執(zhí)行網(wǎng)絡(luò)系統(tǒng)調(diào)用不需要額外的 M,網(wǎng)絡(luò)輪詢器使用系統(tǒng)線程,它時(shí)刻處理一個(gè)有效的事件循環(huán),有助于減少操作系統(tǒng)上的調(diào)度負(fù)載。

用戶層眼中看到的 Goroutine 中的“block socket”,實(shí)現(xiàn)了 goroutine-per-connection 簡(jiǎn)單的網(wǎng)絡(luò)編程模式。實(shí)際上是通過 Go runtime 中的 netpoller 通過 Non-block socket + I/O 多路復(fù)用機(jī)制“模擬”出來的。

當(dāng)調(diào)用一些系統(tǒng)方法的時(shí)候(如文件 I/O),如果系統(tǒng)方法調(diào)用的時(shí)候發(fā)生阻塞,這種情況下,網(wǎng)絡(luò)輪詢器(NetPoller)無法使用,而進(jìn)行系統(tǒng)調(diào)用的 G1 將阻塞當(dāng)前 M1。調(diào)度器引入 其它M 來服務(wù) M1 的P。

如果在 Goroutine 去執(zhí)行一個(gè) sleep 操作,導(dǎo)致 M 被阻塞了。Go 程序后臺(tái)有一個(gè)監(jiān)控線程 sysmon,它監(jiān)控那些長(zhǎng)時(shí)間運(yùn)行的 G 任務(wù)然后設(shè)置可以強(qiáng)占的標(biāo)識(shí)符,別的 Goroutine 就可以搶先進(jìn)來執(zhí)行。

系統(tǒng)調(diào)用

Go 語言通過 Syscall 和 Rawsyscall 等使用匯編語言編寫的方法封裝了操作系統(tǒng)提供的所有系統(tǒng)調(diào)用,其中 Syscall 在 Linux 386 上的實(shí)現(xiàn)如下:

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 - 調(diào)度剖析 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.

異步系統(tǒng)調(diào)用

通過使用網(wǎng)絡(luò)輪詢器進(jìn)行網(wǎng)絡(luò)系統(tǒng)調(diào)用,調(diào)度器可以防止 Goroutine 在進(jìn)行這些系統(tǒng)調(diào)用時(shí)阻塞M。這可以讓M執(zhí)行P的 LRQ 中其他的 Goroutines,而不需要?jiǎng)?chuàng)建新的M。有助于減少操作系統(tǒng)上的調(diào)度負(fù)載。

G1正在M上執(zhí)行,還有 3 個(gè) Goroutine 在 LRQ 上等待執(zhí)行

接下來,G1想要進(jìn)行網(wǎng)絡(luò)系統(tǒng)調(diào)用,因此它被移動(dòng)到網(wǎng)絡(luò)輪詢器并且處理異步網(wǎng)絡(luò)系統(tǒng)調(diào)用。然后,M可以從 LRQ 執(zhí)行另外的 Goroutine。

最后:異步網(wǎng)絡(luò)系統(tǒng)調(diào)用由網(wǎng)絡(luò)輪詢器完成,G1被移回到P的 LRQ 中。一旦G1可以在M上進(jìn)行上下文切換,它負(fù)責(zé)的 Go 相關(guān)代碼就可以再次執(zhí)行。

同步系統(tǒng)調(diào)用

G1將進(jìn)行同步系統(tǒng)調(diào)用以阻塞M1

調(diào)度器介入后:識(shí)別出G1已導(dǎo)致M1阻塞,此時(shí),調(diào)度器將M1與P分離,同時(shí)也將G1帶走。然后調(diào)度器引入新的M2來服務(wù)P。

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

阻塞的系統(tǒng)調(diào)用完成后:G1可以移回 LRQ 并再次由P執(zhí)行。如果這種情況需要再次發(fā)生,M1將被放在旁邊以備將來使用。

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

sysmon 協(xié)程

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

在 linux 內(nèi)核中有一些執(zhí)行定時(shí)任務(wù)的線程, 比如定時(shí)寫回臟頁的 pdflush, 定期回收內(nèi)存的 kswapd0, 以及每個(gè) cpu 上都有一個(gè)負(fù)責(zé)負(fù)載均衡的 migration 線程等。在 go 運(yùn)行時(shí)中也有類似的協(xié)程 sysmon. sysmon 運(yùn)行在 M,且不需要 P。它會(huì)每隔一段時(shí)間檢查 Go 語言runtime,確保程序沒有進(jìn)入異常狀態(tài)。

系統(tǒng)監(jiān)控的觸發(fā)時(shí)間就會(huì)穩(wěn)定在 10ms,功能比較多:

檢查死鎖runtime.checkdead

運(yùn)行計(jì)時(shí)器 — 獲取下一個(gè)需要被觸發(fā)的計(jì)時(shí)器;

定時(shí)從 netpoll 中獲取 ready 的協(xié)程

Go 的搶占式調(diào)度

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

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

在滿足條件時(shí)觸發(fā)垃圾收集回收內(nèi)存;

打印調(diào)度信息,歸還內(nèi)存等定時(shí)任務(wù)。

轉(zhuǎn)自:bert.li@ximalaya.com

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

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • go語言
    +關(guān)注

    關(guān)注

    1

    文章

    159

    瀏覽量

    9625

原文標(biāo)題:Golang 系統(tǒng)調(diào)用與阻塞處理

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    3萬字長(zhǎng)文!深度解析大語言模型LLM原理

    我們正在參加全球電子成就獎(jiǎng)的評(píng)選,歡迎大家?guī)臀覀兺镀薄x謝支持本文轉(zhuǎn)自:騰訊技術(shù)工程作者:royceshao大語言模型LLM的精妙之處在于很好地利用數(shù)學(xué)解決了工業(yè)場(chǎng)景的問題,筆者基于過往工程經(jīng)驗(yàn)
    的頭像 發(fā)表于 09-02 13:34 ?3075次閱讀
    3萬字長(zhǎng)文!深度解析大<b class='flag-5'>語言</b><b class='flag-5'>模型</b>LLM原理

    【VisionFive 2單板計(jì)算機(jī)試用體驗(yàn)】3、開源大語言模型部署

    的系統(tǒng)和芯片架構(gòu)。 3、拉取/運(yùn)行大語言模型 ollama的使用方法和docker很像。 返回到ollama的編譯路徑,找到ollama可執(zhí)行文件 執(zhí)行 ./ollama run qwen3:0.6b
    發(fā)表于 07-19 15:45

    鴻蒙中Stage模型與FA模型詳解

    【HarmonyOS 5】鴻蒙中Stage模型與FA模型詳解 ##鴻蒙開發(fā)能力 ##HarmonyOS SDK應(yīng)用服務(wù)##鴻蒙金融類應(yīng)用 (金融理財(cái)# 一、前言 在HarmonyOS 5的應(yīng)用開發(fā)
    的頭像 發(fā)表于 07-07 11:50 ?629次閱讀

    深度剖析 RT-Thread 線程調(diào)度流程

    RT-Thread調(diào)度第一個(gè)線程的主要流程分如下:rtthread_startup:RTT的啟動(dòng)函數(shù),主要負(fù)責(zé)板級(jí)驅(qū)動(dòng),調(diào)度器,系統(tǒng)線程初始化,啟動(dòng)調(diào)度的工作
    的頭像 發(fā)表于 06-25 18:24 ?1437次閱讀
    深度<b class='flag-5'>剖析</b> RT-Thread 線程<b class='flag-5'>調(diào)度</b>流程

    歐洲借助NVIDIA Nemotron優(yōu)化主權(quán)大語言模型

    NVIDIA 正攜手歐洲和中東的模型構(gòu)建商與云提供商,共同優(yōu)化主權(quán)大語言模型 (LLM),加速該地區(qū)各行業(yè)采用企業(yè)級(jí) AI。
    的頭像 發(fā)表于 06-12 15:42 ?925次閱讀

    小白學(xué)大模型:從零實(shí)現(xiàn) LLM語言模型

    在當(dāng)今人工智能領(lǐng)域,大型語言模型(LLM)的開發(fā)已經(jīng)成為一個(gè)熱門話題。這些模型通過學(xué)習(xí)大量的文本數(shù)據(jù),能夠生成自然語言文本,完成各種復(fù)雜的任務(wù),如寫作、翻譯、問答等。https
    的頭像 發(fā)表于 04-30 18:34 ?1062次閱讀
    小白學(xué)大<b class='flag-5'>模型</b>:從零實(shí)現(xiàn) LLM<b class='flag-5'>語言</b><b class='flag-5'>模型</b>

    如何借助大語言模型打造人工智能生態(tài)系統(tǒng)

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

    從 Java 到 Go:面向?qū)ο蟮木奕伺c云原生的輕騎兵

    Go 語言在 2009 年被 Google 推出,在創(chuàng)建之初便明確提出了“少即是多(Less is more)”的設(shè)計(jì)原則,強(qiáng)調(diào)“以工程效率為核心,用極簡(jiǎn)規(guī)則解決復(fù)雜問題”。它與 Java 語言生態(tài)
    的頭像 發(fā)表于 04-25 11:13 ?508次閱讀

    ?VLM(視覺語言模型)?詳細(xì)解析

    視覺語言模型(Visual Language Model, VLM)是一種結(jié)合視覺(圖像/視頻)和語言(文本)處理能力的多模態(tài)人工智能模型,能夠理解并生成與視覺內(nèi)容相關(guān)的自然
    的頭像 發(fā)表于 03-17 15:32 ?7580次閱讀
    ?VLM(視覺<b class='flag-5'>語言</b><b class='flag-5'>模型</b>)?詳細(xì)解析

    小白學(xué)大模型:訓(xùn)練大語言模型的深度指南

    在當(dāng)今人工智能飛速發(fā)展的時(shí)代,大型語言模型(LLMs)正以其強(qiáng)大的語言理解和生成能力,改變著我們的生活和工作方式。在最近的一項(xiàng)研究中,科學(xué)家們?yōu)榱松钊肓私馊绾胃咝У赜?xùn)練大型語言
    的頭像 發(fā)表于 03-03 11:51 ?1210次閱讀
    小白學(xué)大<b class='flag-5'>模型</b>:訓(xùn)練大<b class='flag-5'>語言</b><b class='flag-5'>模型</b>的深度指南

    語言模型的解碼策略與關(guān)鍵優(yōu)化總結(jié)

    本文系統(tǒng)性地闡述了大型語言模型(LargeLanguageModels,LLMs)中的解碼策略技術(shù)原理及其實(shí)踐應(yīng)用。通過深入分析各類解碼算法的工作機(jī)制、性能特征和優(yōu)化方法,為研究者和工程師提供了全面
    的頭像 發(fā)表于 02-18 12:00 ?1072次閱讀
    大<b class='flag-5'>語言</b><b class='flag-5'>模型</b>的解碼策略與關(guān)鍵優(yōu)化總結(jié)

    一文詳解視覺語言模型

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

    騰訊公布大語言模型訓(xùn)練新專利

    近日,騰訊科技(深圳)有限公司公布了一項(xiàng)名為“大語言模型的訓(xùn)練方法、裝置、計(jì)算機(jī)設(shè)備及存儲(chǔ)介質(zhì)”的新專利。該專利的公布,標(biāo)志著騰訊在大語言模型訓(xùn)練領(lǐng)域取得了新的突破。 據(jù)專利摘要顯示,
    的頭像 發(fā)表于 02-10 09:37 ?715次閱讀

    語言模型管理的作用

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

    AI大語言模型開發(fā)步驟

    開發(fā)一個(gè)高效、準(zhǔn)確的大語言模型是一個(gè)復(fù)雜且多階段的過程,涉及數(shù)據(jù)收集與預(yù)處理、模型架構(gòu)設(shè)計(jì)、訓(xùn)練與優(yōu)化、評(píng)估與調(diào)試等多個(gè)環(huán)節(jié)。接下來,AI部落小編為大家詳細(xì)闡述AI大語言
    的頭像 發(fā)表于 12-19 11:29 ?1216次閱讀