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