深入理解Golang排程器GMP模型

2022-06-23 13:45:09 字數 1009 閱讀 1212

隨著伺服器硬體的公升級,配置越來越高,為了充分利用伺服器資源,併發變成也就變得越來越重要。

併發:邏輯上具有處理多個同時任務的能力。

並行:物理上同一時刻執行多個併發任務。

通常所說的併發程式設計,也就是說它允許多個任務同時執行,但實際上並不一定在同一時刻被執行。在單核處理器上,通過多執行緒共享cpu時間片序列執行。

多執行緒和多程序是並行的基本條件。但是單執行緒也可以用協程來實現併發。

1,gg就是goroutine的縮寫。相當於作業系統中的程序控制塊。這裡就是goroutine的控制結構。是對goroutine的抽象。其中包含執行的函式指令和引數。g儲存的任務物件。上下文切換,現場保護和現場保護恢復需要的暫存器(sp,ip)等資訊

2,mm是乙個執行緒,所有的m是有執行緒棧的。如果不對該執行緒棧分配記憶體,那麼系統將會為執行緒棧分配記憶體。當指定了執行緒棧,m的pc暫存器指向g提供的函式,然後去執行。

3,pprocessor是乙個抽象的概念。並不是真正的物理cpu。所以當p有任務時需要建立和喚醒乙個系統執行緒來執行它佇列的任務。所以p/m需要進行繫結,構成乙個執行單元。

p決定了同事可以併發任務的數量,可通過gomaxprocs限制同時執行使用者級任務的作業系統執行緒。可以通過runtime.gomaxprocs進行制定。

go的排程器排程過程

首先建立乙個g物件,g物件儲存到p的本地佇列或者全域性佇列。p此時去喚醒乙個m,p繼續執行它的執行序。m尋找是否有空閒的p,如果有則將該g物件移動到它本身。接下來m執行乙個排程迴圈(呼叫g物件->執行->清理執行緒->繼續找新的goroutine執行)

m執行過程中,隨時會發生上下文切換。當發生上下文切換時,需要對執行現場進行保護,以便下次被排程執行時進行現場恢復。go排程器m的棧儲存在g物件上,只需要將m所需要的暫存器(sp,pc等)儲存到g 物件上就可以實現現場保護。當這些暫存器資料被保護起來,就隨時做上下文切換了,在中斷之前把現場儲存起來。如果此時g任務還沒有執行完。m可以將任務重新丟到p的任務佇列,等待下一次被排程執行。當再次被排程執行時,m通過訪問g的vdsosp,vdsopc暫存器進行現場恢復。

深入理解Python裝飾器

主要內容 l local 函式內部作用域 e enclosing 函式內部與內嵌函式之間 g global 全域性作用域 b build in 內建作用域 closure 內部函式中對enclosing作用域的變數進行引用 函式的實質與屬性 函式是乙個物件 函式執行完成後內部變數 函式屬性 函式返回...

深入理解空間配置器

我們都知道stl裡有很多容器,如vector,stack,queue等等,每個容器都是通過配置器來獲取儲存空間的,現在來總結下配置器原理 當我們建立乙個物件時常用方式是new,銷毀乙個物件用delete t a new t delete a 對於new 其實是先呼叫為其配置記憶體,再呼叫相應的建構函...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...