一般的な答え
セマフォは、優先キューを介してデッドロックと競合状態を管理するためのリソース割り当て手法です。比喩的に言えば、自転車を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インターフェースを使用して)実装できます。
次の警告は考える価値があります
- キューは完全にフラッシュされるか、優先度を変更できます
- サーバーとしてのアプリケーションと結合するには、LANにサーバーのバージョンが1つしかないことが必要です。
- クラッシュまたは無人メッセージキューの準備(ユーザーがアクセスを要求するが、アプリケーションがフリーの場合は利用できない)
理解を深めるために、次のことをお勧めします
- 理解を深めるには、このリンクをクリックしてください
- SCALAをお試しください。既存のすべてのJAVAライブラリーを使用できるほか、優れた並行性が得られます
- 見ていZMQを。リソース全体と対話する別のメッセージングアプリケーションにプロセス全体を抽象化する場合、これはオプションになる可能性があります
- AutoCADライセンスシステムについて読む(要件のいくつかに一致するライセンスモデルを実装しています)
EDITの
オリジナルの答えははるかに広い視野に基づいているので、回答は完全に編集しました