(Translated by https://www.hiragana.jp/)
並行計算 - Wikipedia コンテンツにスキップ

並行へいこう計算けいさん

出典しゅってん: フリー百科ひゃっか事典じてん『ウィキペディア(Wikipedia)』

並行へいこう計算けいさん(へいこうけいさん、えい: Concurrent computing)とは、複数ふくすう計算けいさんあるいはアルゴリズムを、どういち期間きかん同時どうじ実行じっこうさせつつ相互そうご同調どうちょう(コンカレント)させて、つぎ期間きかん開始かいしまでにたがいに完遂かんすいさせるという計算けいさん形態けいたい意味いみしている。同期どうきメッセージパッシングではその完遂かんすい抽象ちゅうしょう可能かのうになる。対義語たいぎご順次じゅんじ計算けいさん(シーケンシャル)である。並行へいこうコンピューティングとも邦訳ほうやくされる。並行へいこうプログラミング(Concurrent programming)ともわれる。

並行へいこう計算けいさんは、コンピュータプログラムコンピュータネットワーク重要じゅうよう特性とくせいであり、かくプロセスかくスレッド制御せいぎょなどがその要点ようてんになる[1]並行へいこう計算けいさんかくスレッドは、一定いってい制約せいやくないのスレッドの完了かんりょうつことなく同時どうじにそれぞれ進行しんこうできる。同期どうきではのスレッドの応答おうとう一定いってい制約せいやくないたなくてよくなる。エドガー・ダイクストラアントニー・ホーアが、並行へいこう計算けいさんのパイオニアとして名高なだかい。

イントロダクション[編集へんしゅう]

並行へいこう計算けいさんは、並列へいれつ計算けいさん(parallel computing)としばしば混同こんどうされる。並列へいれつ計算けいさんマルチプロセッサ前提ぜんていであり、独立どくりつしたかくプロセッサがられた計算けいさん同時どうじ実行じっこうすることをす。ゆえにシングルプロセッサでは不可ふかになる[2]分散ぶんさんシステムうちかくコンピュータがられた計算けいさん同時どうじ実行じっこうするのもそうである。並列へいれつ計算けいさんスループット・パフォーマンスけとされる。並列へいれつ計算けいさん対義語たいぎごはマルチプロセッサのシリアル計算けいさん(serial computing)であり[3]かくプロセッサの排他はいたてき計算けいさん順序じゅんじょ配置はいち重視じゅうしされる。

並行へいこう計算けいさんひとつのプロセッサに複数ふくすうのタスクを存在そんざいさせて、かくタスクに計算けいさんることを[4]。そこではタイムシェアリング技術ぎじゅつなどが使つかわれる。マルチプロセッサならば、タスクをかくプロセッサに分散ぶんさんできるのでより効率こうりつてきになる[5]かくタスクは協調きょうちょうする相手あいてタスクがべつプロセッサの並列へいれつせいなのか、どうプロセッサの並行へいこうせいなのかをにしない[6]。いわゆるマルチタスクOSでは、カーネルアプリケーションプログラムから複数ふくすうプロセススレッド生成せいせいされて、それぞれがタスクのになになる。並行へいこう計算けいさんレイテンシ・パフォーマンスけとされる。並行へいこう計算けいさん対義語たいぎごはシーケンシャル計算けいさん(sequential computing)であり[3]、タスクがひとつずつ実行じっこうされる。

並列へいれつ計算けいさん・シリアル計算けいさん並行へいこう計算けいさん・シーケンシャル計算けいさん適性てきせいしたのようになる。

  • スレッドAの完了かんりょうに、スレッドBが実行じっこうされる(シリアル・シーケンシャル)
  • スレッドAと、スレッドBが交互こうご実行じっこうされる(シリアル・並行へいこう
  • スレッドAと、スレッドBが同時どうじ実行じっこうされる(並列へいれつ並行へいこう

並行へいこう計算けいさんシステムの設計せっけいにおける主要しゅよう課題かだいは、タスクあいだ相互そうご作用さよう通信つうしん順序じゅんじょけとタスクあいだ共有きょうゆうするリソースへのアクセスである。そこではスレッドあいだ通信つうしんやプロセスあいだ通信つうしん意識いしきして開発かいはつおこな必要ひつようがあり、通信つうしんもちいるプロトコルの開発かいはつ必要ひつようとなる。

リソース共有きょうゆうアクセス調整ちょうせい[編集へんしゅう]

並行へいこう計算けいさんもっと身近みぢか課題かだいになるのは、複数ふくすうのプロセス/スレッドでひとつのリソース共有きょうゆうするためのアクセス調整ちょうせいをする並行へいこうせい制御せいぎょである[7]。ここでよく沙汰ざたされるのは競合きょうごう状態じょうたいデッドロックリソース欠乏けつぼうなどである。した共有きょうゆうリソースのコードれいである。

boolean withdraw(int withdrawal) {
    if (balance > withdrawal) {
        balance = balance - withdrawal;
        return true;
    } 
    return false;
}

ここでbalance=500としてプロセスAとプロセスBをはしらせる。Aがwithdraw(300)を、Bがwithdraw(350)をコールする。Aが2ぎょうtrueえて3ぎょうはいまえに、Bが2ぎょうはいるとbalance > withdrawalはここでもtrueになってしまい、AとBの双方そうほう減算げんざんしてbalance=-150となり、口座こうざ残高ざんだか以上いじょう金額きんがくとされてしまうことになる。こうしたリソース共有きょうゆう問題もんだい並行へいこうせい制御せいぎょでは、クリティカルセクションロックセマフォミューテックスモニタなど)同期どうきがよく使つかわれる。

並行へいこうシステムは共有きょうゆうリソース(通信つうしん媒体ばいたいふくむ)に依存いぞんしているため、並行へいこう計算けいさん一般いっぱんにリソースへのアクセスにかんするなんらかの調停ちょうてい回路かいろ実装じっそうする必要ひつようがある。これにより制限せいげん決定けっていせい問題もんだいしょうじる可能かのうせいてくるが、調停ちょうてい回路かいろ注意深ちゅういぶか設計せっけいすればその可能かのうせいかぎりなくゼロにちかづけることができる。だが、リソースじょう衝突しょうとつ問題もんだいへの解決かいけつさく数々かずかずあるが、それら解決かいけつさく複数ふくすうのリソースがかかわってきたときに、あらたな並行へいこうせい問題もんだい同期どうきデッドロックなど)をしょうじる。ブロックアルゴリズムはそれらに対応たいおうできる並行へいこうせい制御せいぎょとされる。

並行へいこう計算けいさんのモデル[編集へんしゅう]

数々かずかず並行へいこう計算けいさんモデルが提唱ていしょうされている。

一貫いっかんせいモデル[編集へんしゅう]

一貫いっかんせいモデル(consistency models)はメモリモデルともよばれており、複数ふくすうのプロセス/スレッドが同時どうじにデータ領域りょういきみ/みをおこなっても、シーケンシャル計算けいさんまったおな結果けっかられるようにするための計算けいさんモデルである。一貫いっかんせいモデルの実装じっそうでは、共有きょうゆうメモリ通信つうしん分類ぶんるいされるクリティカルセクションロック同期どうきがよく使つかわれる。

並行へいこう計算けいさん実装じっそう[編集へんしゅう]

並行へいこうプログラムには数々かずかず実装じっそう手法しゅほう存在そんざいする。大抵たいていオペレーティングシステム提供ていきょうするプロセススレッド同時どうじ走行そうこうとその相互そうご通信つうしん実装じっそう枠組わくぐみにされる。プロセスぐんとスレッドぐん並行へいこう走行そうこうによる複数ふくすう作業さぎょう同時どうじ実行じっこう可能かのうせいマルチタスクなどとわれる。

相互そうご作用さよう通信つうしん[編集へんしゅう]

並行へいこうコンポーネントあいだ通信つうしんには、たとえば以下いかとおりがある。

ケース1相互そうご通信つうしん明示めいじてき操作そうさ要求ようきゅうする形式けいしき

同期どうき傾向けいこうになる。明示めいじてき操作そうさ特別とくべつなプログラム構文こうぶん必要ひつようにする。ソフトウェアトランザクショナルメモリクリティカルセクション同期どうきなどのモデルにしたがっての実装じっそうになる。
共有きょうゆうメモリ通信つうしん
並行へいこうコンポーネントたちは共有きょうゆうメモリの内容ないよう更新こうしんすることで通信つうしんおこなう。JavaC#もちいている。クリティカルセクションさだめてロックオブジェクトをもちいての同期どうきでその範囲はんい並行へいこうせい制御せいぎょする。ロック手法しゅほうにはセマフォミューテックスモニタバリアきロックなどがある。スレッドセーフ重視じゅうしされている。


ケース2相互そうご通信つうしんをプログラマから隠蔽いんぺいする形式けいしき

非同期ひどうき傾向けいこうになる。うえ明示めいじてき操作そうさをコード評価ひょうか/呼出よびだしやデータ参照さんしょう/代入だいにゅうといった標準ひょうじゅん構文こうぶんでまかなえる。プロセス計算けいさんFutureパターンなどのモデルにしたがっての実装じっそうになる。
メッセージパッシング通信つうしん
並行へいこうコンポーネントたちはメッセージの交換こうかん通信つうしんおこなう。ErlangGoScalaOpenMPIOccamなどがもちいている。メッセージ交換こうかん通常つうじょう非同期ひどうきだが、チャネル英語えいごばんという同期どうき形式けいしきもあり、こちらでの送信そうしんがわ受信じゅしんがわがメッセージに応答おうとうするまで待機たいきする双方向そうほうこう通信つうしんになる。
非同期ひどうきなメッセージ交換こうかんでの送信そうしんがわは、受信じゅしんがわがいま応答おうとうできるかどうかに関係かんけいなくメッセージをおくれるたん方向ほうこう通信つうしんになる。これはおくっていのる(send and pray)と形容けいようされている。ここでの送信そうしんがたは、メッセージをおくるとすぐにfutureやpromiseとばれる抽象ちゅうしょうてき応答おうとうオブジェクトをれるので基本きほんてき待機たいきすることはない。メッセージパッシング通信つうしんは、共有きょうゆうメモリ通信つうしんよりも平易へいい堅牢けんろうであるが、オーバーヘッドがおおきいともかんがえられている。メッセージパッシングには数々かずかず数学すうがくてき理論りろんがあり、アクターモデルプロセス計算けいさんなどが有名ゆうめいである。

並行へいこうプログラミング言語げんご[編集へんしゅう]

並行へいこうプログラミング言語げんごは、並行へいこうせいのための構造こうぞうそなえたプログラミング言語げんごである。具体ぐたいてきには、マルチスレッド分散ぶんさんコンピューティングメッセージパッシング英語えいごばん共有きょうゆうリソース共有きょうゆうメモリ)、Futureパターンのサポートなどである。

