分散コンピューティング:ちょっとした理論

9年前、私はサンクトペテルブルクの大学でコンピューターの科目を教えるために「主な仕事からの暇な時間に」始めました。 そして比較的最近、驚いたことに、私たちの大学には、分散コンピューティングの問題に焦点を当てたコースがほとんどないことがわかりました。 そして、Habréでさえ、このトピックは十分に開示されていません! 今すぐ状況を修正する必要があります。



このトピックに記事または一連の記事を捧げたいと思いました。 しかし、その後、私は今年発行された分散コンピューティングの基礎に関する研究ガイドを作成することにしました(155ページの小さな本を読んでください)。 結果はハイブリッドです-本へのリンクを含む記事。 この本は無料で配布され、電子形式で入手できます。



プロローグの代わりに。 この記事の本文を始めて、なぜプログラマーが分散コンピューティングの理論的基礎を知る必要があるのか​​、もう一度疑問に思いました。 私は、すでにIT分野で働いている学生や専門家からこの質問を聞きました(そして聞き続けています)。 実際、たとえば、「分散コンピューティングの一連のイベントは線形ではなく、部分的に順序付けられている」ことを知っているのはなぜですか? いわば、この基本的な知識の日常の実用的な使用は何ですか?



私はためらうことなく配ることができる既製の記憶された答えを持っていないことを認めなければなりません。 したがって、たたみ込みで自分に負担をかけるたびに、また答えと引数が異なるたびに。 そして今、すべてが初めてのようです...



遠くから始めましょう。 そしてそれをより明確にするために-薬で。 なぜなら、医療のエラーになると、脳は活発に働き始め、強いdigりを生み出します:恐怖、恐怖、人を殺す可能性があるからです。 それらは何ですか? 彼らは何をしているのかわからないのですか?



私たちは皆、人体での操作を開始する前に、それでも医師はその内部構造と仕事の原則を研究することを非常に当然期待しています。 私たちは、何が中にあるのか、なぜそこにあるのかについての理論的な資料を長年詰め込むのではなく、外科医が切断と縫製の実践的なコースを取ることがはるかに重要であるという声明に絶対に反対します。 それでは、ネットワーク接続を備えたシステム(つまり、これまでほとんどすべてのシステム)の開発に携わるプログラマーが、「内部の内容とその理由」を知る必要がないのはなぜですか? なぜ最大の皮肉でITエラーが認識されるのですか? まあ、はい、まあ、バグ。 そして、 飲まない人はバグを作りませんか?! 名前を付けてください! いいえ、待っています! プログラマーの要件の中で、何らかの理由で、1つまたは別のプログラミング言語を習得する実用的なスキルが前面に出てくることがよくあります。 そして基本的には、基本概念、理論モデル、アルゴリズムを理解するための要件を完全に覆い隠してしまいます...そしてプログラマー自身、なんと罪なのか、砂漠で花のように枯れる「不必要な理論について」の会話の始まりで...奇跡そうではありません...



この主題に関するL.ランポートのちょっとした声明を引用します(少し下に、この声明をロシア語に翻訳しようとしましたが、オリジナルからあまり離れることはありません):



かなり長い間、私はコンピューターサイエンスの言語に力を入れてきました。 その重点の1つの結果は、C ++の専門家であるが、本来のことをするプログラムを書くことができないプログラマーです。 典型的なコンピューターサイエンスの対応では、プログラマーはC ++に加えて/の代わりに、適切なプログラミング/仕様/開発言語を使用する必要があります。 典型的な産業上の対応は、キーボードに猿を置き、そのコード内のエラーを自動的に見つけることで良いプログラムを得ることができるという理論に基づいて、より良いデバッグツールをプログラマーに提供することです。

より良いプログラムを手に入れる最善の方法は、プログラマーにより良い考え方を教えることだと思います。 思考は言語を操作する能力ではありません。 それは概念を操作する能力です。 コンピューターサイエンスは、言語ではなく概念に関するものでなければなりません。


