IoArgsスケジューリングの最適化バッファ三のデータ

まず、3つのバッファ

パケット

IoArgs

フレーム

 

第二に、3つのマネージャー

パケットはAsyncSendDispatcherまたはAsyncReceiveDispatcherです

フレームはAsyncPacketReaderまたはAsyncPacketWriterです

ByteBufferを保持している中、漠然とIoArgs IoArgsは、彼女はこれが送られるべきか、データ・ストレージ・スペースを受信することがあります。

三、IoArgsは、それが最も近いネットワークと現在のバッファを運び、ByteBufferのを開催しました。それは、最も近いネットワークバッファであるので、ここでデータ出力直接またはネットワークに、ネットワークから直接データを受信します。、IoArgsを送信し登録して、送信者がインターフェースを呼び出すために最初に送られたときしかし、この時間IoArgsはリーダーによって提供されます。送信者にリーダIoArgs後、送信側はこれにデータが送信されます。インタフェースを介して成功または失敗のコールバックを送信するためとして。書き込み操作のために同じプロセスです。

いくつかの問題があるだろうときIoArgsにフィルデータを通じて読者は、送信者、送信者に、送信側はデータを送信するとき、それは完全に現在のIoArgs内のすべてのデータの送信を終了することはできません、それがAに入ります無限ループ。

outputCallbackは、スレッドプールをスケジュールするスレッドによる出力、outputCallbackあり、かつ適切なrunメソッドを実行します。

これは、実際に出力を動作させることができ、あるrunメソッドで実行可能な、コールcanProviderOutput()メソッドです。この時点で、IoArgsを取得し、データを取得することです。

IoArgsを得るために、書き込み動作の後、チャネルへのチャネルを書き込みます。args.writeTo(チャネル)。

彼らは返すことができます前にサイクルがある書き込みの時間が経過した後、それが現在のデータに書き込まなければなりません。

IoProviderは、クライアントがデータを送信できるかどうかを伝えるためにセレクタを渡します、あなたが送信することができたときに、この時間は、出力データSocketChannelへの意志それらに状態に書き込まれますが、データ出力のSocketChannelの一部されたときに、カードの準備ができていますカードのリソースがそれを現在のSocketChannel書き込み動作である別のSocketChannelへ与える場合、長さは0.0、平均故障、出力操作は、現在のデータを表すことができないない戻すことができます。この時点で、正しいアクションが現在のサイクル、再登録のセレクタを放棄することで、あなたはそれはまた、私はデータを送信し続けることをデータバックと再スケジューリングの私を送ることができる必要がある場合、完了です何のデータ送信がないと述べました。

出力を強制した場合、現在のSocketChannelはデータ、完全に別のSocketChannelで送信することができ、実際のデータを送信することができないという問題が発生します。現在のスレッドによって占有され、他のスレッドのスケジューリングのSocketChannel送信することはできません。しかし、それはスケジュール全体のパフォーマンスに影響します。

したがって、我々は最初の改革がここSockeetChannelAdapterポイントである必要があり、我々は現在の判決文の変換を見てする必要があります。

まず、0の現在の戻り値は、現在のデータを送信することができない場合ことを示しています。

ある場合、データ出力は、再びがあるかどうかを判断するために、再び送信するために登録。何のデータ出力がない場合、コールバックが送信されています。

ときに再登録は、セレクタを再登録し、キュー内部に再追加されます。それが再び準備ができたら、それはcanProviderOutput()、今回は(再びprocessor.provideIoArgsがトリガーされます)、IoArgsないこの時点でIoArgs前に、それは新しいIoArgsあるに戻ります。

あなたはそれがIoArgsに送信される前に継続する必要がある場合、我々は保存付けるコールバックでフィールドを追加する必要があります。

outputCallbackに修正

 

法でのwriteTo

変更

 

第三に、読み出し動作

inputcallbackに修正

あなたはstartReading()と(中readFromでfinishReading)を呼び出した場合、最後の秋受信したデータの消失、そのコールAsyncReceiveDispatcherを変更する必要性をもたらすことができます

コールコール新しいIoArgsは、データ操作を書き始めます

消費データに先立ち、完成された書き込みデータのメソッドを呼び出します

inputCallback SocketChannelAdapter outputCallbackコールバックと、キャリアの第三の層又は読み出し動作消費をバッファに十分時間を充填しないデータまたはIoArgsがある場合、それが完了するまで、スケジューリングは、コールバックを介して循環されるか、消費彼は、すべての完成を埋めました。

だから、ここで外部スケジューリング、非同期レシーバpostReceiveAsyncの(登録)または非同期伝送PostSendAsyncを(レジスタ)空の場合にコールバックがない場合は、正しい状態の代表的な、現在の追加セクションが空であるかを決定、決意で行いますコールバック自体はまだ、それはそれは再度登録に外部からの自己循環理論と呼ばれるべきではありませんされていることを示す、空です。

公開された174元の記事 ウォンの賞賛115 ビュー830 000 +

おすすめ

転載: blog.csdn.net/nicolelili1/article/details/105137198