序文
彼の過去のJava NIOこの子には、比較的弱いされているが、また、このための知識の前にチャンスを逃しました。そのため、この部分について学ぶために、最近の計画は、私はいつもこの子の内容を理解するために、トラブルを望んでいた、それは私のような友人を持っていると思います。しかし、それぞれがNIO、BIO、AIOのパニックは、のは、NIOのこの部分を知ってもらうために、いくつかの基本的な概念から始めましょう何を頼まれた、開始することができませんでした。
同期および非同期
同期および非同期のは比較的よく理解され、インターネットにも説明するためにたくさん持っています。私はよりよく理解することを望んで、人気のあるかもしれこれら二つの概念の個人的な理解を通じて説明しましょう。
同期より多くのタスクやイベントが実行されたときにイベントの背面または前面のタスクの実行中のタスクやイベントの順序の時に最前列には、彼らはこれらの実施後に実行する前に待機する必要があります場合は、一つ一つを注文する必要がありますされますタスクやイベントを並列に実行することはできません。2つのタスクは全体の使命の終わりと一致考えることができる前と後の同期タスクは、信頼性の高いタスクシーケンスになるように設計することができます。
非同期は、より多くのタスクやイベントが同時に並行して実行することができている、先行タスクが待ちタスクの裏にはつながらないだろう。ように同時に複数のタスクので、各タスク間の相互依存性は、それほど信頼性は保証することはできません。
同期フローチャート
非同期フローチャート
同期サンプルコード
パブリック 静的 ボイドTEST1(){ System.out.printlnは( ">>>>>>>>> TEST1 <<<<<<<<<<" )。 } パブリック 静的 ボイドTEST2(){ System.out.printlnは( ">>>>>>>>> TEST2 <<<<<<<<<<" )。 } パブリック 静的 ボイドTEST3(){ System.out.printlnは( ">>>>>>>>> TEST3 <<<<<<<<<<" )。 } パブリック 静的 ボイドメイン(文字列[]引数){ TEST1(); TEST2(); TEST3(); }
それらの実行後に実行待ちます実行、TEST3のTEST1とTEST2の方法に従って一つずつ注文してください。
非同期サンプルコード
パブリック 静的 ボイドTESTA(){ 新しいスレッド(){ @Override 公共 のボイドの実行(){ System.out.printlnは( ">>>>>>>>>テスタ<<<<<<<<<<" ); } } .start(); } 公共の 静的な 無効TESTB(){ 新しいスレッド(){ @Override 公共 ボイドラン(){ System.out.printlnは( ">>>>>>>>> TESTB <<<<<<<<<<" ); } }。 開始(); } 公共の 静的な 無効TESTC(){ 新しいスレッド(){ @Override 公共 ボイドラン(){ System.out.printlnは( ">>>>>>>>> TESTC <<<<<<<<<<" ); } } .start(); } パブリック 静的 ボイドメイン(文字列[]引数){ TESTA()。 TESTB(); TESTC(); }
これは、非同期コードの上に見ることができ、種皮、TESTB、TESTC三つの方法は、それぞれのタスクを実行するために、独自のスレッドを持って、それが依存しないので、5例は、タスクを待つ必要がありません。典型的な非同期処理機構。
3つのスレッドを持つ上記非同期達成するために、それはマルチスレッドは二つの概念である、非同期であることを意味するものではありませんが、マルチスレッドでは、非同期を実装する唯一の方法です。非同期モードは、マルチスレッドに加えて、達成するための他の方法を持つことができ、プロセスです。
人生の例では携帯電話は、唯一のタスクの実行に接続された他は成功したとみなされたときに同期させることと等価たち。そして、テキストメッセージを送信するには、受信者が正常に送信されたメッセージを受け取るかどうかに依存しない、非同期です。
ブロッキングとノンブロッキング
ブロッキングが実施中のタスクがあるときの条件は、リクエストの運用上のニーズを満たしていない場合、操作は、要求を送信することを意味し、それは条件が満たされるまで、我々は背後に他の作業を続行する前に、待機する必要があります。
非ブロッキングが実施中のタスクがある場合の条件は、リクエストの運用上のニーズを満たしていない場合、操作は、要求を送信することを意味し、それはフラグ情報がすぐに条件が満たされていないが、常に永遠に待つされていない通知を返します。
流れを遮断します
ノンブロッキングの流れ
一部の人々は常に同期、非同期、ブロッキング、非ブロッキングは、概念の二組は、ミックスを理解するために、実際には、2つの全く異なる概念です。
コンセプトのこのセットの同期および非同期の焦点は、タスクが先に全体のプロセスを待つためにつながるかどうかです。
この概念に焦点を当てたグループをブロックし、非ブロッキング要求は、それがフラグ条件を通知するメッセージを返すかどうかの動作条件を満たしていない場合ということで満足していません。
実際には、理解し、ブロッキングおよび非ブロッキングスレッドから理解することができるが、我々は通常、連絡遮断されて遅いタスクがある場合に、スレッドが発生したブロックされ、CPUは、フォローアップタスクの実行前に完了したタスクの遅い実装のために待機します。このタスクの実行が遅い、非ブロッキングスレッドのタスクを実行するために、彼らは、他のことを行います遅いタスクの実行が完了すると、戻ります。一見非ブロッキングが大幅に効率を向上させることができるだけでなく、スレッド切り替えシステムは、時間の損失を引き起こす可能性がありますので、必要かつ合理的な使用ではあるが。
同期および非同期IO IO
IO同期はIO操作の実装でスレッドは、IO操作の前にスレッドが完了したとき、それはブロックされることを意味します。
非同期IOは、IO操作の実装でスレッドは、スレッドがブロックされない場合、ことを意味します。
IO操作は、実際のプロセスを持って、我々はネットワークIOを取る、例えば、IOは、主に2つのオブジェクトを必要とするネットワークは、一つはIOスレッドを呼び出す必要があり、もう一方は、システムのカーネルです。読み出し動作が発生した場合、それは二つの段階を通過します。
1、準備ができたデータを待っています。
2、IOスレッドを呼んでいた呼び出すためにカーネルからデータをコピーします。
IOモデルとの間の主な違いは、ブロックされている場合、我々は、第二段階こと、カーネルからのデータは、スレッド(またはプロセス)にコピーする、同期および非同期の差について話している、上記のこれら二つの段階で非常に重要です同期するための非同期がブロックされていません。これは、ユーザースレッドに依存している、と説明がブロックされていないが、ユーザスレッドに依存し、カーネルに依存しないので、非同期オペレーティングシステムカーネルサポートの必要性がある。この相の指示を遮断しました。
IO IOをブロックし、非ブロック
私たちの上に、同期、非同期IOとIOは、最初に発生した、それは第二段階のIO操作の違いを同期と非同期、プレゼンテーションに来るとき、私たちはIO IOをブロックし、非ブロックについて話しているこの祭りは、IO操作であります相。
IOはIOをブロックしているとき、動作する準備ができているスレッドがIO動作要求を開始したときに、データシステムは、それをチェックkernel'llことを意味し、ブロッキング、データの準備ができていない動作して発見されたデータの準備ができるまで、それは永遠に待機します。データが準備されていない場合、それは非ブロックIOであるとき、それは現在の動作データの準備ができていない、識別情報は、呼び出し元のスレッドを伝え返します。データは第一段階を実行できるようになります。
実際には、IO IOブロッキングと非ブロッキングの間の主な違いは、実行されるのを待っていること、またはそれが直ちに通知識別を返します。データの準備ができていないときにだけ実行されるのを待って、そしてすぐに識別したときに通知を返すために、スレッドは、識別に基づいてされるデータの準備ができていない場合は状況が、その後、スレッドはデータが準備された直後に実行を知って、再び要求を開始します何であることを知っています。
2つのアプローチの組み合わせ
非同期および非ブロッキングはI / Oのパフォーマンスを向上するだけでなく、のようないくつかの追加のパフォーマンスコスト、持って来ることができますが。これにより、CPUの消費量が増加するスレッドの数が増加し、するだけでなく、増加したプログラミングの複雑さにつながります。デザインは無理ですが、場合に総合評価を打破するために、実際の設計シナリオでパフォーマンスが低下します。
以下の表は、同期および非同期の非ブロッキング合成ブロックのパフォーマンス分析を示しています。
組み合わせ | 性能解析 |
同期ブロック | 使用法の最も一般的な種類は、使用するのが最も簡単ですが、I / O性能がCPUのほとんどがアイドル状態で、一般的に劣っています。 |
同期非ブロッキング | I / Oパフォーマンスを向上させるための一般的な手段、つまり、非ブロック、特にネットワークI / Oコネクタに、ブロッキングI / Oは、長い伝送同僚です 多くの場合、データは非常に効果的なパフォーマンスが向上しません。 これは、CPUを補うことができない口座に増加したI / Oパフォーマンスを取って、I / O性能向上しますが、CPUの消費量を増やすことができ、多くの場合であります システムI / OやCPUのボトルネックである消費、。 |
ブロッキング非同期 | このモードは、多くの場合、分散型データベースで使用され、例えば、分散データベース内のレコードを書き込み、1は通常存在しているあります 記録同期ブロックされ、そして記録することにより2〜3部は、他のマシン上で書き込まれ、これらのバックアップのレコードは通常、非同期書き込みI / Oをブロックされています 非同期ネットワークI / Oをブロックすると、特に上記の書き込みこの同じデータを複数のケースと同時に、効率を向上させることができます。 |
非同期ノンブロッキング | この組み合わせは、使用するのがより複雑であり、唯一のいくつかの非常に複雑な分散場合、クラスタ間のメッセージの同期機構に用いられます 通常、このI / Oの組み合わせ。 非常に頻繁場合のデータ転送量が大きくないが、同時に、クラスタ内の異なるマシンに、同じデータの複数のコピーを送信するのに適しているけれども。 このように、このようなネットワークI / O最高のパフォーマンス。 |
記事は私の電話番号、歓迎の注意上記公衆に同期されます。