かなり長い間、私はITのコンピューター言語にあまりにも多くの注意を払っていました。 そのような注意の過剰の結果として、C ++の専門家であるプログラマーが現れますが、これらのプログラムに必要なことを行うプログラムを書くことができません。 この問題に対するIT担当者の典型的な反応は、C ++に加えて/の代わりに、より適切な別の言語(プログラミング、仕様など)を使用することをプログラマに提案することです。 次に、ソフトウェア開発業界の典型的な状況から抜け出す方法は、明らかにキーボード猿に置き、そのコードのエラーを見つけて修正するだけで良いプログラムを得ることができるという前提に基づいて、より高度なデバッグツールをプログラマに提供することです

私の強い信念は、質の高いプログラムを得るためには、プログラマーにもっとよく考えるように教える必要があるということです。 考える能力は、コンピューター言語で動作する能力ではありません。 それは概念を操作する能力です。 情報技術の研究は、言語ではなく概念の研究に焦点を当てるべきです。


分散システムを構築する上で「概念」と「理論要素」がどのように重要になるかを説明するために、いくつかの簡単な例を見てみましょう。 はじめに-ユーザーA、B、C、およびX間の電子メールメッセージのグループ配布。ユーザーAがグループ全体に「総会議」という件名の電子メールを送信するとします。 ユーザーBとCは、「Re:General meeting」という件名のメッセージでグループ全体で返信します。



実際、イベントは次の順序で発生します。

  1. ユーザーAから送信された最初のメッセージ。
  2. ユーザーBはそれを受信し、応答を読み取って送信します。
  3. ユーザーCはAとBの両方のメッセージを受信し、AとBの両方のメッセージに基づいて応答を送信します。


ただし、メッセージ配信のarbitrary意的かつ独立した遅延により、一部のユーザーには異なるイベントシーケンスが表示される場合があります。 たとえば、次の図に示すシナリオによると、ユーザーのメールボックスXのメッセージは次の順序になります。

  1. トピック「Re:Re:General Meeting」を含むユーザーCからのメッセージ。
  2. 「総会」という件名のユーザーAからのメッセージ。
  3. トピック「Re:General Meeting」を含むユーザーBからのメッセージ。






ええ、それはメッセージが観測される順序、異なるプロセスによって観測される順序、がFIFOチャネルに対しても異なる可能性があることがわかります! しかし、観測された順序をどこでも同じにしたい場合(そして、まだ同期メッセージングを使用したくない場合)はどうでしょうか。 たとえば、対応する保証付きでトランスポートを記述する場合。 または、各レプリカがすべてのレプリカに対して同じ順序で着信要求を処理し、レプリカの状態が変わらないようにする複製された状態マシンを構築する必要がありますか? 質問は...



プロセスがメッセージングの助けを借りてのみ相互作用し、各プロセスが特定の光でランプをオン/オフすることに従事している分散システムの別の実装を考えてみましょう。 最初のプロセスで赤色光、2番目のプロセスで黄色、3番目のプロセスで緑色のランプを制御します。 そのような信号機システム。 次の図では、懐中電灯によるプロセスの包含が長方形で示され、シャットダウンが垂直線で示されています。 メッセージの送受信-矢印で。 質問:プロセスは、同時に点灯したライトを判別できますか?







したがって、非同期システムのこの実施形態では、プロセスは、赤色信号が黄色信号と同時に点灯したかどうかを判断できないことがわかります。 たぶんはい。 または多分そうではない...これは不明のままになります。 しかし、赤と緑のライトが同時に点灯していることは確かです。 つまり、分散システムの実行中にこの状態またはそのグローバル状態に到達したと言っても意味がないことがわかります。 同様に、非常に多くの場合、そのグローバル状態のセットに与えられた条件(述語)が満たされたかどうかは言えません! 再び質問:なぜですか?



チェンバレンに対する私たちの答え。 実際、非同期分散システムの操作に関連するこれらの質問や他の多くの質問に対する答えは、1つの記事のフレームワークに収めるのが非常に困難です。 そのため、複数の記事を一度に公開することにしました。 より正確には、記事の冒頭で示したように、電子形式で利用可能な分散コンピューティングの基礎に関する小さな本を提出してください。



