並發計算
並發計算(英語:Concurrent computing,或譯為並行處理、共時計算),是一種程式計算的形式,在系統中,至少有兩個以上的計算在同時運作,計算結果可能同時發生。用來實作並行系統(Concurrent system)的程式語言與各種演算法,統稱為並行計算。
並行程式通常被設計為互動式的運算過程,因為它的運算過程是不確定的,在設計上的難度較高。設計並行程式最大的挑戰,在於確保不同運算執行步驟間的互動或是通訊,能以正確的順序進行,同時,也要確保在不同執行步驟間共享的資源,能夠正確被存取。在這個領域的先驅人物有艾茲赫爾·戴克斯特拉、東尼·霍爾與泊·派克·漢森等人。
概論
並行計算,簡單來說,就是將一個計算任務,分割成幾個小的部份,讓它們同時被計算,之後再匯整計算結果,以完成任務。它跟平行計算(Parallel computing)與分散式計算,有重疊之處,在概念上不同,但常會讓人混淆。
並行計算是一種程式運算的特性,可以被視為是平行運算的進一步抽象,它包涵了時間片這種可以被用來實作虛擬平行運算(pseudoparallelism)的技術,因此在實際的物理運作中,計算過程可能是平行,或非平行的。
平行計算是指,當並行計算的程式,在機器平台上同時被執行的狀況,因此,平行計算是一種機器運算的形式之一。分散式計算(Distributed computing)則是平行計算的一個特例,它採用計算機網路來進行同步。
實作並行程式有許多方式,依程式語言與作業系統的支援,可以用行程,或是執行緒來實作。它可以執行在單一處理器上,將不同的執行步驟分散在不同時間片中執行,以非平行方式循序運算;它也可以用平行計算來實現,將每個行程指定給處理器組中的某個處理器,以單晶片多處理器平台,或是透過網路連結的分散平台來實做。
依照硬體與作業系統的支援,並行計算可以在同一個行程中完成,在同一個行程中以多執行緒來完成,以多個行程來達成,甚至可以分成數個程式來執行。可以用單處理器的循序計算來實作,也可以採平行計算或分散式計算方式實做。
但以平行方式來運作並行程式,並不必然會增進執行效率。因為執行結果可能會因為平台特性而改變,也增加它在設計上的難度。
技術優點
- 並行計算可以增加產出 - 讓並行程式以平行方式執行,在某個特定時間內,可以讓數個行程同時完成計算任務,增加了產出。
- 輸入/輸出的反應時間加快 - 密集進行輸入/輸出(I/O)操作的應用程式,多數的時間,都在等待輸入或輸出操作完成。在等待的時間中,並行計算編程可以讓另外的行程來運作。
- 更適當的程式架構 - 某些計算問題或問題的領域,特別適合以並行計算來解決。
並行互動與通訊
並行計算中,不同計算單元之間,需要進行通訊以保持同步。這些通訊方式,在某些並行程式語言中,是被隱藏起來的(例如,利用future方式)。以外顯方式來進行通訊,可分成兩種主要方式:
- 共享記憶體通訊
- 經由改變共享記憶體位址內的資料內容,讓不同的並行單元間進行通訊,如Java與C#都支援這個方式。使用這種通訊類型的並行程式,通常需要應用某種鎖定的方式來達成執行緒間的同步,這些鎖定技術包括mutex,semaphore,或monitor等。
- 訊息傳遞通訊
並行計算模型
並行性程式語言
並發性編程語言使用編程語言結構特性進行並發。這些結構涉及到多線程,分布式計算,消息傳遞,資源共享(包括內存共享)。有時候我們也稱這些語言是面向並發的編程語言(COPL)。 如今很多常用的語言都擁有並發的特性,例如:Java和C#。這兩種語言底層都是通過內存共享以及鎖監聽機制的並發模型來實現(儘管消息傳遞模型如今也是基於內存共享模型實現的)。在消息傳遞的並發模型世界中,Erlang最具代表性並被廣泛使用至今。
很多並發性編程語言更多的是被用作研究(例如:Pict)而非生產用途。儘管如此,在最近20年,還是有很多語言例如 Erlang,Limbo和Occam被用於生產工業。類似這些並發性編程語言還包括:
- Ada
- Alef
- Alice
- Ateji PX
- Axum
- Chapel
- Charm++
- Cilk
- Cω
- C#
- Clojure
- Clean
- Concurrent Collections
- Concurrent Haskell
- Concurrent ML
- Concurrent Pascal
- Curry
- D
- E
- ECMAScript
- Eiffel
- Elixir
- Erlang
- Faust
- Fortran
- Go
- Hume
- Io
- Janus
- JoCaml
- Join Java
- Joule
- Joyce
- LabVIEW
- Limbo
- MultiLisp
- Modula-2
- Modula-3
- Newsqueak
- occam
- Orc
- Oz
- ParaSail
- Pict
- Perl中的AnyEvent[1]和Coro[2]
- Python中的Twisted[3], greenlet[4]和gevent[5].
- Reia
- Rust
- SALSA
- Scala
- SequenceL
- SR
- Stackless Python
- StratifiedJS
- SuperPascal
- Unicon
- Termite Scheme
- TNSDL
- VHDL
- XC