現在げんざい[いつ?]並行へいこうせいのための構造こうぞうそなえたもっと一般いっぱんてき言語げんごJavaC#である。これらの言語げんご共有きょうゆうメモリがた並行へいこうせいモデルを基本きほんとし、モニタによるロックをそなえている(メッセージパッシングモデルを共有きょうゆうメモリモデルじょう構築こうちくすることも可能かのう)。メッセージパッシングがた並行へいこうせいモデルの言語げんごとしては、Erlangもっともよく使つかわれている。

研究けんきゅう目的もくてき開発かいはつされた並行へいこうプログラミング言語げんごPictなど)は実用じつよう目的もくてきとしたものよりおおい。しかし、Erlang、Limbo、Occam といった言語げんご過去かこ20年間ねんかんなん商用しょうよう使つかわれてきた実績じっせきがある。並行へいこうプログラミング言語げんごとして重要じゅうようおもわれるものを以下いか列挙れっきょする:

  • Ada
  • Afnix – データへの並行へいこうアクセスは自動的じどうてき保護ほごされる(従来じゅうらいAlephばれていたが、Alefとは無関係むかんけい)。
  • Alef – スレッドとメッセージパッシングをそなえた言語げんご初期しょきPlan 9のシステム記述きじゅつ使つかわれた言語げんご
  • Alice – Standard ML に Future による並行へいこうせいサポート機能きのう追加ついかしたもの
  • CDL (Concurrent Description Language) – machine translatable(機械きかいてき変換へんかん可能かのう)、構成こうせい可能かのう、オブジェクト指向しこう、ビジュアルプログラミング言語げんご
  • ChucK – 音響おんきょう関連かんれん専用せんようのプログラミング言語げんご
  • Cilk – 並行へいこうばんC言語げんご
  • Clojure – LISPけい言語げんご、JVMじょう動作どうさする。
  • Concurrent C
  • Concurrent Clean関数かんすうがた言語げんごHaskellちかい。
  • Concurrent Pascal – by Per Brinch Hansen
  • Corn
  • Curry
  • Cωおめが – C オメガ。C#に非同期ひどうき通信つうしん追加ついかした研究けんきゅうよう言語げんご
  • E – Future機能きのう使用しよう。デッドロックを発生はっせいさせない。
  • Eiffel契約けいやくプログラミングもとづいたSCOOP機構きこうによる。
  • Erlang共有きょうゆうのない非同期ひどうきメッセージパッシングを使用しよう
  • Janus – 宣言せんげんがた言語げんご論理ろんり変数へんすうなどをaskerとtellerに明確めいかく区別くべつする。
  • Join Java – Javaもとづいた並行へいこうプログラミング言語げんご
  • Joule – データフロー言語げんご。メッセージパッシングによって通信つうしんする。
  • KL1Guarded Horn Clausesもとづく論理ろんりがた言語げんごだい世代せだいコンピュータプロジェクトの研究けんきゅう成果せいかKLICなどの実装じっそう利用りよう可能かのう
  • Limbo – Alefからの派生はせい。Plan 9の後継こうけいであるInfernoのシステム記述きじゅつ使つかわれた。
  • Oz – マルチパラダイム言語げんご共有きょうゆうメモリとメッセージパッシング、Futureもそなえている。
  • MultiLisp – Scheme並列へいれつせいサポート機能きのう追加ついかした派生はせい言語げんご
  • OccamCommunicating Sequential Processes (CSP) の影響えいきょうつよけている。
  • Pict – ミルナーのπぱい計算けいさん実装じっそうもとづいている。
  • SALSA – インターネットじょうでの分散ぶんさんコンピューティングを指向しこうしたメッセージパッシングしき言語げんご
  • SR – 研究けんきゅうよう言語げんご

