精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

深入解析 Go 語言 GMP 模型:并發(fā)編程的核心機(jī)制

開發(fā) 前端
為了解決單進(jìn)程時(shí)代的效率問題,引入了多進(jìn)程和多線程并發(fā)模型。在這種模型中,當(dāng)一個(gè)進(jìn)程阻塞時(shí),CPU可以切換到另一個(gè)準(zhǔn)備好的進(jìn)程繼續(xù)執(zhí)行。這樣可以充分利用CPU資源,提高系統(tǒng)的并發(fā)處理能力。

在閱讀本文前,先帶著以下幾個(gè)關(guān)于GMP模型的面試題目進(jìn)行思考,以加深理解和掌握:

  1. 什么是GMP模型?請(qǐng)解釋其基本概念。
  • 回答要點(diǎn):解釋G、M、P的概念及其在調(diào)度模型中的角色。
  1. 如何理解GMP模型中線程的內(nèi)核態(tài)和用戶態(tài)?
  • 回答要點(diǎn):區(qū)分內(nèi)核態(tài)線程和用戶態(tài)線程,并說明它們?cè)贕MP模型中的作用。
  1. Go語言中的Goroutine與線程的映射關(guān)系是怎樣的?為什么選擇這種映射方式?
  • 回答要點(diǎn):解釋Goroutine與線程的多對(duì)多映射關(guān)系及其優(yōu)點(diǎn)。
  1. GMP模型如何解決線程調(diào)度中的鎖競爭問題?
  • 回答要點(diǎn):介紹全局隊(duì)列和本地隊(duì)列的使用,以及G的分配機(jī)制。
  1. GMP模型中的Stealing機(jī)制是什么?它如何工作?
  • 回答要點(diǎn):描述Stealing機(jī)制的原理及其在Goroutine調(diào)度中的應(yīng)用。
  1. 什么是Hand off機(jī)制?在什么情況下會(huì)使用該機(jī)制?
  • 回答要點(diǎn):解釋Hand off機(jī)制及其在阻塞和系統(tǒng)調(diào)用中的應(yīng)用。
  1. 如何理解GMP模型中的搶占式調(diào)度?它解決了哪些問題?
  • 回答要點(diǎn):說明搶占式調(diào)度的原理及其在防止協(xié)程餓死中的作用。
  1. 什么是G0和M0?它們?cè)贕MP模型中扮演什么角色?
  • 回答要點(diǎn):描述G0和M0的定義及其在Goroutine調(diào)度中的功能。
  1. 請(qǐng)?jiān)敿?xì)說明GMP模型中的調(diào)度策略。
  • 回答要點(diǎn):逐步解釋Goroutine的創(chuàng)建、喚醒、偷取、切換、自旋、系統(tǒng)調(diào)用和阻塞處理策略。
  1. 如何在實(shí)際項(xiàng)目中調(diào)優(yōu)GMP調(diào)度模型?
  • 回答要點(diǎn):討論如何通過調(diào)整GOMAXPROCS等參數(shù)來優(yōu)化調(diào)度性能。

帶著這些問題閱讀本文,可以幫助你更系統(tǒng)地掌握GMP模型的核心概念和調(diào)度機(jī)制,提高面試中的應(yīng)答能力。

單進(jìn)程時(shí)代

基本概念

在單進(jìn)程時(shí)代,一個(gè)進(jìn)程就是一個(gè)運(yùn)行中的程序。計(jì)算機(jī)系統(tǒng)在執(zhí)行程序時(shí),會(huì)從頭到尾依次執(zhí)行完一個(gè)程序,然后再執(zhí)行下一個(gè)程序。在這種模型中,不需要復(fù)雜的調(diào)度機(jī)制,因?yàn)橹挥幸粋€(gè)執(zhí)行流程。

面臨的兩個(gè)問題

  1. 單一執(zhí)行流程:由于只能一個(gè)個(gè)執(zhí)行程序,無法同時(shí)處理多個(gè)任務(wù),這大大限制了CPU的利用率。
  2. 進(jìn)程阻塞:當(dāng)一個(gè)進(jìn)程遇到I/O操作等阻塞情況時(shí),CPU資源會(huì)被浪費(fèi),等待進(jìn)程完成阻塞操作后再繼續(xù)執(zhí)行,導(dǎo)致效率低下。

多進(jìn)程/線程并發(fā)時(shí)代

基本概念

為了解決單進(jìn)程時(shí)代的效率問題,引入了多進(jìn)程和多線程并發(fā)模型。在這種模型中,當(dāng)一個(gè)進(jìn)程阻塞時(shí),CPU可以切換到另一個(gè)準(zhǔn)備好的進(jìn)程繼續(xù)執(zhí)行。這樣可以充分利用CPU資源,提高系統(tǒng)的并發(fā)處理能力。

兩個(gè)問題

  1. 高開銷:進(jìn)程擁有大量資源,進(jìn)程的創(chuàng)建、切換和銷毀都需要消耗大量的時(shí)間和資源。這導(dǎo)致CPU很大一部分時(shí)間都在處理進(jìn)程調(diào)度,而不是實(shí)際的任務(wù)執(zhí)行。
  2. 高內(nèi)存占用:在32位機(jī)器下,進(jìn)程的虛擬內(nèi)存占用為4GB,線程占用為4MB。大量的線程和進(jìn)程會(huì)導(dǎo)致高內(nèi)存消耗,限制了系統(tǒng)的擴(kuò)展性。

