MPG模式運行狀態11)當前程式有三個M,如果三個M都在一個cpu運行,就是併發,如果在不同的cpu運行就是並行2)M1,M2,M3正在執行一個G,M1的協程隊列有三個,M2的協程隊列有三個,M3的協程隊列有兩個3)從上圖可以看到:Go的協程是輕量級的線程,是邏輯態的,Go可以容易的起上萬個協程4) ...
MPG模式運行狀態1
1)當前程式有三個M,如果三個M都在一個cpu運行,就是併發,如果在不同的cpu運行就是並行
2)M1,M2,M3正在執行一個G,M1的協程隊列有三個,M2的協程隊列有三個,M3的協程隊列有兩個
3)從上圖可以看到:Go的協程是輕量級的線程,是邏輯態的,Go可以容易的起上萬個協程
4)其他程式c/java的多線程,往往是內核態的,比較重量級,幾千個線程就有可能耗光cpu資源
MPG模式運行狀態2
1)分成兩個部分來看
2)原來的情況是M1主線程正在執行G1協程,另外有三個協程在等待
3)如果G1協程阻塞,比如讀取文件或者資料庫
4)這時就會創建M2主線程(也可能是從已有的線程池中取出M2)並且將等待的三個協程掛到M2下執行,M1主線程下的G1仍然執行文件的讀寫
5)這樣的MPG調度模式,既可以讓G1執行,也不會讓隊列的其他協程一直阻塞