おおくの言語げんごでもライブラリのかたち並行へいこうせいをサポートしている(機能きのうてきにも上記じょうきリストにげたものと遜色そんしょくない)。

関連かんれん項目こうもく[編集へんしゅう]

脚注きゃくちゅう[編集へんしゅう]

  1. ^ Operating System Concepts 9th edition, Abraham Silberschatz. "Chapter 4: Threads"
  2. ^ Pike, Rob (2012-01-11). "Concurrency is not Parallelism". Waza conference, 11 January 2012. Retrieved from http://talks.golang.org/2012/waza.slide (slides) and http://vimeo.com/49718712 (video).
  3. ^ a b Patterson & Hennessy 2013, p. 503.
  4. ^ Parallelism vs. Concurrency”. Haskell Wiki. 2020ねん1がつ閲覧えつらん
  5. ^ Schneider, Fred B. (1997-05-06). On Concurrent Programming. Springer. ISBN 9780387949420 
  6. ^ Ben-Ari, Mordechai (2006). Principles of Concurrent and Distributed Programming (2nd ed.). Addison-Wesley. ISBN 978-0-321-31283-9 
  7. ^ Ben-Ari, Mordechai (2006). Principles of Concurrent and Distributed Programming (2nd ed.). Addison-Wesley. ISBN 978-0-321-31283-9 

参考さんこう文献ぶんけん[編集へんしゅう]

外部がいぶリンク[編集へんしゅう]