web-dev-qa-db-ja.com

大規模な並行プログラミングの割り当てはどこから始めればよいですか?

私の仕事は 分散セマフォシステム (説明へのリンク)とそのアプリケーションを実装することです。 Javaソケットを使用し、ウォーターマーク配列と優先キューを使用するので(場所は不明))、このプロジェクトへの取り組み方に興味があります。具体的には、最初の良い目標、つまり実装できる単純なサブシステムが何かはわかっていますが、現時点では、どこに注意を向ければよいかわかりません。

アプリケーションは、フローティングライセンスシステムです。ソフトウェアのコピーが1つしかないコンピューターラボ(CADプログラム)のように、一度に1台のPCのみがソフトウェアを使用できるようにします)のようなものです。 1台のマシンがソフトウェアを使用している場合、ソフトウェアへのアクセスはロックされます。そのマシンを使用して完了すると、そのマシンは放棄され、最初に要求した人が次になります。

参照されている疑似コードアルゴリズムは次のとおりです- http://i.imgur.com/q9kRm.png

8
Adel

「ハンドシェイク」サブシステムから始めることを検討してください。特定のマシンで実行されているライセンスアプリケーションがライセンスサーバーでセッションを登録し、それを一意に識別するトークンを取得して、さらにやり取りできるようにするサブシステムです。

このサブシステムには、追加の通信プロトコルに関する「ネゴシエーション」も含めるのが妥当だと思います(「ハートビート信号は、5〜10秒の速度で交換されると予想されます」など)。

次の論理的なステップはおそらく、「ハートビート」モジュールのようなものを確立することでしょう-登録されたマシンとサーバーに許可するモジュール...おっと、ごめんなさい最初のステップの目標それは適合しません。

5
gnat

一般的な回答

セマフォは、優先キューを介してデッドロックと競合状態を管理するためのリソース割り当て手法です。比喩的に言えば、自転車を3台レンタルできます。先着順で採用するとします。したがって、3台すべての自転車をレンタルし、4人目がそれを要求した場合、そのうちの1人が自転車を返却するまで彼は待たなければなりません。誰かのために自転車を予約したり、誰かがすでに予約した自転車をキャンセルしたりする可能性があります。いくつかのリソースを取得したいプロセスの場合と同様に、セマフォが使用されます。

分散セマフォの場合、複数のプロセスがアクセスできる複数のリソースが存在する可能性があります。サーバーがアプリケーションをホストし、そのアプリケーションの複数のインスタンスをホストでき、ユーザーがアプリケーションを無料で使用できると想定します。サーバーをS1、S2、.. Snとし、アプリケーションをA1、A2、... Anとし、ユーザーをU1、U2、... Unとします。したがって、最初のサーバーがアプリケーションの3つのインスタンスをホストできる場合、S1A1、S1A2、S1A3と表示されます。また、理解しやすいように、アプリケーションインスタンスをスロットまたはボックスとして想定します。スロットは、空いている場合は空であり、ビジーの場合はいっぱいであると見なされます。したがって、この場合、次の方法が推奨されます

  • ユーザーがアプリケーションを要求する
  • 要求は優先キューに渡されます。
  • キューは継続的なバックグラウンドプロセスを実行して空きスロットを検索し、空きスロットが見つかると、リクエストをアプリケーションに渡して処理を開始します。
  • スロットがリクエストを受け取ると、彼らは自分にビジーとマークして処理を開始し、処理が終了すると自分に空きをマーク
  • スロットは定期的にステータスをキューにブロードキャストし、スロットが解放されたらキューがリクエストを転送できるようにします

推奨リソース

  • このモデルは、集中型のメッセージブローカリングに基づいています。リクエストを処理するキューは常に利用可能である必要があります。別の方法で実装できるブローカーなしのモデルもあります。
  • セマフォプログラミング Wikipedia
  • セマフォに関するリトルブック は、自由に利用できる優れたリソースです
  • セマフォは共有メモリモデルに基づいています。 Actor Modelは、この問題を別の方法で解決するための新しい洞察を提供します

コンテキスト内の質問に対する具体的な回答

コードを見ると、私はセマフォのクラシックバージョンを好みます。 Javaには、これを行うための組み込みの semaphore パッケージがあり、簡単にビルドできます。

具体的には、最初の目標として何が良いのか、または実装できる簡単なサブシステムについて知りたいのですが。

アプリケーションの1つのインスタンスのみをLANで実行する必要があると想定

  • 上記のパッケージを使用してください
  • 組み込みのキューメカニズム(スタックと同様)でセマフォを作成し、サーバーとして実装します。
  • ユーザーがアプリケーションを起動すると、セマフォを検索し、カウントを減らします(この場合、許可されるインスタンスは1つだけなので、この場合は0)。ユーザーはアプリケーションにアクセスできます。
  • 他のユーザーがアプリケーションを起動すると、セマフォが0であるため、セマフォを検索し、ユーザーをキューに入れ、アプリケーションがビジーであるというメッセージをユーザーに提供します。
  • 最初のユーザーがアプリケーションを終了すると、セマフォが増加し、リソースが使用可能になり、ユーザーは親密になり、アプリケーションを開始できるようになります。
  • セマフォは、アプリケーションと組み合わせることができるスタンドアロンのサーバーとして(おそらくシンプルなWebインターフェースを使用して)実装できます。

次の警告は考える価値があります

  1. キューは完全にフラッシュされるか、優先度を変更できます
  2. サーバーとしてのアプリケーションと結合するには、LANにサーバーのバージョンが1つしかないことが必要です。
  3. クラッシュまたは無人メッセージキューの準備(ユーザーがアクセスを要求するが、アプリケーションがフリーの場合は利用できない)

理解を深めるために、次のことをお勧めします

  • フォロー 理解を深めるためのこのリンク
  • [〜#〜] scala [〜#〜] を試してください。既存のすべてのJavaライブラリを使用できるほか、優れた同時実行性が得られます
  • [〜#〜] zmq [〜#〜] をご覧ください。リソース全体と対話する別のメッセージングアプリケーションにプロセス全体を抽象化する場合、これはオプションになる可能性があります
  • AutoCADライセンスシステムについて読む(要件のいくつかに一致するライセンスモデルを実装しています)

[〜#〜] edit [〜#〜]元の回答はより広い視野に基づいているため、完全に編集された回答

8
Ubermensch