ACE反応器(Reactor)モードの深さ分析


反応器(Reactor):イベントの多重分離および分派のための体系的構造パターンは、通常、1つのファイル・ディスクリプタに指定されたファイルまたはデバイスに対して、2つの動作方式がある:ブロックとブロックではない。ブロック方式とは、このファイルの記述子を読み書きしようとした時に、読むものがなかったり、書いてはいけないものがあったら、プログラムは待ち状態に入ります。閉塞状態ではなく、読み物がなければ、書いてはいけません。読み書き関数はすぐに戻ります。待つことはありません。前の章で述べたTcp通信の例では、tcpデータを受信すると、遠端にデータがないと、必要なデータを読むまでブロックされます。このような伝统的な受动的なアプローチの呼び出しと同様に、非常に直感的で効果的ですが、効率的な问题もあります。もし、数千の接続に直面したサーバプログラムを开発するなら、各クライアントに対してブロック方式で通信します。他のクライアント通信は応答できなくなり、効率が非常に低下します。一般的な方法としては、ソケット接続を確立するごとに、新しいスレッドを作成して、そのソケットを個別に通信する(ブロック方式で通信する)というものがあります。このような方式は応答速度が高く、制御も簡単で、接続数が少ない場合には非常に有効であるが、各接続に対して一つのスレッドを生成するのはシステムリソースの無駄であり、接続数が多いとリソースが不足する場合がある。もう一つの効率的な方法は、サーバ端末がソケット接続リストを保存し、このリストをポーリングし、あるソケットポートにデータが読み取り可能であることが発見されたら(読み出し完了)、そのsocket接続の対応する読み取り動作を起動することである。あるソケットポートにデータが書き込み可能であることが発見された場合(書き込み完了)、そのsocket接続の書き込み操作を呼び出します。あるポートのソケット接続が中断された場合、対応する解析方法を呼び出してポートを閉じます。このようにサーバーの資源を十分に利用することができ、効率が大幅に向上しました。ソケットプログラミングにおいては、selectなどの関連APIを通じて実現できる。しかし、これらのAPIを直接制御するのは面倒で、制御と移植も難しく、ACEではReactorモードによってこの開発過程を簡略化することができる。
反応器は本質的により高度なプログラミング抽象のセットを提供し、イベント駆動の分散アプリケーションの設計と実現を簡略化した。それに加えて、反応器はいくつかの異なる種類のイベントの多重分離を使用しやすいAPIに統合する。特に、反応器は、タイマに基づくイベント、信号イベント、I/Oポート監視に基づくイベントおよびユーザ定義の通知を一括して処理する。ACE中の反応器はいくつかの内部および外部構成要素と協働して動作する。その基本的な概念は、イベントの発生を検出するための反応器フレーム(OSイベントの多重分離インターフェース上でリッスンすることによって)であり、イベントプロセッサ(event handler)オブジェクトにプリ登録された方法の「コールバック」を発行することである。この方法は、このイベントを処理するための特定のコードを含むアプリケーション開発者によって実現される。ACEの反応器を使用して、次のステップだけが必要です。イベントプロセッサを作成して、彼の興味あるイベントを処理します。反応器に登録して、ある事件を処理することに興味があると通知します。同時に彼がこの事件を処理するためのイベントプロセッサの指針を反応器に渡したいと伝えます。その後、反応器フレームは自動的に、内部でいくつかのテーブルを維持し、異なるイベントタイプをイベントプロセッサオブジェクトに関連付ける。ユーザが登録したあるイベントが発生したとき、反応器はプロセッサ内の対応する方法に対してフィードバックを送る。反応器モードはACEでACE_として実現される。Reactorクラスは、反応器フレームの機能インターフェースを提供します。上記のように、反応器はイベントプロセッサオブジェクトをサービスプロバイダとして使用します。反応器内部にあるイベントプロセッサの特定のイベントに関するフィードバック方法が記録されています。これらのイベントが発生すると、反応器は、このようなイベントと対応するイベントプロセッサとの関連付けを作成する。イベントプロセッサイベントプロセッサとは、上記の例では接続されたクライアントであるように、イベントが発生したオブジェクトリストの中のオブジェクトをポーリングすることによって変更する必要があり、各クライアントは、イベントプロセッサとして機能することができる。コールバックイベントは、ソケットが読み終わったら書き込みができます。上記の例を挙げると、あるクライアント(イベントプロセッサ)が反応器に読み取り完了イベントを登録し、クライアントがサーバにメッセージを送信すると、このクライアントのデータ読み取り可能なコールバック関数がトリガされる。反応器のフレームワークでは、すべてのアプリケーション特有のイベントプロセッサはACE_でなければなりません。イベントHandlerの抽象的なインターフェース類は派生します。リロードによって対応する「handle_」ができます。方法は関連するコールバック方法を実現する。ACE_を使うReactorは基本的に三つのステップがあります。ACE_を作成します。イベントHandlerのサブクラスは、その中で適切な「handle_」を実現します。このイベントプロセッサにサービスしたいイベントの種類を処理します。反応器のオブジェクトを呼び出すことによって、レジスターを呼び出します。handler()は、あなたのイベントプロセッサを反応器に登録します。イベントが発生した場合、反応器は、対応するイベントプロセッサオブジェクトの適切なhandle_を自動的にフィードバックする。方法。