分散コンピューティングの紹介>>



この本から次のことを学びます。





本の構成と読み方



最初は、この本を書くときにどのような目標が設定されていて、それが他の文学とどのように関係しているかを簡単に述べようとしました。 これは本の紹介の主題です。 必要なのは2ページを少し超えるだけなので、読む価値があります。



最初のセクションは、ほとんどがボルト論的であり、分散システムの「品質」機能に専念します。 分散システムが何であり、どのような要件が課されているのかわからない場合は、最初のセクションを読むのが理にかなっています。 受信者プロセスによって受信されたメッセージが送信者プロセスの時代遅れのアイデアを与える可能性があることを知っている場合、ちょうど遠方の星から私たちに来る光放射が過去のこの星の状態のアイデアを与えるので、最初の4つのポイントはスキップ:)それとは別に、セクション1.5「分散システムでの相互作用」に注目する価値があります。このセクションでは、分散システムの開発時に遭遇する可能性のある困難を示す簡単なタスクをいくつか示しました。 その後、これらの問題を理論的な知識で解決しますので、それらに精通する価値があります。



2番目のセクションでは、分散コンピューティングモデルと、これ以降の説明で使用される基本理論について説明します。 ある意味では、このセクションが重要です。 ただし、「セット/サブセット」、「バイナリ関係」、「等価関係」、「順序関係」、「線形/部分順序」などの用語を使用する準備が必要です。 このセクションでは、いくつかのステートメントの証拠を見つけます。 他のクラスのシステムと区別する分散システムの機能の本質的な特徴をより深く理解するためには、少なくとも見落とす(またはよりよく研究する)必要があるように思えます。



上記の理論に基づいて、3番目のセクションでは、最後に、より実用的なこと、つまり論理クロックのさまざまなメカニズムを検討します。 彼らの助けを借りて、システムで発生する可能性のある1つ以上のシーケンスにイベントを整理できます。これにより、分散システムのアルゴリズムの開発を大幅に簡素化できます。 1.5節「分散システムでの相互作用」で定式化された問題を解決するための論理クロックの使用例が示されています。



4番目のセクションは、通常の共有変数を使用せずに構築された基本的な分散相互排除アルゴリズムの研究に専念します。 これらのアルゴリズムの重要なアイデアは、分散システムにおける他の多くの問題を解決するためにも使用されます。 さらに、彼らの研究は、分散アルゴリズムのセキュリティと生存性を確保するなどの重要な問題を明らかにしています。 したがって、このセクションは、慣れるのに非常に役立ちそうです。



この本の対象は誰ですか?



この本の内容は、分散コンピューティングの問題の序論と見なされるべきです。 彼女はアカデミックな大学の環境から育ちました。あなたがこの分野で働き始めたばかりであれば、きっと役に立つでしょう。 分散システムとアルゴリズムの開発にすでにある程度の経験がある場合は、自分で何か新しいものを見つけて、コメントで意見を共有してください。 あなたがあなたの背後に長年の経験があり、このトピックの専門家であるなら、私があなたの考えや考えで私を補完できることを願っています。



何がいい?



本の内容があなたにとって有益で有益なものであるならば、私はうれしく思います-それを読んだ後にここに戻り、「ありがとう」を書く時間があるでしょう、私は感謝します。 さらに、コメント、質問、回答など、トピックに関するすべての資料を1か所に集めて、新しい生徒向けの新しいコースを含めて、全員をここに送りたいと思います。 あなたがあなたの考え、あなたの経験で資料を手伝って補うことができれば、私は二重に感謝します。 読んで知識を得て、あなたの仕事でそれを使ってください! 以下のリンクから今すぐPDF形式の本をダウンロードできます。



分散コンピューティングの紹介>>



頑張って!

ミハイル・コシャコフ



エピローグの代わりに。 「情報は、リソースとは異なり、共有されることを目的としています。」 ロバート清崎



All Articles