協(xié)程的引入

為了解決多進(jìn)程和多線程帶來的高開銷和高內(nèi)存占用問題,引入了協(xié)程(Coroutine)。協(xié)程是一種比線程更輕量級(jí)的執(zhí)行單元。協(xié)程在用戶態(tài)進(jìn)行調(diào)度,避免了頻繁的上下文切換帶來的開銷。Go語言的GMP模型正是基于協(xié)程的設(shè)計(jì)。

協(xié)程的基本概念

在深入了解Goroutine之前,先來了解一下協(xié)程(Coroutine)的基本概念。

內(nèi)核態(tài)和用戶態(tài)

  • 內(nèi)核態(tài)線程:由操作系統(tǒng)管理和調(diào)度,CPU只負(fù)責(zé)處理內(nèi)核態(tài)線程。
  • 用戶態(tài)線程:由用戶程序管理,需綁定到內(nèi)核態(tài)線程上執(zhí)行,協(xié)程即為用戶態(tài)線程的一種。

圖片圖片

內(nèi)核態(tài)和用戶態(tài)線程關(guān)系圖

  • Kernel Space(內(nèi)核空間):上半部分的灰色區(qū)域,表示操作系統(tǒng)管理的內(nèi)核空間。
  • User Space(用戶空間):下半部分的白色區(qū)域,表示用戶程序運(yùn)行的空間。
  • Kernel Thread 1 和 Kernel Thread 2(內(nèi)核線程):由操作系統(tǒng)管理的內(nèi)核線程,CPU直接處理這些線程。
  • User Thread 1、User Thread 2 和 User Thread 3(用戶線程):由用戶程序管理的用戶線程(協(xié)程),需綁定到內(nèi)核線程上執(zhí)行。

執(zhí)行流程

  1. 用戶態(tài)線程:
  • 用戶程序創(chuàng)建多個(gè)用戶線程(如協(xié)程),如圖中的“User Thread 1”、“User Thread 2”和“User Thread 3”。
  1. 內(nèi)核態(tài)線程:
  • 用戶線程需綁定到內(nèi)核態(tài)線程上執(zhí)行,如圖中的“Kernel Thread 1”和“Kernel Thread 2”。

  1. CPU處理:

  • CPU只處理內(nèi)核態(tài)線程,通過綁定關(guān)系,用戶態(tài)線程的執(zhí)行也依賴于內(nèi)核態(tài)線程的調(diào)度。

  • 圖中的紅色箭頭表示CPU正在處理內(nèi)核線程,從而間接處理綁定的用戶線程。

線程和協(xié)程的映射關(guān)系

  1. 單線程綁定所有協(xié)程:

問題1:無法利用多核CPU的能力。

問題2:如果某個(gè)協(xié)程阻塞,整個(gè)線程和進(jìn)程都將阻塞,導(dǎo)致其他協(xié)程無法執(zhí)行,喪失并發(fā)能力。

  1. 一對(duì)一映射:

將每個(gè)協(xié)程綁定到一個(gè)線程上,退回到多進(jìn)程/線程的模式,協(xié)程的創(chuàng)建、切換、銷毀均需CPU完成,效率低下。

  1. 多對(duì)多映射:

允許多個(gè)協(xié)程綁定到多個(gè)線程上,形成M:N的關(guān)系。這樣可以充分利用多核CPU,并通過協(xié)程調(diào)度器高效管理協(xié)程的執(zhí)行。

圖片圖片

Goroutine

Goroutine是Go語言中的協(xié)程,實(shí)現(xiàn)了輕量級(jí)并發(fā)。與傳統(tǒng)的線程相比,Goroutine具有以下顯著特點(diǎn):

輕量級(jí)

Goroutine非常輕量,初始化時(shí)僅占用幾KB的棧內(nèi)存,并且棧內(nèi)存可以根據(jù)需要?jiǎng)討B(tài)伸縮。這使得我們可以在Go程序中創(chuàng)建成千上萬個(gè)Goroutine,而不會(huì)消耗過多的系統(tǒng)資源。

高效調(diào)度

Goroutine的調(diào)度由Go語言的運(yùn)行時(shí)(runtime)負(fù)責(zé),而不是操作系統(tǒng)。Go運(yùn)行時(shí)在用戶態(tài)進(jìn)行調(diào)度,避免了頻繁的上下文切換帶來的開銷,使得調(diào)度更加高效。

Goroutine的使用示例

下面是一個(gè)簡單的示例,展示了如何在Go語言中使用Goroutine進(jìn)行并發(fā)編程。

package main

import (
    "fmt"
    "time"
)

func say(s string) {
    for i := 0; i < 5; i++ {
        time.Sleep(100 * time.Millisecond)
        fmt.Println(s)
    }
}

func main() {
    go say("Hello")
    go say("World")
    time.Sleep(1 * time.Second)
    fmt.Println("Done")
}

在這個(gè)示例中,兩個(gè)Goroutine同時(shí)執(zhí)行,分別打印"Hello"和"World"。通過使用go關(guān)鍵字,我們可以輕松地啟動(dòng)一個(gè)新的Goroutine。

