この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 12132|答える: 1

[通信] BIOとNIOの理解

[リンクをコピー]
掲載地 2019/05/17 15:34:50 | | |

要旨:BIOとNIOの理解
最近、ZooKeeperとMinaのソースコードを見て、どちらもJava NIOで実装されていることが分かりました。なので、NIOが何かを理解する必要があります。 以下はオンライン情報をもとにまとめた私自身の要約です。時間を節約するために、意味を理解できる限り気軽に図を描きました。

紹介:
BIO:同期ブロッキングIOです。サーバーの実装モードは一度に1つのスレッドを接続することです。つまり、クライアントが接続リクエストをした場合、サーバーは処理のためにスレッドを開始する必要があります。もしこの接続で何も起こらなければ、不要なスレッドオーバーヘッドが生じます。もちろん、スレッドプール機構を通じて改善できます。
NIO:同期非ブロッキングIOで、サーバー実装モードはスレッドごとに1リクエストです。つまり、クライアントから送信された接続リクエストは多重化器に登録され、接続にI/O要求があると多重化器が処理のためのスレッドを開始します。
AIO(NIO.2):非同期非ブロッキングIO。サーバー実装モードは実質的に1つのスレッドを要求し、クライアントのI/O要求はまずOSによって完了し、その後サーバーアプリケーションにスレッドの処理開始を通知します。

略歴
同期ブロッキングIOについてですが、オペレーティングシステムのネットワークプログラミングやあらゆる言語のネットワークプログラミングを学んだことがある方なら誰でも馴染みがあると思います。whileループではサーバーがacceptメソッドを呼び出し、受信クライアントの接続リクエストを待ちます。接続リクエストが受信されると、その通信ソケットに読み書き用の通信ソケットを設定できます。この時点では他のクライアントからの接続リクエストを受け取ることができず、現在接続されたクライアントとの操作の実行のみを待つことができます。
BIOが複数のクライアントリクエストを同時に処理したい場合、マルチスレッディングを使用する必要があります。つまり、受諾ブロックごとにクライアントリクエストを待ち、接続リクエストが受信されると通信ソケットが確立され、新しいスレッドが開かれてこのソケットのデータ読み書きリクエストを処理し、その後すぐに他のクライアント接続リクエストを受け入れて待機し、各クライアント接続リクエストごとに個別に処理されるスレッドが作成されます。回路図はおそらく次のようになります:
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/8107c3f773ad4d2aa1a5a476e650ef84/094528_zqyy.jpeg

この時点でサーバーは高い同時実行率を持ち、複数のクライアントリクエストを同時に処理できますが、スレッド数が増えるとメモリ資源を過剰に消費し、サーバーの動作が遅くなったりクラッシュしたりするという問題が生じます。NIOはこの問題をある程度解決できます。

NIO
同期型ノンブロッキングIOの鍵は、イベント駆動型のアイデアを採用してマルチプレクサを実装することです。
NIOとBIOの最大の違いは、複数のクライアントからのIOイベントを処理するためにスレッドを開くだけでよい点です。
これは複数のクライアントからのIOイベントを聞くことができる多重化装置です:
A. サーバーがクライアントの接続リクエストを聞くと、その通信ソケット(Javaのチャネル)を確立し、その後リピーチを続けます。
B. もしサーバーが通信ソケットを作成したクライアントから送信されたデータを受信した場合、対応するインターフェースを呼び出して受信データを処理します。複数のクライアントが同時に存在する場合は、そのデータも順に処理できます。
C. 複数のクライアントの接続リクエストを聞き、データリクエストを受け取り、送信できるデータがあるタイミングも聞く。
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/41709898aa0a4f8a830d7c348ed05fbb/094528_of9c.jpeg


簡単に言えば、1つのスレッドでマルチプレクシングインターフェース(Javaで選択)を呼び出して複数のクライアントからのIOリクエストを同時にブロック・受信し、IOリクエストが受信されると対応する関数が処理されます。

それぞれの応用シナリオ
この時点で、リクエストが届くと(同時に複数でも1つでも)、対応するIO処理関数が呼び出されて処理されることに気づいたかもしれません。
(1) NIOは、接続数が比較的短く(軽運転)、例えばJetty、Mina、ZooKeeperなど、すべてjava nioを基に実装されている接続数が多いシナリオに適しています。
(2) BIO方式は、接続数が比較的少なく固定されている場合、サーバーリソースが多く、アプリケーションに限定されるシナリオに適しています。





先の:AjaxとAxios、そしてfetchの違い
次に:オープンソースのジョブスケジューリングフレームワークQuartz
掲載地 2019/05/21 19:32:33 |
学ぶために
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com