## CH13 平行化
---
### 為什麼要平行化
「有時候」可以改善效能
---
### 平行化的防禦原則
讓平行化的程式跟其他程式有清楚的劃分
----
#### 限制資料的視野
限制 critical section 的數量。
- 忘記加 critical section ,結果其他地方出錯
- 確認大家都有被保護很耗心力
- 很難找到問題源頭
----
#### 使用資料的複本
- 把資料設為唯讀,避免共享
- 複製資料給不同執行緒,最後再整合所有
----
#### 執行緒應盡可能獨立運行
- 讓每個執行緒存在自己的小世界裡,不跟其他執行緒共享資料
- 將資料「劃分」出可以讓獨立執行緒操作的獨立子集合
---
名詞定義
- Bounded Resources
平行環境裡有的資源大小或數量被限制住
ex: 資料庫連線
- Mutual Exclusion
只有一個執行緒可以存取共享的資料或資源
- Starvation
有執行緒永遠拿不到資源或資料
----
- dead lock
雙方都在等待對方停止執行,以取得系統資源,但是沒有一方提前登出時

- live lock
死結相似,死結是行程都在等待對方先釋放資源;活結則是行程彼此釋放資源又同時占用對方釋放的資源。當此情況持續發生時,儘管資源的狀態不斷改變,但每個行程都無法取得所需資源,使得事情沒有任何進展。
---
### 測試
撰寫對程式有危險的測試情況,曾經失敗就追蹤,不可忽略。
----
- 將偽造的失敗看作是潛在的執行緒問題
不要把系統錯誤當做偶發事件,一定是程式有問題。
- 先讓你的非執行緒程式碼能順利運行
先做到單一執行緒正確,再考慮多執行緒的情況。
- 讓你的執行緒是可隨插即用的
測試程式碼可以隨意添加或刪減,可模擬不同的情況。
----
- 讓你的執行緒程式碼是可調校的
調整程式的環境參數是可以,例如執行緒的數量。
- 執行比處理器數量還要多的執行緒
要測試工作交換(task swapping)的情況,執行緒數量要比處理器或核心數量還要多。
- 在不同的平台上運行在所有目標平台上進行測試。
---
---
調整你的程式碼,使之試圖產生失敗或強制產生失敗
對程式碼加工之四種函式:`wait()`、`sleep()`、`yield()`、`priority()`
(1)手動撰寫,例如增加上述四種函式呼叫。
問題:
- 找到合適地方插入呼叫
- 如何得知該分在哪及放哪種函式
- 這些函式為不必要且會使執行速度變慢
- 不一定找得到(靠運氣)
----
(2)自動化
透過 Aspect-Oriented Framework (剖面導向框架)、CGLIB 或 ASM 。
- 測試程式會產生隨機數,製造各種測試條件(隨機產生上述四種函式呼叫)。
{"metaMigratedAt":"2023-06-18T03:08:33.234Z","metaMigratedFrom":"YAML","title":"Clean code","breaks":true,"description":"View the slide with \"Slide Mode\".","slideOptions":"{\"theme\":\"league\",\"transition\":\"fade\"}","contributors":"[{\"id\":\"56dc1b54-fff4-4cc9-81d2-126cb50465ea\",\"add\":5881,\"del\":4410}]"}