需要注意的事項(xiàng)

  1. 主Goroutine的結(jié)束:在Go程序中,main函數(shù)本身也是一個(gè)Goroutine,稱為主Goroutine。當(dāng)主Goroutine結(jié)束時(shí),所有其他Goroutine也會(huì)隨之終止。因此,需要確保主Goroutine等待所有子Goroutine執(zhí)行完畢。
  2. 同步和共享數(shù)據(jù):雖然Goroutine之間共享內(nèi)存空間,但需要通過同步機(jī)制(如通道和鎖)來避免競爭條件。Go語言推薦使用通道(channel)進(jìn)行Goroutine之間的通信,以保證數(shù)據(jù)的安全性和同步性。

示例:使用通道進(jìn)行同步

下面的示例展示了如何使用通道來同步多個(gè)Goroutine的執(zhí)行。

package main

import (
    "fmt"
    "sync"
)

func worker(id int, wg *sync.WaitGroup) {
    defer wg.Done()
    fmt.Printf("Worker %d starting\n", id)
    // 模擬工作
    fmt.Printf("Worker %d done\n", id)
}

func main() {
    var wg sync.WaitGroup

    for i := 1; i <= 5; i++ {
        wg.Add(1)
        go worker(i, &wg)
    }

    wg.Wait()
    fmt.Println("All workers done")
}

在這段代碼中,使用sync.WaitGroup來同步多個(gè)Goroutine。主Goroutine啟動(dòng)多個(gè)子Goroutine并等待它們完成,每個(gè)子Goroutine在完成任務(wù)后調(diào)用wg.Done()減少計(jì)數(shù),主Goroutine調(diào)用wg.Wait()阻塞等待所有子Goroutine完成。

執(zhí)行流程

  1. 主Goroutine啟動(dòng)多個(gè)子Goroutine(Goroutine 1、2、3)。
  2. 各個(gè)Goroutine并發(fā)執(zhí)行它們的任務(wù)。
  3. 每個(gè)Goroutine在完成任務(wù)后,向通道發(fā)送信號(hào)表示已完成。
  4. 主Goroutine通過通道接收所有子Goroutine的完成信號(hào),然后繼續(xù)執(zhí)行。

圖片圖片

Goroutine執(zhí)行與同步流程圖

這張圖展示了多個(gè)Goroutine同時(shí)執(zhí)行的流程以及如何通過通道(Channel)進(jìn)行同步。

  • Goroutine 1、2、3:代表多個(gè)并發(fā)執(zhí)行的Goroutine,分別標(biāo)記為“Goroutine 1”、“Goroutine 2”和“Goroutine 3”。
  • Main Goroutine:主Goroutine,它負(fù)責(zé)啟動(dòng)其他Goroutine并等待它們完成。
  • Channel:用于同步Goroutine的通道。

關(guān)于waitgroup我會(huì)在下一章節(jié)中進(jìn)行詳細(xì)講解,歡迎訂閱我的頻道!在本實(shí)例代碼中大家了解使用即可。

Goroutine調(diào)度器

基本概念

在Go中,線程是運(yùn)行Goroutine的實(shí)體,而調(diào)度器的功能是將可運(yùn)行的Goroutine分配到工作線程上。Go語言采用了一種高效的Goroutine調(diào)度機(jī)制,使得程序能夠在多核處理器上高效運(yùn)行。

被廢棄的調(diào)度器

早期的調(diào)度器采用了簡單的設(shè)計(jì),存在多個(gè)缺陷:

  • 概念:用大寫的G表示協(xié)程,用大寫的M表示線程。
  • 問題:

鎖競爭:每個(gè)M(線程)想要執(zhí)行、放回G(協(xié)程)都必須訪問一個(gè)全局G隊(duì)列,因此對(duì)G的訪問需要加鎖以保證并發(fā)安全。當(dāng)有很多線程時(shí),鎖競爭激烈,影響系統(tǒng)性能。

局部性破壞:M轉(zhuǎn)移G會(huì)造成延遲和額外的系統(tǒng)負(fù)載。例如,當(dāng)一個(gè)G內(nèi)創(chuàng)建另一個(gè)G'時(shí),為了繼續(xù)執(zhí)行G,需要將G'交給另一個(gè)M'執(zhí)行,這會(huì)破壞程序的局部性。

系統(tǒng)開銷:CPU在線程之間頻繁切換導(dǎo)致頻繁的系統(tǒng)調(diào)用,增加了系統(tǒng)開銷。

GMP模型的設(shè)計(jì)思想

為了克服上述問題,Go引入了GMP模型:

  • 基本概念:

Go語言使用GMP模型來管理并發(fā)執(zhí)行。GMP模型由三個(gè)核心組件組成:G(Goroutine)、M(Machine)、P(Processor)。

G(Goroutine)

Goroutine是Go語言中的協(xié)程,代表一個(gè)獨(dú)立的執(zhí)行單元。Goroutine比線程更加輕量級(jí),啟動(dòng)一個(gè)Goroutine的開銷非常小。Goroutine的調(diào)度由Go運(yùn)行時(shí)在用戶態(tài)進(jìn)行。

M(Machine)

