Skip to main content

Concurrency系列(一): 理解Concurrency之路

注意:這一系列的文章撰寫於2016年8月。

Concurrency是最近和Jserv研究的新題目,Concurrency是所謂的並行性,並不是平行性(Parallelism)。這兩者的差別我們之後再詳述。

剛開始研究時覺得這個主題很新穎,而且應該頗為重要,畢竟未來大多數的處理器都朝著多核心方向發展,想要壓榨出更多效能,必須要讓軟體跟上硬體的設計,因此multithread是個必然的趨勢,其中如何正確的處理不同thread之間交互執行衍伸而來的問題,就是concurrency探討的方向。

但當我開始深入研究時,便發現concurrency這個題目相當麻煩,因為concurrency其實牽涉相當廣,從最基本的lock, mutex, semaphore等同步用的工具外,如果繼續往下鑽,就會遇到atomic operation,要透過不可分割的原子操作來實現這些工具。再往下鑽,就會遇到更底層的memory model和memory ordering,因為編譯器會最佳化程式碼順序、處理器會亂序執行、底層硬體又有cache coherent的問題,導致程式實際的執行過程和你寫的不一定相同,這在單核心處理器上還沒什麼問題,但遇到多個thread同時在不同的核心跑時,就可能會發生悲劇。這些東西不僅牽涉到軟體設計,也牽涉到硬體的觀念,繼續延伸下去,甚至可以討論到如何設計無鎖的(lock-free)的資料結構。

在學習關於concurrency知識時,我遇到最大的問題在於,網路上大多數的資料都必須要有一定量的基礎知識,才有辦法順利理解,很多文章剛開始看的時候會遇到一堆不懂的名詞,讀到一半就卡住,鑽下去又會發現鑽不完,於是只能放置play。花了好些時間找資料和撞牆後,才逐漸把許多知識拼圖拼在一起。另外我發現從C++, Java語言提供的Concurrency API,是較為容易下手的切入點,因為比較接近實作層面,學起來會比較有感覺。但C++本身又是一個相當的語言,找資料的過程又讓我回想起大一物件導向講師小黃教C++11時崩潰的日子,不過現在你不用擔心這些了,我會盡量把我過去幾周研究、習得的知識,嘗試用有系統的方式整理,目標是讓大家能夠快速的跨越路上的障礙,往理解Concurrency之路上邁進。

我會盡量保證這些知識的正確性,但難免會有些地方有疏漏或缺失,我也是最近才開始接觸這個領域,如果發現文章內有理解錯誤的地方,請不吝留言或來信告知。