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


8

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

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

ここに参照されている疑似コードアルゴリズムがあります-http://i.imgur.com/q9kRm.png


1
楽しいプロジェクトのようですね。良い「最初のステップ」は、アプリに実行状態をローカルネットワークに公開させることです。2つ目:他のアプリは、最初のアプリの実行中は実行を拒否できます。3番目に、アプリはキューに参加して、順番が来るまで待つことができます。最後に:アプリに順番待ちの場所を知らせます。おそらく、より良い場所を購入する機会を与えます。;-)
Sedate Alien 2011

回答:


5

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

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

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


8

一般的な答え

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

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

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

推奨リソース

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

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

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

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

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

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

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

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

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

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

EDITの オリジナルの答えははるかに広い視野に基づいているので、回答は完全に編集しました


この徹底的な回答をありがとうございました。あなたが提供した資料を読んでいます。主に、私が知っているのは、プロジェクトが図9.3のアルゴリズムを実装していることだけです。
アデル

1
@Adel Answerが要件に一致するように更新されました。リンクも変更
Ubermensch 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.