M代表操作系統(tǒng)的線程。M負(fù)責(zé)實(shí)際執(zhí)行Go代碼。一個(gè)M可以執(zhí)行多個(gè)Goroutine,但同一時(shí)間只能執(zhí)行一個(gè)Goroutine。M與操作系統(tǒng)的線程直接對(duì)應(yīng),Go運(yùn)行時(shí)通過M來利用多核CPU的并行計(jì)算能力。

P(Processor)

P代表執(zhí)行上下文(Processor)。P管理著可運(yùn)行的Goroutine隊(duì)列,并負(fù)責(zé)與M進(jìn)行綁定。P的數(shù)量決定了可以并行執(zhí)行的Goroutine的數(shù)量。Go運(yùn)行時(shí)會(huì)根據(jù)系統(tǒng)的CPU核數(shù)設(shè)置P的數(shù)量。

  • GMP模型的組成:
  • 全局G隊(duì)列:存放等待運(yùn)行的G。
  • P的本地G隊(duì)列:存放不超過256個(gè)G。當(dāng)新建協(xié)程時(shí)優(yōu)先將G存放到本地隊(duì)列,本地隊(duì)列滿了后將一半的G移動(dòng)到全局隊(duì)列。
  • M:內(nèi)核態(tài)線程,線程想要運(yùn)行協(xié)程需要先獲取一個(gè)P,從P的本地G隊(duì)列中獲取G。當(dāng)本地隊(duì)列為空時(shí),會(huì)嘗試從全局隊(duì)列或其他P的本地G列表中偷取G。
  • P列表:程序啟動(dòng)時(shí)創(chuàng)建GOMAXPROCS個(gè)P,并保存在數(shù)組中。
  • 調(diào)度器與OS調(diào)度器結(jié)合:Go的Goroutine調(diào)度器與操作系統(tǒng)調(diào)度器結(jié)合,OS調(diào)度器負(fù)責(zé)將線程分配給CPU執(zhí)行。

圖片圖片

設(shè)計(jì)策略

  • 復(fù)用線程的兩個(gè)策略:

Work Stealing機(jī)制:當(dāng)本線程沒有可執(zhí)行的G時(shí),優(yōu)先從全局G隊(duì)列中獲取一批G。如果全局隊(duì)列中沒有,則嘗試從其他P的G隊(duì)列中偷取G。

Hand Off機(jī)制:當(dāng)本線程因G進(jìn)行系統(tǒng)調(diào)用等阻塞時(shí),線程會(huì)釋放綁定的P,把P轉(zhuǎn)移給其他空閑的M執(zhí)行。

  • 利用并行:有GOMAXPROCS個(gè)P,則可以有同樣數(shù)量的線程并行執(zhí)行。
  • 搶占式調(diào)度:Goroutine是協(xié)作式的,一個(gè)協(xié)程只有讓出CPU才能讓下一個(gè)協(xié)程執(zhí)行,而Goroutine執(zhí)行超過10ms就會(huì)強(qiáng)制讓出CPU,防止其他協(xié)程餓死。
  • 特殊的G0和M0:
  • G0:每次啟動(dòng)一個(gè)M都會(huì)創(chuàng)建的第一個(gè)Goroutine,僅用于調(diào)度,不指向任何可執(zhí)行的函數(shù)。每個(gè)M都有一個(gè)自己的G0,在調(diào)度或系統(tǒng)調(diào)用時(shí)使用G0的棧空間。
  • M0:啟動(dòng)程序后的第一個(gè)主線程,負(fù)責(zé)執(zhí)行初始化操作和啟動(dòng)第一個(gè)Goroutine,此后與其他M一樣。

調(diào)度策略

  • 創(chuàng)建兩步:

通過go func()創(chuàng)建一個(gè)協(xié)程。

新創(chuàng)建的協(xié)程優(yōu)先保存在P的本地G隊(duì)列,如果本地隊(duì)列滿了,會(huì)將P本地隊(duì)列中的一半G打亂順序移入全局隊(duì)列。

圖片圖片

  • 喚醒獲取:

創(chuàng)建G時(shí)運(yùn)行的G會(huì)嘗試喚醒其他的PM組合去執(zhí)行。假設(shè)G2喚醒了M2,M2綁定了P2,但P2本地隊(duì)列沒有G,此時(shí)M2為自旋線程。M2便會(huì)嘗試從全局隊(duì)列中獲取G。

  • 偷取:
  • 假設(shè)P的本地隊(duì)列和全局隊(duì)列都空了,會(huì)從其他P偷取一半G到自己的本地隊(duì)列執(zhí)行。
  • 切換邏輯:
  • G1運(yùn)行完后,M上運(yùn)行的協(xié)程切換回G0,G0負(fù)責(zé)調(diào)度時(shí)協(xié)程的切換。先從P的本地隊(duì)列獲取G2,從G0切換到G2,從而實(shí)現(xiàn)M的復(fù)用。
  • 自旋:
  • 自旋線程會(huì)占用CPU時(shí)間,但創(chuàng)建銷毀線程也會(huì)消耗CPU時(shí)間,系統(tǒng)最多有GOMAXPROCS個(gè)自旋線程,其余的線程會(huì)在休眠M(jìn)隊(duì)列里。
  • 系統(tǒng)調(diào)用:
  • 當(dāng)G進(jìn)行系統(tǒng)調(diào)用時(shí)會(huì)進(jìn)入內(nèi)核態(tài)被阻塞,GM會(huì)綁定在一起進(jìn)行系統(tǒng)調(diào)用。M會(huì)釋放綁定的P,把P轉(zhuǎn)移給其他空閑的M執(zhí)行。當(dāng)系統(tǒng)調(diào)用結(jié)束時(shí),GM會(huì)嘗試獲取一個(gè)空閑的P。
  • 阻塞處理:
  • 當(dāng)G因channel或network I/O阻塞時(shí),不會(huì)阻塞M,當(dāng)超過10ms時(shí)M會(huì)尋找其他可運(yùn)行的G。
  • 公平性:
  • 調(diào)度器每調(diào)度61次時(shí),會(huì)嘗試從全局隊(duì)列里取出待運(yùn)行的Goroutine來運(yùn)行,如果沒有找到,就去其他P偷一些Goroutine來執(zhí)行。

