g0 m0

g0和m0

g0 和 m0 在runtime中是比較重要的概念這裏講一下,它們到底什麼?

  • m0
    m0 表示進程啓動的第一個線程,也叫主線程。它和其他的m沒有什麼區別,要說區別的話,它是進程啓動通過彙編直接複製給m0的,m0是個全局變量,而其他的m都是runtime內自己創建的。 m0 的賦值過程,可以看前面 runtime/asm_amd64.s 的代碼。一個go進程只有一個m0。

  • g0
    首先要明確的是每個m都有一個g0,因爲每個線程有一個系統堆棧,g0 雖然也是g的結構,但和普通的g還是有差別的,最重要的差別就是棧的差別。g0 上的棧是系統分配的棧,在linux上棧大小默認固定8MB,不能擴展,也不能縮小。 而普通g一開始只有2KB大小,可擴展。在 g0 上也沒有任何任務函數,也沒有任何狀態,並且它不能被調度程序搶佔。因爲調度就是在g0上跑的。

  • proc.go 中的全局變量 m0和g0

    var (
    	m0           m
    	g0           g
    	raceprocctx0 uintptr
    )
    

     runtime/proc.go 的文件中聲明瞭兩個全局變量,m0表示主線程,這裏的g0表示和m0綁定的g0,也可以理解爲m0線程的堆棧,這兩個變量的賦值是彙編實現的。

到這裏我們應該知道了g0和m0是什麼了? m0代表主線程、g0代表了線程的堆棧。調度都是在系統堆棧上跑的,也就是一定要跑在 g0 上

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章