Go MPG 模型之詳解

2021-10-24 09:45:32 字數 1316 閱讀 4748

mpg 模型概述

golang 中的 mpg 執行緒模型對兩級執行緒模型進行一定程度的改進,使它能夠更加靈活地進行執行緒之間的排程。它由三個主要模組構成,如下圖所示:

machine,乙個 machine 對應乙個核心執行緒,相當於核心執行緒在 golang 程序中的對映

processor,乙個 prcessor 表示執行 go **片段的所必需的上下文環境,可以理解為使用者**邏輯的處理器

goroutine,是對 golang 中**片段的封裝,其實是一種輕量級的使用者執行緒。

為了減輕描述工作,下面的介紹中我們會用 m、p、g 分別指代 machine、processor 和 goroutine。

每乙個 m 都會以乙個核心執行緒繫結,m 和 p 之間也是一對一的關係,而 p 和 g 的關係則是一對多。在執行過程中,m 和 核心執行緒之間對應關係的不會變化,在 m 的生命週期內,它只會與乙個核心執行緒繫結,而 m 和 p 以及 p 和 g 之間的關係都是動態可變的。

在實際的執行過程中,m 和 p 的組合才能夠為 g 提供有效的執行環境,而多個可執行 g 將會順序排成乙個佇列掛在某個 p 上面,等待排程和執行,如下圖所示:

m 的建立一般是因為沒有足夠的 m 來和 p 組合以為 g 提供執行環境,在很多時候 m 的數量可能會比 p 要多。在單個 golang 程序中,p 的最大數量決定了程式的併發規模,且 p 的最大數量是由程式決定的。可以通過修改環境變數 gomaxprocs 和 呼叫函式 runtime#gomaxprocs 來設定 p 的最大值。

m 和 p 會適時的組合和斷開,保證 p 中的待執行 g 佇列能夠得到及時執行。比如說上圖中的 g0 此時因為網路 i/o 而阻塞了 m,那麼 p 就會攜帶剩餘的 g 投入到其他 m 的懷抱中。這個新的 m1 可能是新建立的,也可能是從排程器空閒 m 列表中獲取的,取決於此時的排程器空閒 m 列表中是否存在 m,從而避免 m 的過多建立,如下圖所示:

有個疑問:

對於 python 裡的 eventlet 或者 go 裡 goroutine, 他們的併發到底能使用到多核嗎?

根據 兩級執行緒模型 的描述感覺是可以的呀,最起碼切換到核心態的時候是可以在多核上並行的,可以輔助參考 為什麼多執行緒可以利用到多核

Django模型之Meta屬性詳解

django模型類的meta是乙個內部類,它用於定義一些django模型類的行為特性。而可用的選項大致包含以下幾類 abstract 這個屬性是定義當前的模型是不是乙個抽象類。所謂抽象類是不會對應資料庫表的。一般我們用它來歸納一些公共屬性字段,然後繼承它的子類可以繼承這些字段。如果abstract ...

Django模型之Meta選項詳解

django模型類的meta是乙個內部類,它用於定義一些django模型類的行為特性。而可用的選項大致包含以下幾類 這個屬性是定義當前的模型是不是乙個抽象類。所謂抽象類是不會對應資料庫表的。一般我們用它來歸納一些公共屬性字段,然後繼承它的子類可以繼承這些字段。options.abstract 如果a...

CSS盒子模型之詳解

前言 盒子模型是css中最核心的基礎知識,理解了這個重要的概念才能更好的排版,進行頁面布局。一 css盒子模型概念 css盒子模型 又稱框模型 box model 包含了元素內容 content 內邊距 padding 邊框 border 外邊距 margin 幾個要素。如圖 圖中最內部的框是元素的...