GMP模型的優(yōu)勢

  1. 高效的資源利用:通過在用戶態(tài)進(jìn)行調(diào)度,避免了頻繁的上下文切換帶來的開銷,充分利用CPU資源。
  2. 輕量級(jí)并發(fā):Goroutine比線程更加輕量級(jí),可以啟動(dòng)大量的Goroutine而不會(huì)消耗大量內(nèi)存。
  3. 自動(dòng)調(diào)度:Go運(yùn)行時(shí)自動(dòng)管理Goroutine的調(diào)度,無需程序員手動(dòng)干預(yù),簡化了并發(fā)編程的復(fù)雜度。

面試題

如果問到了說一說GMP調(diào)度模型,建議需要說的內(nèi)容

在面試中,如果被問到GMP調(diào)度模型,建議全面地回答以下內(nèi)容。如果能完整且詳細(xì)地講述這些內(nèi)容,將會(huì)展示你對(duì)GMP調(diào)度模型的深刻理解和熟練掌握,這將是面試中的亮點(diǎn)。

基本概念

  1. 線程的內(nèi)核態(tài)和用戶態(tài):

線程分為“內(nèi)核態(tài)”和“用戶態(tài)”。用戶態(tài)線程即協(xié)程,必須綁定一個(gè)內(nèi)核態(tài)線程。CPU只負(fù)責(zé)處理內(nèi)核態(tài)線程。

  1. 調(diào)度器:

在Go中,線程是運(yùn)行Goroutine的實(shí)體。調(diào)度器的功能是將可運(yùn)行的Goroutine分配到工作線程上。

  1. 映射關(guān)系:

在Go語言中,線程與協(xié)程的映射關(guān)系是多對(duì)多的。這樣避免了多個(gè)協(xié)程對(duì)應(yīng)一個(gè)線程時(shí)出現(xiàn)的無法使用多核和并發(fā)的問題。Go的協(xié)程是協(xié)作式的,只有讓出CPU資源才能調(diào)度。如果一個(gè)協(xié)程阻塞,只有一個(gè)線程在運(yùn)行,其他協(xié)程也會(huì)被阻塞。

四個(gè)概念

  1. 全局隊(duì)列:

存放等待運(yùn)行的Goroutine。

  1. 本地隊(duì)列:

每個(gè)P(處理器)都有一個(gè)本地隊(duì)列,存放不超過256個(gè)Goroutine。新建協(xié)程時(shí)優(yōu)先放入本地隊(duì)列,本地隊(duì)列滿了則將一半的G移入全局隊(duì)列。

  1. GMP:

G:Goroutine,Go語言中的協(xié)程。

M:Machine,內(nèi)核態(tài)線程,運(yùn)行Goroutine的實(shí)體。

P:Processor,處理器,包含運(yùn)行Goroutine的資源和本地隊(duì)列。

設(shè)計(jì)策略

  1. 復(fù)用線程:

Stealing機(jī)制:當(dāng)一個(gè)線程沒有可執(zhí)行的G時(shí),會(huì)從全局隊(duì)列或其他P的本地隊(duì)列中偷取G來執(zhí)行。

Hand off機(jī)制:當(dāng)一個(gè)線程因G進(jìn)行系統(tǒng)調(diào)用等阻塞時(shí),線程會(huì)釋放綁定的P,把P轉(zhuǎn)移給其他空閑的M執(zhí)行。

  1. P并行:

有GOMAXPROCS個(gè)P,代表最多有這么多個(gè)線程并行執(zhí)行。

  1. 搶占式調(diào)度:

Goroutine執(zhí)行超過10ms就會(huì)強(qiáng)制讓出CPU,防止其他協(xié)程餓死。

  1. 特殊的G0和M0:

G0:每個(gè)M啟動(dòng)時(shí)創(chuàng)建的第一個(gè)Goroutine,僅用于調(diào)度,不執(zhí)行用戶代碼。每個(gè)M都有一個(gè)G0。

M0:程序啟動(dòng)后的第一個(gè)主線程,負(fù)責(zé)初始化操作和啟動(dòng)第一個(gè)Goroutine。

調(diào)度策略

  1. 創(chuàng)建:

