中文詞彙是一個定義很模糊不清楚的語言, 這對於做研究和學習知識上有很大的困擾, 在這方面英文就做得很好, 常常兩個英文字詞翻譯成中文看似一樣的詞彙,, 但在原文中是有著差異用法, 尤其在Computer Science中熟悉原文定義, 才能夠真正了解知識的核心價值, 也許因為這樣所以外國學者的研究成果非常卓越 , 畢竟他們每一步都走得非常嚴謹且明確
最近在研究平行處理的時候, 常常遇到Concurrency , Parallel programming這兩個詞彙, 很多人都當當作兩者是一樣的意思, 並且交互使用, 不過隨著現在每一台電腦裡面的CPU都是多核心的時候, 其實兩者就有不一樣的地方
簡單來說, Concurrency是邏輯上(logically)的同時做更多事情, 邏輯上的意思就是你把Program分割成Multiple Threads去執行, 這時候如果遇到你的電腦CPU是單一核心的時候, 是Threads互相搶CPU的執行機會, 因此同一個時間下還是只有一個Thread被執行, 如下圖
也因此Concurrency並不保證可以同時做更多事情, 在單一CPU情況之下, 你只是看起來所有事情都是同時完成, 但其實是只是多個Threads輪流去執行, 最後一起完成, 並沒有真正的減少時間.
Concurrency 主要目的是去減少Latency, 舉個例子, 例如網站中有個表單要使用者填入資料, 這種UI blocking的時候, CPU可以先去執行其他事情, 避免整個CPU閒置等待User response, 也因此Concurrency是透過程式設計把有邏輯的把程式分割成個別的Thread, 透過不同Threads交互執行, 盡可能提高CPU的使用效率, 避免CPU idle(ex 等待User response).
Parallel programming是實際上(physically)的同時做更多事情,是真實的同時執行更多東西.這種就需要硬體上的支援, 最基本的就是Multiple cores CPU, 如下圖, 兩個Threads分別在不同的CPU上同步執行, 同時執行一個以上的工作, 因此Concurrency在Multiple cores CPU中就有Parallel programming特性
現在CPU 都是dual core起跳, 但如果Program邏輯還是用單一程序的方式, 還是無法發揮 Parallel programming, 雖然在硬體方面要達到Parallel programming還有Data parallelism可以把Loop平行化處理, 不過有這種Parallel loops在一般廣泛的程式語言都沒有提供, 比較普及化的方式還是Threads, 也因此要善用Concurrency來達到最佳化
但其實Threads是很低階的Concurrency實作方式, 很多細節比如Shared data , Threads composition, Threads Schedule等等都要自己動手處理, 從低階的Threads一般很難控制好整個程式流程,讓Program達到deterministic(可決定性,就是不管怎麼跑,最後的的結果都一樣), 往往用低階Threads去做Concurrency都會因為Shared data互相存取導致Result nondeterminism(不可決定性, 指程式每次跑出來結果都不一樣).
也因此找一個完整的工具來幫助我們能夠善用Concurrency是很重要的, 這也是Scala的使命, 歡走進Scala世界
沒有留言:
張貼留言