就像我們在"Goroutines"章節中提到了,Go語言會幫你處理goroutine到系統線程上。它使用的算法被稱為工作竊取策略(work stealing strategy)。這是什么意思?
首先,讓我們看看在許多處理器之間共享工作的天然策略,有時稱為公平調度。為了確保所有處理器的平均利用率,我們可以在所有可用處理器之間平均分配負載。想象一下,有n個處理器和x個任務需要執行。在公平調度策略中,每個處理器都會得到x/n個任務:
```
<Schedule Task 1>
<Schedule Task 2>
<Schedule Task 3>
<Schedule Task 4>
```
:-: 
不幸的是,這種方法存在問題。 如果你還記得“Goroutines”章節中我們提到Go使用fork-join模型來并發建模。在fork-join范例中,任務可能依賴于另一個,并且事實證明,在處理器之間分裂它們可能會導致其中一個處理器未充分利用。不僅如此,它還可能導致局部性緩存較差,因為在其他處理器上調度需要相同的數據任務。我們來看一個例子。
考慮一個程序,可以產生前面所述的工作分配。 如果第2項任務比第1項和第3項結合需要更長的時間,會發生什么?
:-: 
無論a和b之間的時間有多久,處理器一會閑置。
如果任務之間存在相互依存關系,如果分配給一個處理器的任務需要分配給另一個處理器的任務的結果,會發生什么情況? 例如,如果任務一依賴任務4呢?

在這種情況下,處理器1完全空閑,而任務2和4正在計算中。 雖然處理器1在任務1中被阻塞,處理器2在任務2中被占用,但處理器1可能已經在處理任務4以解除其自身阻塞。
* * * * *
學識淺薄,錯誤在所難免。我是長風,歡迎來Golang中國的群(211938256)就本書提出修改意見。
- 前序
- 誰適合讀這本書
- 章節導讀
- 在線資源
- 第一章 并發編程介紹
- 摩爾定律,可伸縮網絡和我們所處的困境
- 為什么并發編程如此困難
- 數據競爭
- 原子性
- 內存訪問同步
- 死鎖,活鎖和鎖的饑餓問題
- 死鎖
- 活鎖
- 饑餓
- 并發安全性
- 優雅的面對復雜性
- 第二章 代碼建模:序列化交互處理
- 并發與并行
- 什么是CSP
- CSP在Go中的衍生物
- Go的并發哲學
- 第三章 Go的并發構建模塊
- Goroutines
- sync包
- WaitGroup
- Mutex和RWMutex
- Cond
- Once
- Pool
- Channels
- select語句
- GOMAXPROCS
- 結論
- 第四章 Go的并發編程范式
- 訪問范圍約束
- fo-select循環
- 防止Goroutine泄漏
- or-channel
- 錯誤處理
- 管道
- 構建管道的最佳實踐
- 便利的生成器
- 扇入扇出
- or-done-channel
- tee-channel
- bridge-channel
- 隊列
- context包
- 小結
- 第五章 可伸縮并發設計
- 錯誤傳遞
- 超時和取消
- 心跳
- 請求并發復制處理
- 速率限制
- Goroutines異常行為修復
- 本章小結
- 第六章 Goroutines和Go運行時
- 任務調度