概論
並發計算,簡單來說,就是將一個計算任務,分區成幾個小的部分,讓它們同時被計算,之後再匯整計算結果,以完成任務。它跟並行計算(Parallel computing)與分散式計算,有重疊之處,在概念上不同,但常會讓人混淆。
並發計算是一種程式運算的特性,可以被視為是並行運算的進一步抽象,它包涵了時間片這種可以被用來實現虛擬並行運算(pseudoparallelism)的技術,因此在實際的物理運作中,計算過程可能是並行,或非並行的。
並行計算是指,當並發計算的程式,在機器平台上同時被運行的狀況,因此,並行計算是一種機器運算的形式之一。分散式計算(Distributed computing)則是並行計算的一個特例,它採用計算機網路來進行同步。
實現並發程式有許多方式,依程式語言與作業系統的支持,可以用進程,或是執行緒來實現。它可以運行在單一處理器上,將不同的運行步驟分散在不同時間片中運行,以非並行方式循序運算;它也可以用並行計算來實現,將每個進程指定給處理器組中的某個處理器,以單片機多處理器平台,或是透過網路連結的分散平台來實做。
依照硬體與作業系統的支持,並發計算可以在同一個進程中完成,在同一個進程中以多執行緒來完成,以多個進程來達成,甚至可以分成數個程式來運行。可以用單處理器的循序計算來實現,也可以采並行計算或分散式計算方式實做。
但以並行方式來運作並發程式,並不必然會增進運行效率。因為運行結果可能會因為平台特性而改變,也增加它在設計上的難度。
技術優點
•並發計算可以增加產出 - 讓並發程式以並行方式運行,在某個特定時間內,可以讓數個進程同時完成計算任務,增加了產出。
•輸入/輸出的反應時間加快 - 密集進行輸入/輸出(I/O)操作的應用程式,多數的時間,都在等待輸入或輸出操作完成。在等待的時間中,並發計算編程可以讓另外的進程來運作。
•更適當的程式架構 - 某些計算問題或問題的領域,特別適合以並發計算來解決。
並發互動與通信
並發計算中,不同計算單元之間,需要進行通信以保持同步。這些通信方式,在某些並發程式語言中,是被隱藏起來的(例如,利用future方式)。以外顯方式來進行通信,可分成兩種主要方式:
•共享存儲器通信
經由改變共享存儲器地址內的數據內容,讓不同的並發單元間進行通信,如Java與C#都支持這個方式。使用這種通信類型的並發程式,通常需要套用某種鎖定的方式來達成執行緒間的同步,這些鎖定技術包括mutex,semaphore,或monitor等。
•訊息傳遞通信
透過訊息的交換,使不同的並發單元間同步,如Scala,Erlang與occam。
並發計算模型
•參與者模式
•Petri網
•通信順序進程
並發性程式語言
並發性程式語言使用程式語言結構特性進行並發。這些結構涉及到多執行緒,分散式計算,訊息傳遞,資源共享(包括記憶體共享)。有時候我們也稱這些語言是面向並發的程式語言(COPL)。 如今很多常用的語言都擁有並發的特性,例如:Java和C#。這兩種語言底層都是通過記憶體共享以及鎖監聽機制的並發模型來實現(儘管訊息傳遞模型如今也是基於記憶體共享模型實現的)。在訊息傳遞的並發模型世界中,Erlang最具代表性並被廣泛使用至今。
很多並發性程式語言更多的是被用作研究(例如:Pict)而非生產用途。儘管如此,在最近20年,還是有很多語言例如 Erlang,Limbo和Occam被用於生產工業。類似這些並發性程式語言還包括:
•Ada
•Alef
•Alice
•Ateji PX
•Axum
•Chapel
•Charm++
•Cilk
•Cω
•C#
•Clojure
•Concurrent Clean
•Concurrent Collections
•Concurrent Haskell
•Concurrent ML
•Concurrent Pascal
•Curry
•D
•E