通過go func()創(chuàng)建一個(gè)協(xié)程。新創(chuàng)建的協(xié)程優(yōu)先保存在P的本地G隊(duì)列,如果本地隊(duì)列滿了,會(huì)將P本地隊(duì)列中的一半G移入全局隊(duì)列。

  1. 喚醒:

創(chuàng)建G時(shí),當(dāng)前運(yùn)行的G會(huì)嘗試喚醒其他PM組合執(zhí)行。若喚醒的M綁定的P本地隊(duì)列為空,M會(huì)嘗試從全局隊(duì)列獲取G。

  1. 偷取:

如果P的本地隊(duì)列和全局隊(duì)列都為空,會(huì)從其他P偷取一半G到自己的本地隊(duì)列執(zhí)行。

  1. 切換:

G1運(yùn)行完后,M上運(yùn)行的Goroutine切換回G0,G0負(fù)責(zé)調(diào)度協(xié)程的切換。G0從P的本地隊(duì)列獲取G2,實(shí)現(xiàn)M的復(fù)用。

  1. 自旋:

自旋線程會(huì)占用CPU時(shí)間,但創(chuàng)建銷毀線程也消耗CPU時(shí)間。系統(tǒng)最多有GOMAXPROCS個(gè)自旋線程,其他線程在休眠M(jìn)隊(duì)列里。

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

當(dāng)G進(jìn)行系統(tǒng)調(diào)用時(shí)進(jìn)入內(nèi)核態(tài)被阻塞,M會(huì)釋放綁定的P,把P轉(zhuǎn)移給其他空閑的M執(zhí)行。當(dāng)系統(tǒng)調(diào)用結(jié)束,GM會(huì)嘗試獲取一個(gè)空閑的P。

  1. 阻塞處理:

當(dāng)G因channel或network I/O阻塞時(shí),不會(huì)阻塞M。超過10ms時(shí),M會(huì)尋找其他可運(yùn)行的G。

  1. 公平性:

調(diào)度器每調(diào)度61次時(shí),會(huì)嘗試從全局隊(duì)列中取出待運(yùn)行的Goroutine來運(yùn)行。如果沒有找到,就去其他P偷一些Goroutine來執(zhí)行。

責(zé)任編輯:武曉燕 來源: 王中陽
相關(guān)推薦

2024-09-02 09:00:59

2012-07-03 10:57:54

Hadoop核心機(jī)制

2024-02-21 12:14:00

Gochannel?panic?

2023-03-03 15:37:32

GMP 模型goroutine

2025-03-24 00:25:00

Go語言并發(fā)編程

2023-05-22 09:27:11

GMPGolang

2023-08-21 07:34:37

GolangGMP

2025-10-15 10:15:01

2023-02-10 09:40:36

Go語言并發(fā)

2011-12-15 09:33:19

Java

2024-06-19 10:08:34

GoChannel工具

2025-04-07 11:10:00

Python列表開發(fā)

2023-09-21 22:02:22

Go語言高級(jí)特性

2020-12-07 09:40:19

Future&Futu編程Java

2024-04-07 00:04:00

Go語言Map

2020-06-28 13:51:03

哈希map結(jié)構(gòu)

2021-09-30 09:21:28

Go語言并發(fā)編程

2022-10-17 08:07:13

Go 語言并發(fā)編程

2025-11-05 03:00:55

2024-12-18 21:37:24

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

