并发计算
并发计算(英語:,或譯為並行處理、共時計算),是一種程式計算的形式,在系統中,至少有兩個以上的計算在同時運作,計算結果可能同時發生。用來實作並行系統(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
- occam-π
- Orc
- Oz
- Mozart Programming System
- 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