Java I/OとNIOネットワーククリーンアップ15:コレクター


1. 🍕 コレクタの概要


SelectorはReactorの役を演じます.
Reactor 非ブロックサーバの実装の基礎は、イベント中心のアプリケーションが、1つまたは複数のクライアントから同時に送信するサービス要求をサービスプロバイダと区別することである。

すなわち、複数のオプションチャネルIOは、複数のオプションチャネルを登録し、登録されたSeletableChannelのイベント要求を適切なサービスプロバイダに送信することができる.
多機能IO マルチストリームIOは、複数のIOチャネルを同時に管理できるスレッドであり、既存のサーバよりも高速で、より多くの同時ユーザを収容できる拡張可能なサーバを作成します。

2. 🍔 既存のIOモデルネットワークプログラミングレポートセレクタの機能について


既存のIOはブロックIOです.
閉塞IOとは? 特定のデバイスで読み取り/書き込み操作を行う場合、データが利用可能になるまでIO操作を実行するスレッドを待つ
Socket s = serverSocket.accept()
			
InputSream in = s.getInputStream()
OutputStream out = s.getOutputStream();

in.read()

out.write()

s.close
この構造のサーバは、単一スレッドに基づいて、1つのリクエストしか処理できません.
この問題を解決するには、マルチスレッドベースのサーバという2つの方法があります.
マルチスレッドベースの欠点 マルチスレッドベースのサーバには多くの問題があります。 クライアント数が増加するにつれて、スレッド数も増加します。 マルチスレッド生成によるスレッドコンテキスト切替負荷 約1000個以上のスレッドが作成されると、スレッドがスイッチ負荷をテストするため、パフォーマンスが急激に低下します。 スレッド自体にCPUと高可用性があり、コンピュータのリソース負荷を引き起こす可能性があります。 クライアントの頻繁な接続とシャットダウンにより、不要なデータが大量に発生 サーバメモリが不足するとOutOfMemoryExceptionが発生する可能性があります

多くの問題があるため,第2の非ブロックモードを採用した.

3. 🍟 ノンブロッキングモデル


Selector、Selectable Channel、およびSelectonKeyクラスは、マルチストリームモデルサーバを作成するコアです.
作成したバインド済みチャンネル(SelectableChannel)を、発生するイベントとともに登録します。 選択した鍵を登録に関連するチャンネルとセレクタの間にカプセル化します。 戻り値としてキーを選択 SelectonKeyは、どのチャンネルにどのセレクタが登録されているか、チャンネルがセレクタに登録されているときにどのモードで登録されているか、操作の準備ができているかを保存します。

4. 🌮 SelectableChannel


SelectableChannelは、ブロック処理、非ブロック処理モード、およびセレクタにチャネルを登録する機能を有する.
非ブロッキングと多重化が相互に連携しているためである.
sel : Selector 객체,ops : 어떤이벤트를 발생시키고 싶은지 확인하는 값 , att : 참조할객체를 함께 등록
public abstract SelectionKey register(Selector  sel, int ops)
public abstract SelectionKet register(Selector sel, int ops, Object att)

次に、ソケットチャネルをSelectorに登録するコードテンプレートを示します.
ServerSocketChannel server = (ServerScoektChannel) key.channel();
SocketChannel sc = server.accept();
boolean isRegist =  registerChannel(selector, sc, SelectionKey.OP_READ);

private boolean registerChannel(Selector selector, SelectableChannel sc, in ops)
throws ClosedChannelException, IOException{
	if(sc==null){
    return false;
    }
	sc.cofigureBlocking(false);
    sc.register(selector, ops);
    
    return true;
}
Selectorは、イベントが発生したチャンネルのみを選択し、その間にすべてのイベントのコントローラとして機能し、各イベントに対して対応する動作を実行します.

5. 🥞 SelectionKey


選択キーは、特定のチャネルとセレクタの関係をカプセル化します.
特定のセレクタにregister()メソッドとして登録されている場合、セレクタに登録されている操作の関心セットが格納されます.
カプセル化は、機密データの保存と保護です。 カプセル化(capsulation)は、通常、関連変数と関数をクラスにグループ化する操作です。

OP ACCEPTクライアントがServerSocketChannelに接続しようとすると、OP CONNECTサーバがクライアントの接続を許可する場合が発生します.OP READサーバがクライアント要求を読み取ることができる場合に発生する.OP WRITEサーバクライアントが応答を書き込むことができる場合に発生します.
if((key.readyOps()& SelectionKey.OP_READ) != 0) {
	...
    // 읽기 작업을 수행한다
    ```
}

6. 🥙 Selector


Selectorは、チャネルやストリームなどのデータ転送用のクラスではありません.
Selectorは、登録チャネルによってトリガーされるイベントの要求を制御するための適切な処理ハンドラであるオブジェクトです.