高性能IOシステム設計では、しばしば私たちを混乱させるいくつかの名詞の概念があります。詳細は次のとおりです。
1同期とは何ですか?
2非同期とは何ですか?
3ブロッキングとは何ですか?
4ノンボッキングとは何ですか?
5同期ブロッキングとは何ですか?
6同期ノンブロッキングとは何ですか?
7非同期ブロッキングとは何ですか?
8非同期ノンブロッキングとは何ですか?
人生の例を挙げましょう:
カンパオチキンサイコロライスボウルが必要な場合:
同期の詰まり:レストランに行って食べ物を注文してから、そこで待って、叫びます:わかりました。
同期ノンブロッキング:レストランで注文した後、私は犬を散歩に行きました。しかし、しばらく歩いた後、彼はレストランに戻って叫びました:OK?
非同期閉塞:犬を散歩させるとき、私はレストランから食事の準備ができていると言って電話を受け、直接それを手に入れるように頼みました。
非同期ノンブロッキング:レストランは、「私たちはあなたの場所を知っているので、後でそれを送りますので、心の安らぎで犬を散歩させることができます」と言いました。
上記の問題を把握する前に、まず、同期、非同期、ブロッキング、および非ブロッキングが何であるかを理解する必要があります。これらの単一の概念がはっきりと理解されている場合にのみ、結合すると比較的簡単になります。
1。同期と非同期性は、アプリケーションとカーネルの間の相互作用のためのものです。
2。ブロッキングとノンブロッキングは、IO操作の準備状態に応じてデータにアクセスするときにプロセスで採用される異なる方法です。率直に言って、それは操作機能を読み書きまたは書き込む実装方法です。ブロッキング方法では、読み取りまたは執筆機能が読み取りまたは書き込み機能がすぐに状態値を返すのではなく、読み取りまたは書き込み機能が待機します。
上記の説明から、基本的に短い文を要約することができます。同期と非同期性が目的であり、ブロッキングと非ブロッキングは実装方法です。
1。同期: IO操作をトリガーし、IO操作の準備ができているかどうかを確認するために、IO操作のトリガーと待機またはポーリングを指します。私は路上で服を買いに出かけ、自分でこのことをしましたが、他に何もできませんでした。
2。非同期:非同期とは、ユーザープロセスがIO操作をトリガーした後、独自のことを行うことを意味します。 IO操作が完了すると、IOの完了が通知されます(非同期の特性は通知です)。服のサイズ、サイズ、色に合っているように友人に伝え、友人にそれを販売するように任せてください。そうすれば、他のことをすることができます。 (非同期IOを使用する場合、JavaはIOをOSに読み書きを行い、データバッファーのアドレスとサイズをOSに渡す必要があります)
3。ブロック:いわゆるブロッキング方法とは、ファイル記述子を読み取り、書き込もうとする場合、読み取りがない場合、または一時的に書かれていない場合、プログラムは読みやすいものまで待機状態に入り、バス停に行き、充電します。この時点で、充電器はそこにいません(彼はトイレに行ったかもしれません)、そして充電が戻ってくるまでここで待ちます。 (もちろん、これは実際の社会ではそうではありませんが、実際にはコンピューターの場合です。)
4。非ブロッキング:非ブロッキング状態では、読み取ることができない、または書き込みできない場合、読み取りと書き込み機能は待たずにすぐに戻ります。銀行がビジネスを処理するためにお金を引き出すと、少量の領収書を受け取ります。受け取った後、携帯電話で遊んだり、他の人とチャットしたりできます。私たちが回るとき、銀行の議長は私たちに通知し、私たちは行くことができます。
IO操作は、実際にはIOリクエストの開始と実際のIO操作の2つのステップに分割されます。
同期IOと非同期IOの違いは、2番目のステップがブロックされているかどうかです。実際のIOがリクエストプロセスを読み書きする場合、それは同期IOです。
IOのブロックと非ブロッキングIOの違いは、IO要求がブロックされるかどうかにかかわらず、最初のステップにあります。完了するまでブロックされている場合、それは従来のブロッキングIOです。ブロックされていない場合、それは非ブロッキングIOです。
同期と非同期は、アプリケーションとカーネルの間の相互作用を対象としています。同期とは、IO操作のトリガーと待機またはポーリングのユーザープロセスを指し、IO操作の準備ができているかどうかを確認します。非同期とは、IO操作をトリガーした後、ユーザープロセスが独自のことを行うことを意味し、IO操作が完了すると、IOの完了が完了することが通知されます。
ブロッキングとノンブロッキングは、IO操作の準備状態に応じてデータにアクセスする際にプロセスによって採用されるさまざまな方法です。率直に言って、それは操作機能を読み書きまたは書き込む実装方法です。ブロッキング方法では、読み取りまたは執筆機能が読み取りまたは書き込み機能がすぐに状態値を返すのではなく、読み取りまたは書き込み機能が待機します。
したがって、IO操作は、同期ブロッキング(つまり、初期のバイオ操作)、同期非ブロッキング(NIO)、および非同期非ブロッキング(AIO)の3つのカテゴリに分けることができます。
同期ブロッキング(バイオ):
このようにして、ユーザープロセスがIO操作を開始した後、IO操作が完了するのを待つ必要があります。 IO操作が真に完了した後にのみ、ユーザープロセスを実行できます。 Javaの従来のIOモデルは、この方法に属します。
同期ノンブロッキング(NIO):
このようにして、ユーザープロセスはIO操作を起動した後に他のことをするために戻ることができますが、ユーザープロセスは、IO操作が随時準備が整っているかどうかを尋ねる必要があります。その中で、現在、JavaのNIOは同期非ブロッキングIOです。
非同期ノンブロッキング(AIO):
このようにして、アプリケーションがIO操作を開始した後、カーネルのIO操作が完了するのを待たず、カーネルがIO操作を完了した後にアプリケーションに通知します。
同期ブロッキングIO(Java Bio):
同期してブロックするサーバー実装モードは、1つのスレッドに接続します。つまり、クライアントが接続要求を持っている場合、サーバーは処理のためにスレッドを起動する必要があります。この接続が何もしない場合、それは不必要なスレッドオーバーヘッドを引き起こし、もちろんスレッドプールメカニズムを介して改善することができます。
同期非ブロッキングIO(Java nio):
同期ノンブロッキング、サーバー実装モードは、1つのスレッド、つまりクライアントが送信した接続要求がマルチプレクサに登録されます。マルチプレクサは、I/O要求への接続を投票し、処理のためにスレッドを開始します。また、ユーザープロセスは、IO操作が随時準備が整っているかどうかを尋ねる必要があります。これにより、ユーザープロセスに絶えず尋ねる必要があります。
非同期ブロッキングIO(Java nio):
このようにして、アプリケーションがIO操作を開始した後、カーネルのIO操作が完了するのを待たず、カーネルがIO操作を完了した後にアプリケーションに通知します。これは実際、同期と非同期の最も重要な違いです。同期は、IOが完了したかどうかを待つか積極的に尋ねる必要があります。では、なぜブロックされているのですか?現時点では、選択システム呼び出しによって行われ、選択関数自体の実装がブロックされているため、選択関数を使用することの利点は、同時に複数のファイルハンドルをリッスンできることです(UNPの観点からは、SELECTは同期操作です。
(Java AIO(NIO.2))非同期非ブロッキングIO:
このモードでは、ユーザープロセスはIO操作を開始し、すぐに返すだけです。 IO操作が真に完了した後、アプリケーションにIO操作が完了したことが通知されます。現時点では、ユーザープロセスはデータを処理するだけで、実際のIOの読み取り操作がカーネルによって完了しているため、実際のIO読み取り操作を実行する必要はありません。
Bio、Nio、およびAIOの該当するシナリオの分析:
バイオ法は、比較的小さな接続と固定接続を備えたアーキテクチャに適しています。この方法では、高いサーバーリソースが必要であり、同時性はアプリケーションに限定されます。 JDK1.4以前は唯一の選択肢ですが、プログラムは直感的で、シンプルで、理解しやすいです。
NIOメソッドは、チャットサーバーなど、多数の接続と比較的短い接続(光操作)を備えたアーキテクチャに適しています。並行性はアプリケーションに限定されており、比較的複雑なプログラミングがあります。 JDK1.4はそれをサポートし始めました。
AIOメソッドは、多数の接続と比較的長い接続(再手術)を備えたアーキテクチャに使用されます。これは、OSを完全に呼び出して同時操作に参加し、プログラミングは比較的複雑です。 JDK7はそれをサポートし始めました。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。