導入 並行コンピューティングの概念は、関連するものの異なる概念である並列コンピューティング と混同されることが多い。[ 3 ] [ 4 ] どちらも「同じ期間に 実行される複数のプロセス」と説明できるが、並列コンピューティングでは、実行は同じ物理的な瞬間に行われる。例えば、マルチプロセッサ マシンの別々のプロセッサ 上で、計算の高速化を目的として行われる。並列コンピューティングは、(1コアの )シングルプロセッサでは不可能である。なぜなら、どの瞬間(どのクロックサイクル)にも、1つの計算しか実行できないからである。[ a ] 対照的に、並行コンピューティングは、プロセスのライフサイクル が重複するものの、実行は同じ瞬間には行われない。ここでの目的は、複数のクライアントが同時にサーバーにアクセスするなど、並行して発生するプロセスをモデル化することである。ソフトウェアシステムを、複数の並行して通信する部分で構成されるものとして構造化することは、各部分が並列に実行できるかどうかに関わらず、複雑さに対処する上で有用である。[ 5 ] : 1
例えば、同時実行プロセスは、タイムシェア リングスライスを用いて各プロセスの実行ステップをインターリーブすることで、1つのコア上で実行できます。一度に実行されるプロセスは1つだけであり、そのプロセスがタイムスライス内に完了しない場合は一時停止され 、別のプロセスが開始または再開され、その後、元のプロセスが再開されます。このようにして、ある瞬間には複数のプロセスが実行途中の状態になりますが、その瞬間に実際に実行されているのは1つのプロセスのみです。
同時計算は並列に実行できます。 [ 3 ] [ 6 ] たとえば、各プロセスを個別のプロセッサまたはプロセッサコアに割り当てたり、ネットワーク全体に計算を分散したりすることによって実行できます。
並行システムにおけるタスクの実行タイミングはスケジューリング に依存し、タスクは必ずしも並行して実行されるとは限りません。例えば、2つのタスクT1とT2があるとします。
T1はT2より先に実行され完了することもあれば、その逆もあり得る (逐次実行と 逐次実行の両方)。 T1とT2は交互に実行される(直列実行と 並列実行の両方が可能)。 T1とT2は、同じ瞬間に同時に実行される可能性がある(並列および 同時実行)。 「シーケンシャル」という言葉は、「同時実行」と「並列実行」の両方の反意語として使われます。これらが明確に区別される場合、同時実行/シーケンシャル 、並列実行/シリアル が反対のペアとして使われます。タスクがインターリーブなしで(逐次的に、並列性なし、前のタスクが終了するまでタスクが開始されない)一度に 1 つずつ実行されるスケジュールは、シリアル スケジュール と呼ばれます。シリアルにスケジュールできるタスクのセットはシリアル化可能 であり、これにより同時実行制御が 簡素化されます。
共有リソースへのアクセスを調整する 並行プログラムを設計する際の主な課題は、並行性制御 です。これは、異なる計算実行間の相互作用または通信の正しい順序を保証し、実行間で共有されるリソースへのアクセスを調整することです。[ 6 ] 潜在的な問題には、競合状態 、デッドロック 、リソース枯渇など があります。たとえば、共有リソースで表される当座預金口座から引き出しを行う次のアルゴリズムを考えてみましょうbalance。
bool withdraw ( int withdrawal ) { if ( 残高 >= 引き出し額 ) { 残高 -= 引き出し ; return true ; } false を返します 。 } と仮定しbalance = 500、2 つの同時実行スレッド が と を呼び出すとしますwithdraw(300)。withdraw(350)両方の操作の 3 行目が 5 行目より先に実行されると、両方の操作で が とbalance >= withdrawal評価されtrue、実行は引き出し額の減算に進みます。しかし、両方のプロセスが引き出しを実行するため、最終的に引き出される合計金額は元の残高よりも多くなります。このような共有リソースの問題は、並行性制御、つまりノンブロッキングアルゴリズム を使用することで解決できます。
利点 並行コンピューティングには以下のような利点があります。
実装 並行プログラムを実装するには、さまざまな方法が利用できます。例えば、各計算処理をオペレーティングシステムのプロセス として実装する方法や、単一のオペレーティングシステムのプロセス内で計算処理をスレッド の集合として実装する方法などがあります。
相互作用とコミュニケーション 並行コンピューティングシステムの中には、並行コンポーネント間の通信がプログラマから隠蔽されているもの(例えば、フューチャー を使用するなど)もあれば、明示的に処理する必要があるものもある。明示的な通信は、大きく2つのクラスに分類できる。
共有メモリ通信 並行処理コンポーネントは、共有メモリ 領域の内容を変更することによって通信します(Java やC#などがその例です)。このスタイルの並行プログラミングでは、スレッド間の連携を図るために、通常、何らかのロック機構( ミューテックス、 セマフォ 、モニター など)が必要となります。これらのいずれかを適切に実装したプログラムは、スレッドセーフ であると言われます。メッセージパッシング通信 並行コンポーネントはメッセージパッシング (MPI 、Go 、Scala 、Erlang 、occam などで例示されるメッセージの交換)によって通信します。メッセージの交換は非同期で実行することも、送信側がメッセージを受信するまでブロックする同期的な「ランデブー」スタイルを使用することもできます。非同期メッセージパッシングは信頼できる場合と信頼できない場合があります(「送信して祈る」と呼ばれることもあります)。メッセージパッシング並行性は共有メモリ並行性よりもはるかに推論しやすく、一般的に並行プログラミングのより堅牢な形式と考えられています。[ 11 ] アクターモデル やさまざまなプロセス計算 など、メッセージパッシングシステムを理解し分析するためのさまざまな数学理論が利用可能です。メッセージパッシングは、共有メモリキャッシュのコヒーレンス の有無にかかわらず、対称マルチプロセッシング によって効率的に実装できます。 共有メモリとメッセージパッシングの並行処理は、パフォーマンス特性が異なります。一般的に(常にではありませんが)、プロセスごとのメモリオーバーヘッドとタスク切り替えオーバーヘッドはメッセージパッシングシステムの方が低くなりますが、メッセージパッシング自体のオーバーヘッドはプロシージャ呼び出しよりも大きくなります。これらの違いは、他のパフォーマンス要因によって相殺されることがよくあります。
有病率 並列処理はコンピューティングにおいて広く普及しており、単一チップ上の低レベルハードウェアから世界規模のネットワークまで、あらゆる場面で発生している。以下に例を挙げる。
プログラミング言語レベルでは:
オペレーティングシステムレベルでは:
ネットワークレベルでは、ネットワークシステムは一般的に、個別のデバイスで構成されているため、その性質上、並行処理を行う。
並行プログラミングをサポートする言語並行プログラミング言語とは、 並行処理 のための言語構造を用いるプログラミング言語のことです。これらの構造には、マルチスレッド、 分散コンピューティング のサポート、メッセージパッシング 、共有リソース (共有メモリ を含む)、フューチャーやプロミスなどが含まれる場合があります。このような言語は 、並行処理指向言語 または並行処理指向プログラミング言語 (COPL)と呼ばれることもあります。 [ 13 ]
現在、並行処理のための特定の構造を持つプログラミング言語として最も一般的に使用されているのは、Java とC# です。これらの言語はどちらも基本的に共有メモリ型の並行処理モデルを採用しており、ロックはモニター によって提供されます(ただし、基盤となる共有メモリ型モデルの上にメッセージパッシング型モデルを実装することも可能ですし、実際に実装されています)。メッセージパッシング型の並行処理モデルを採用している言語の中で、 2010年時点ではErlangが 業界で最も広く使用されていたと考えられます。
多くの並行プログラミング言語は、実運用向けというよりは研究用言語(例: Pict )として開発されてきました。しかし、 Erlang 、Limbo 、Occamといった言語は、過去20年間で様々な時期に産業界で利用されてきました。並行プログラミング機能を利用する、あるいは提供する言語の例を以下に挙げます(ただし 、これらに限定されません)。
Ada – 汎用言語であり、メッセージパッシングとモニターベースの並行処理をネイティブにサポートしている。Alef – スレッドとメッセージパッシングを備えた並行処理。 ベル研究所のPlan 9 の初期バージョンにおけるシステムプログラミング用。Alice – Standard ML の拡張機能で、フューチャーを介した並行処理のサポートを追加します。Ateji PX – π計算 から着想を得た並列プリミティブを備えたJava 拡張機能Axum – ドメイン固有、並行処理、アクターモデルと.NET共通言語ランタイムに基づき、C言語ライクな構文を使用バイナリモジュラーデータフローマシン (BMDFM)C++ – スレッドとコルーチンのサポートライブラリ[ 14 ] [ 15 ] Cω (オメガ) – 研究用、C#を拡張、非同期通信を使用C#は、 lock 、yield を使用した並行処理をサポートしており、バージョン 5.0 以降ではasync およびawait キーワードも導入されています。Clojure – modern, functional programming dialect of Lisp on the Java platformConcurrent Clean – functional programming, similar to Haskell Concurrent Collections (CnC) – achieves implicit parallelism independent of memory model by explicitly defining flow of data and controlConcurrent Haskell – lazy, pure functional language operating concurrent processes on shared memoryConcurrent ML – concurrent extension of Standard ML Concurrent Pascal – by Per Brinch Hansen Curry D – multi-paradigm system programming language with explicit support for concurrent programming (actor model )E – uses promises to preclude deadlocksECMAScript – uses promises for asynchronous operationsEiffel – through its SCOOP mechanism based on the concepts of Design by ContractElixir – dynamic and functional meta-programming aware language running on the Erlang VM, which uses asynchronous message passing with no shared memoryErlang – dynamic and functional language running on the Erlang VM, which uses asynchronous message passing with no shared memoryFAUST – real-time functional, for signal processing, compiler provides automatic parallelization via OpenMP or a specific work-stealing schedulerFortran –coarrays and do concurrent are part of Fortran 2008 standardGo – for system programming, with a concurrent programming model based on communicating sequential processes (CSP)Haskell – concurrent, and parallel functional programming language[ 16] Hume – functional, concurrent, for bounded space and time environments where automata processes are described by synchronous channels patterns and message passingIo – actor-based concurrencyJanus – features distinct askers and tellers to logical variables, bag channels; is purely declarativeJava – thread class or Runnable interfaceJulia – concurrent programming primitives: tasks, async-wait, channels[ 17] JavaScript – via web workers , in a browser environment, promises , and callbacks JoCaml – 並行処理と分散処理をベースとしたチャネルベースのOCaml 拡張ライブラリで、プロセスの結合計算 を実装しています。Java 言語をベースとした並行処理アプリケーション「Join Java」 Joule – データフローベース、メッセージパッシングによる通信Joyce – 並行処理、教育用、Per Brinch Hansen によるCSP の機能を備えたConcurrent Pascalをベースに構築 LabVIEW – グラフィカル、データフロー、関数はグラフのノード、データはノード間のワイヤ。オブジェクト指向言語を含む。Limbo – Alefの関連語で、 Inferno(オペレーティングシステム) におけるシステムプログラミング用。Locomotive BASIC – Amstrad版BASICには、並行サブルーチンを実行するためのEVERYコマンドとAFTERコマンドが含まれています。MultiLisp –並列処理をサポートするように拡張されたSchemeの派生版 Modula-2 – システムプログラミング向け言語。Niklaus Wirthによって開発され、 Pascal の後継としてコルーチンをネイティブにサポートしている。Modula-3 –スレッド、ミューテックス、条件変数を幅広くサポートするALGOL ファミリーの最新版Newsqueak – 研究向け、チャネルを最重要視。Alefの前身。 オッカム –連続的なプロセス伝達 (CSP) に大きく影響を受けているオブジェクトREXX (ooRexx) – オブジェクトベースのメッセージ交換による通信と同期Orc – 高度な並行処理、非決定論的、 クリーネ代数 に基づくOz-Mozart – マルチパラダイム、共有状態とメッセージパッシングの並行処理、およびフューチャーをサポートParaSail – オブジェクト指向、並列処理、ポインタなし、競合状態なしPHP – Go から着想を得た並列拡張機能によるマルチスレッドサポート[ 18 ] Pict ― 基本的にはミルナーの π計算 の実行可能な実装Python – スレッドベースの並列処理とプロセスベースの並列処理を使用します[ 19 ] Raku – デフォルトでスレッド、プロミス、チャネルのクラスが含まれています[ 20 ] Reia – シェアードナッシングオブジェクト間で非同期メッセージパッシングを使用するRed/System – システムプログラミング用、 Rebol ベースRust – システムプログラミング用、ムーブセマンティクスを使用したメッセージパッシング、および共有メモリ(不変および可変)を使用[ 21 ] Scala – 汎用言語であり、一般的なプログラミングパターンを簡潔かつ優雅に、そして型安全な方法で表現するように設計されています。SequenceL – 汎用関数型言語。主な設計目標は、プログラミングの容易さ、コードの明瞭さと可読性、マルチコアハードウェアでのパフォーマンス向上のための自動並列化、そして競合状態が確実に発生しないことである。 SR – 研究用SuperPascal – 教育用並行処理ライブラリ。Per Brinch Hansen 氏によるConcurrent Pascal とJoyce をベースに構築。Swift – 構造化された方法で非同期および並列コードを記述するための組み込みサポート[ 22 ] ユニコン – 研究用TeleNokia仕様記述言語(TNSDL ) – 電気通信交換システムの開発に使用され、非同期メッセージパッシングを使用する。 VHSICハードウェア記述言語(VHDL ) – IEEE STD-1076 XC – XMOS によって開発されたC言語の並行性拡張サブセットであり、通信する逐次プロセス と、プログラマブルI/Oのための組み込み構造に基づいている。他の多くのプログラミング言語も、ライブラリ の形で並行処理をサポートしており、そのレベルは上記のリストとほぼ同等である。
注記 ↑ これは、パイプライン処理やベクトル化命令など、プロセッサコア内部の並列処理を考慮に入れていない。1コア1プロセッサのマシンでも、 コプロセッサ などを使用すればある程度の並列処理は可能だが、プロセッサ単体では並列処理はできない。
参考文献 ↑ 『オペレーティングシステム概論 第9版』、アブラハム・シルベルシャッツ著。「第4章:スレッド」↑ ハンセン著、ブリンチ編。 (2002年)。並行プログラミングの起源 。土井 : 10.1007/978-1-4757-3472-0。ISBN 978-1-4419-2986-0 . S2CID 44909506 . 1 2 Pike, Rob (2012-01-11). "並行処理は並列処理ではない". Waza カンファレンス、2012 年 1 月 11 日。http ://talks.golang.org/2012/waza.slide (スライド) およびhttp://vimeo.com/49718712 (ビデオ)から取得↑ 「並列処理と並行処理」 . Haskell Wiki . ↑ シュナイダー、フレッド・B. (1997年5月6日). 並行プログラミングについて . Springer. ISBN 9780387949420 。1 2 ベン=アリ、モルデカイ(2006)。 並行および分散プログラミングの原理 (第2 版)。アディソン・ウェスリー 。ISBN 978-0-321-31283-9 。↑ パドヴァ、ダビデ (2011)。 並列コンピューティングの百科事典 。 Springer New York、ニューヨーク州 (2011 年 9 月 8 日発行)。ページ 819–825。ISBN 978-0-387-09765-7 。↑ 「非同期I/O」 、 Wikipedia 、2024年12月20日、 2024年12月27日 取得 ↑ Lamport, Leslie (1979年9月1日). 「マルチプロセスプログラムを正しく実行するマルチプロセッサコンピュータの作り方」. IEEE Transactions on Computers . C-28 (9): 690–691 . Bibcode : 1979ITCmp.100..690L . doi : 10.1109/TC.1979.1675439 . S2CID 5679366 . ↑ Lange, Julien; Ng, Nicholas; Toninho, Bernardo; Yoshida, Nobuko (2017年1月)「Fencing off go: チャネルベースプログラミングにおける活性と安全性」 第 44 回 ACM SIGPLANプログラミング言語原理シンポジウム論文集、 pp . 748–761。doi : 10.1145/3009837.3009847。ISBN 978-1-4503-4660-3 。↑ PODC 影響力のある論文賞: 2002 年 。ACM 分散コンピューティングの原理に関するシンポジウム (レポート) 。2009 年 8 月 24 日 に取得。 ↑ Armstrong, Joe (2003). "ソフトウェアエラーが存在する状況下で信頼性の高い分散システムを構築する" (PDF) 。 2016年4月15日に オリジナル (PDF) からアーカイブされました。 ↑ "標準ライブラリヘッダー <thread> (C++11)" . en.cppreference.com . 2024-10-03 取得 . ↑ "標準ライブラリヘッダー <coroutine> (C++20)" . en.cppreference.com . 2024-10-03 取得 . ↑ マーロウ、サイモン (2013) Haskell における並列および並行プログラミング: マルチコアおよびマルチスレッドプログラミングのテクニックISBN 9781449335946 ↑ 「Juliaにおける並行プログラミングと並列プログラミング – JuliaCon India 2015 – HasGeek Talkfunnel」 。juliacon.talkfunnel.com 。 2016年10月18日に オリジナル からアーカイブされました。 ↑ 「PHP: parallel – Manual」 . www.php.net . 2024年10月3日 取得 。 ↑ ドキュメント: Python 標準ライブラリ: 並行実行 ↑ 「並行処理」 . docs.perl6.org . 2017年12月24日 取得 。 ↑ Blum, Ben (2012). "Typesafe Shared Mutable State" . 2012年11月14日 取得 。 ↑ 「並行性」 。2022年。 2022年12月15日 取得 。
情報源 パターソン、デイビッド A.、ヘネシー、ジョン L. (2013).コンピュータ構成と設計:ハードウェア/ソフトウェアインターフェース 。モーガン・カウフマン・コンピュータ・アーキテクチャおよび設計シリーズ(第5 版)。モーガン・カウフマン。ISBN 978-0-12407886-4 。
さらに読む Dijkstra, EW (1965). 「並行プログラミング制御における問題の解決」 . Communications of the ACM . 8 (9): 569. doi : 10.1145/365559.365617 . S2CID 19357737 . ハーリヒー、モーリス(2008)[2008]。マルチプロセッサプログラミングの技法 。モーガン・カウフマン。ISBN 978-0123705914 。 ダウニー、アレン・B. (2005) [2005].信号機の小冊子 (PDF) . グリーンティープレス. ISBN 978-1-4414-1868-5 2016年3月4日にオリジナル(PDF) からアーカイブされました。2009年11月21日 に取得 。 フィルマン、ロバート・E.、ダニエル・P.フリードマン(1984)。『協調コンピューティング:分散ソフトウェアのためのツールとテクニック 』ニューヨーク:マグロウヒル。370ページ 。ISBN 978-0-07-022439-1 。 Leppäjärvi, Jouni (2008).同期プリミティブの普遍性に関する実用的かつ歴史的視点からの調査 (PDF) . オウル大学。2017年8月30日にオリジナル(PDF)からアーカイブ済み。 2012年9月13日 取得 。 タウベンフェルド、 ガディ(2006)。同期アルゴリズムと並行プログラミング 。ピアソン/プレンティスホール。p. 433。ISBN 978-0-13-197259-9 。
外部リンク ウィキメディア・コモンズに ある同時プログラミング関連のメディア 並行システム仮想ライブラリ