69av在线播放| 日韩精品中文字幕一区二区三区| 日本精品二区| 尤物视频免费观看| 91精品国产91久久久久久密臀| 7777精品伊人久久久大香线蕉的 | 国产美女精品免费电影| 男人操女人的视频网站| 欧美日日夜夜| 制服丝袜av成人在线看| av在线播放亚洲| av电影在线观看一区二区三区| 国产精品影音先锋| 欧洲精品在线视频| 日日噜噜夜夜狠狠久久波多野| 精品无人区一区二区| 欧美午夜不卡在线观看免费| 国产91porn| 国产精品免费观看| 成人深夜视频在线观看| 国产精品久久久久久久一区探花| 久久亚洲av午夜福利精品一区| 国产99亚洲| 欧美va亚洲va国产综合| 91日韩视频在线观看| av丝袜在线| 亚洲人吸女人奶水| 日韩中文一区二区三区| 天堂网2014av| 国产在线视频不卡二| 国产成人久久久| 五月天婷婷丁香| 91精品国偷自产在线电影| 亚洲欧美色婷婷| 蜜臀av粉嫩av懂色av| 综合欧美精品| 日本道在线观看一区二区| 国产自产在线视频| 97caopor国产在线视频| 国产精品久久久久久妇女6080| 国产综合第一页| 国产后入清纯学生妹| 美国一区二区三区在线播放 | 亚洲欧美一区二区三区在线观看 | 欧美亚洲一二三区| 久草在线资源站资源站| 亚洲视频狠狠干| 亚洲综合视频一区| 成人精品一区二区三区校园激情| 91麻豆福利精品推荐| 国产v亚洲v天堂无码| 国产suv一区二区| 精品一区二区三区久久久| 国产精品久久久久高潮| 成人公开免费视频| 噜噜噜躁狠狠躁狠狠精品视频| 91精品国产精品| 男人的天堂一区| 在线国产欧美| 久久久欧美一区二区| 久久午夜无码鲁丝片午夜精品| 亚洲精品2区| 久久中文字幕国产| 国产一区二区精彩视频| 午夜精品婷婷| 欧美日韩xxx| 国产亚洲色婷婷久久99精品| 欧美日韩网址| 欧美—级高清免费播放| 久久久国产精品人人片| 亚洲经典视频在线观看| 69久久夜色精品国产69乱青草| 亚洲精品男人天堂| 久久激情综合| 国产精品美女在线| 最新中文字幕第一页| 久久精品国产亚洲高清剧情介绍 | 免费在线激情视频| 在线观看爽视频| 欧美怡红院视频| 色婷婷激情视频| **爰片久久毛片| 日韩av网站电影| 国产精品久久不卡| 加勒比久久综合| 久久九九精品99国产精品| 免费成年人视频在线观看| 一区二区亚洲精品| 日韩av免费一区| 亚洲图片视频小说| 大尺度一区二区| 就去色蜜桃综合| 天堂中文а√在线| 亚洲国产精品视频| 久久精品免费网站| 日韩中文字幕无砖| 亚洲免费精彩视频| 午夜三级在线观看| 在线视频日韩| 91在线观看免费观看| 欧美一级一区二区三区| 中文字幕成人av| 日韩a级黄色片| 视频在线日韩| 日韩精品影音先锋| 久久久久久久毛片| 欧美在线精品一区| 国产福利成人在线| 日本激情一区二区| 国产精品久久毛片| 欧美成人三级在线视频| 天天综合在线观看| 日韩精品视频在线播放| 顶臀精品视频www| 久久久精品日韩| 97se国产在线视频| 98在线视频| 欧美视频在线观看免费| 99精品视频国产| 精品视频免费| 91sa在线看| www.精品视频| 国产精品女同一区二区三区| 国产精品无码一区二区在线| 国色天香久久精品国产一区| 伊人亚洲福利一区二区三区| 日本在线视频免费| 国产精品一区一区三区| 亚洲激情电影在线| 国偷自产一区二区免费视频 | 无码人妻一区二区三区在线| 日本精品黄色| 国产成人精品免费视频| 图片区 小说区 区 亚洲五月| 亚洲欧洲综合另类| 欧美精品一二| 欧美精品久久久久久久久| 中文字幕在线观看视频一区| 94色蜜桃网一区二区三区| 欧美性受黑人性爽| 精品美女一区| 揄拍成人国产精品视频| 欧美精品韩国精品| 99精品国产99久久久久久白柏| 丰满人妻一区二区三区53号| 91精品亚洲一区在线观看| 尤物精品国产第一福利三区| jizz国产在线| 国产欧美精品一区二区色综合 | xxxwww国产| 国产综合婷婷| 国产99在线免费| 高清电影在线观看免费| 欧美va亚洲va香蕉在线| 久久久美女视频| 高清国产午夜精品久久久久久| 穿情趣内衣被c到高潮视频| 成人51免费| 久久国产精品免费视频| 国产视频一区二区三| 一区二区三区中文字幕精品精品| 亚洲精品成人在线播放| 亚洲久久久久| 91文字幕巨乱亚洲香蕉| 欧美hdxxxxx| 日韩不卡在线观看| www.国产毛片| 国产精品久久777777| 色呦色呦色精品| 欧美在线网址| 国产精品久久久久久久小唯西川| 久久亚洲导航| 日韩精品黄色网| 日韩国产成人在线| 中文一区一区三区高中清不卡| 亚洲三级在线观看视频| 亚洲精品一区二区妖精| 成人自拍视频网站| 交100部在线观看| 亚洲最新av在线| 一区二区不卡视频在线观看| 亚洲精品视频免费观看| 中文字幕人妻一区二区三区| 模特精品在线| 亚洲第一精品区| 国产另类在线| 国产成人综合一区二区三区| 国产黄色在线网站| 亚洲国产91色在线| 中文字幕 人妻熟女| 亚洲欧美日韩综合aⅴ视频| 美女露出粉嫩尿囗让男人桶| 裸体素人女欧美日韩| 在线看视频不卡| 久久悠悠精品综合网| 国产精品91视频| 在线中文字幕-区二区三区四区| 亚洲国产成人在线播放| 在线观看日批视频| 亚洲成在人线在线播放| 超薄肉色丝袜一二三| 不卡欧美aaaaa| 色天使在线观看| av成人黄色| 国产精品波多野结衣| 女同一区二区三区| 91网在线免费观看| a日韩av网址| 九色成人免费视频| av在线中文| 亚洲精品按摩视频| 国产精品高清无码| 精品福利视频导航| 亚洲天堂黄色片| 国产日韩欧美不卡在线| a级片在线观看视频| 精品一区二区三区免费播放| 少妇人妻互换不带套| 亚洲高清毛片| 久久免费看毛片| 国产欧美高清视频在线| 国产久一道中文一区| 国产激情综合| 国产日韩欧美另类| 国产精品扒开腿做爽爽爽视频软件| 欧美二区乱c黑人| 日本在线免费中文字幕| 亚洲网址你懂得| 深夜福利在线视频| 欧美精品一区二区久久婷婷| 国产免费av观看| 欧美日韩日日夜夜| 嫩草影院一区二区三区| 色女孩综合影院| 在线能看的av| 舔着乳尖日韩一区| 国产精品500部| 亚洲成av人片一区二区三区| 欧美日韩大片在线观看| 亚洲日本在线a| 欧美h片在线观看| 欧美国产日韩精品免费观看| 无码h肉动漫在线观看| 91视频.com| 亚洲av片不卡无码久久| 99精品国产91久久久久久| 欧美成人精品一区二区综合免费| 国产九色精品成人porny| 亚洲欧美自偷自拍另类| 蜜桃av噜噜一区| 激情 小说 亚洲 图片: 伦| 日韩二区三区在线观看| 一本久道中文无码字幕av| 性感少妇一区| 色综合av综合无码综合网站| 男女精品网站| 狠狠热免费视频| 蜜臀久久99精品久久久久宅男| 韩国日本美国免费毛片| 日本亚洲天堂网| 色国产在线视频| 久久精品国产一区二区| 亚洲涩涩在线观看| 国产不卡免费视频| 伊人久久一区二区三区| xfplay精品久久| 一区二区三区久久久久| 国产精品私人影院| 国产精品国产精品88| 亚洲国产日韩综合久久精品| 毛片在线免费视频| 在线观看日韩高清av| 一级特黄aaaaaa大片| 日韩小视频在线观看专区| 欧美性猛交 xxxx| 亚洲乱亚洲乱妇无码| 98在线视频| 欧美激情视频一区二区| 英国三级经典在线观看| 国产欧美一区二区三区四区| 深夜激情久久| 久久综合久久综合这里只有精品| 成人高清av| av一区二区三区免费观看| 在线亚洲精品| 三区视频在线观看| 成人夜色视频网站在线观看| 欧美一区二区三区成人精品| 中文成人综合网| www.av视频在线观看| 日韩欧美有码在线| 99在线精品视频免费观看20| 日韩经典第一页| 浪潮av一区| 1769国内精品视频在线播放| 欧美少妇激情| 精品国产乱码久久久久软件 | 男女视频免费看| 在线精品视频小说1| 性一交一乱一乱一视频| 亚洲人成在线免费观看| 成年视频在线观看| 日韩女在线观看| 欧美激情精品| 亚洲毛片aa| 亚洲永久字幕| 波多野结衣三级视频| 国产喂奶挤奶一区二区三区| 久草视频免费在线播放| 欧美网站一区二区| 四季av日韩精品一区| 久热在线中文字幕色999舞| 69久成人做爰电影| 国产美女在线精品免费观看| 欧美第一精品| 欧美亚洲日本在线观看| 99视频热这里只有精品免费| 国产91在线播放九色| 欧美性20hd另类| 欧美天堂在线视频| 欧美成aaa人片在线观看蜜臀| 欧美gay视频| 国产一区二区三区四区五区在线| 亚洲第一天堂| 中文字幕亚洲乱码| 国产亚洲欧洲一区高清在线观看| 国产精品2020| 日韩免费高清视频| 国产在线观看a视频| 国产在线拍偷自揄拍精品| 久久99国产精一区二区三区| 国产极品粉嫩福利姬萌白酱 | 99电影在线观看| 久久久久久久久久久久久久| 国产嫩草在线观看| 久久这里只有精品视频网| 日韩高清免费av| 精品福利av导航| 精品日韩av| eeuss一区二区三区| 欧美人成在线| www.99r| 国产欧美一区二区在线观看| 男人天堂av在线播放| 国产丝袜一区视频在线观看| 国产在线美女| 久久riav| 麻豆成人在线| 久操视频在线观看免费| 欧美亚洲综合色| 在线观看麻豆| 成人午夜一级二级三级| 你懂的亚洲视频| 日韩av成人网| 亚洲高清免费一级二级三级| 手机看片福利永久| 欧美亚洲另类在线| 亚洲裸色大胆大尺寸艺术写真| 激情综合在线观看| 国产亚洲1区2区3区| 中文字幕日韩国产| 日韩在线中文视频| 激情不卡一区二区三区视频在线| 久久久国内精品| 99久久免费精品| 免费观看日批视频| 日韩有码片在线观看| 成人亚洲精品| 国产精品久久久久9999爆乳| 99久久综合狠狠综合久久| 无码视频一区二区三区| 一本色道久久综合狠狠躁篇怎么玩 | 最新国产一区| 欧美伦理片在线观看| 亚洲视频一区在线| 日韩一级中文字幕| 欧美在线中文字幕| 日本一区二区高清不卡| 欧美激情第四页| 激情av一区二区| wwwww在线观看免费视频| 亚洲最大福利网站| 六月丁香综合| 日本青青草视频| 亚洲欧洲av一区二区| 国产美女视频一区二区| 黄色一级片播放| 中文字幕日本乱码精品影院| 日韩一区二区三区在线观看视频| 日韩av片免费在线观看| 91精品久久久久久久蜜月| 在线天堂www在线国语对白| 欧美日韩午夜影院| 国语对白在线刺激| 天堂资源在线亚洲视频| 国产成人精品免费| 国产女主播喷水视频在线观看 | 欧美videofree性高清杂交| 精品3atv在线视频| 国内精品国产三级国产99|