最も簡単で、I / Oモデルを導入する方法を理解しやすいです

I / Oモデルは何ですか?

簡単に言えばIOモデルは、プログラムが可能なデータまたはステータスを待機する方法を参照し、データまたはステータスのために処理しました。「準備完了」は、データの準備ができているかの状態があることを意味します。プログラムは、さらに、データ処理、受信したデータの後ソケットバッファを待機するような、そしてそのような接続状態にサーバー側のソケットとして処理を行いました。なぜそれはあなたが待つしたいということでしょうか?プログラムは、データがどのような時に決定するために完成する予定の読み書きができないので、どのような時に状態変化は意志、プログラムは、これらのイベントの発生を待ち、その後、適切な治療を行う必要があります。たとえば、クライアントを受信するサーバ側のソケットは私にデータを送り、データ処理が、プログラムは、データのみを待って、オーバー送られる際に知りません。

そこに共通のモデルは何ですか?
一般的なI /モデルのブロックとOモデルは、モデル、モデルを非ブロック、および非同期モデルを多重化します。

ブロッキングモデル(I / Oをブロックする)
ブロッキングが(例えばリードのような)I / Oメソッド呼び出したときにデータまたはステータスがまだ準備を指し、返す準備ができるまで、待機します。例えば、ブロッキングモードでのソケットのreadメソッドは、データが受信されない場合、readメソッドは、他のことを行うことができない、プログラムが停止し、ブロックします。サーバが複数の接続を処理したい場合は、このモデルでは、我々はそれぞれの接続ソケット用に別のスレッドを作成する必要があり、コストは素晴らしいことです。

ノンブロッキングモデル(非ブロッキングI / O)
非ブロッキングモデル(例えば、読み取りなど)I / Oのメソッド呼び出しは、データの準備ができていない持っているかどうか、我々はすぐに戻りますです。あなたはデータを持っている場合は、エラーコードを返却するデータがない場合は、データを読み込みます。アプリケーションは存在しない方法準備はありませんが、プログラムがブロックされません、ポーリングプログラムに加えて、他のことを行うことができますポーリングデータを検出するために、継続する必要があります。しかし、ポーリングのこの方法は、CPU時間の無駄になり、効率が十分に高くありません。

多重モデル(I / O多重化)
データは、システムではなくアプリケーションのポーリング検出データよりも、準備状態をプログラムに通知することができ、それがモデルで、非ブロッキング効率の問題を解決しないと準備ができていますか?はい、多重化モデルは、通知システムの機能を使用することです。一般的なI / Oの多重化および選択のepollです。

私は多重セレクタについてお話しましょう。readyイベント - (ファイルシステム、ファイル、ソケットなどのファイル記述子は、ファイルとして見ることができる、FDファイル記述子によって表すことができる)セレクタは、同時に複数のFDを監視することができます。ソケットと、例えば、セレクタは、複数のデータのステータスを監視することができるソケットを準備。プログラムリスニングソケットがデータの準備ができていたときに、ここではブロック、およびメソッドの復帰を選択することができます選択し、すべてのデータソケットリスナーが準備ができていないとき、selectメソッドを呼び出して、アプリケーションがしようとするソケットのすべてを横断する必要がありますデータを読み込みます。このモデルは、専用のスレッドの状態を使用することができ、ユーザプログラムは、各ソケット個々の状況のた​​めのスレッドを作成するためのモデルを目詰まりを避けるために、ソケットのすべてを監視する責任があることができます。選択も明らかである問題は、システムが特定のデータが準備されているソケットに通知することができないということです。しかし、プログラムは、すべてのリスナーソケット、CPUの廃棄物のリスト全体を横断する必要があります。そして、数が限られている選択fdを聞いて、Linuxは1024年です。モデルの使用上のJavaのNIOセレクター。

そして、それは、上記の例のために、システムは、我々はデータのどのようなソケット準備ができて、具体的には、プログラムに通知することができますか?Linux上のepollを行うことができます。ファイルディスクリプタ三API、epoll_create、epoll_ctl、イベントがepoll_wait、それぞれ、ファイルディスクリプタデータ構造を作成することができる提供し、(例えばソケット登録データの受信をリスニングなど)イベント・レジスタリスナーfdの発生、およびイベントを待ちます。あなたはイベントがepoll_waitメソッドを呼び出すと、リスナーのイベントが発生しなかった場合、それはブロックされます。サーバー側のソケットであり続ける、例えば、アプリケーションは、データの準備ができたときに、いくつかのソケットは、あなたが通過すると、すべてのソケットを検出することなく、ソケット対応のリストを得ることができることを除いて、同様の方法でのepollセレクタを使用しています。内部のepollはFD非常に効率的な方法で準備ができて、このリストを提供し、リスナーの数に制限はありません。これは、可能なLinuxシステムより多くの接続をサポートするために、よりシンプルかつ効率的な方法になります。

非同期モデル(非同期I / O)
非同期モデルは、(例えば、読み出しなど)、ユーザI / Oメソッド呼び出しを指すコールバックメソッドを提供し、I / Oメソッド呼び出しは、データの準備ができているときにコールバックメソッドが実行されるまで待ち、すぐに戻ります。これは、ユーザーが唯一のライン上のデータ処理コールバックメソッドを心配する必要がありますが、すべての処理がシステムにプッシュされた、非常に良く見えます良いシステムI / Oおよびユーザプログラムとの間に高い同時実行処理の場合CPUの競争がより難しいです。

非同期/同期混乱/非ブロッキング、ブロッキング
I / Oモデルについての私たちは、多くの場合、ブロッキング/ノンブロッキングを参照してください、同期/言葉を詰まらせたくない場合があります非同期非同期非ブロッキングはそれではない、同期していますか?実際に、彼らは子供の話をされていません。ブロッキングと非ブロッキングは、I / Oメソッド呼び出しの動作を向けられています。メソッド呼び出しが戻る前に、準備のデータまで待つことになるならば手段を遮断し、次にメソッドはエラーコードを返すデータの準備ができていない場合にかかわらず、データはメソッド呼び出しを非ブロックしているかどうかの、すぐに復帰する準備ができて、ポーリングデータに準備状態を検出する必要がある、準備ができたらデータが読み込まれますデータ。I / Oメソッドの呼び出しが戻るデータの非同期の同期のために。データ同期I / Oメソッド呼び出しは、(リターンデータときなしエラーコード)が返されることを意味し、場合レディデータユーザデータバッファ指定されたユーザプログラムに非同期システムを参照して、プログラムの通知を前記よく、または直接パラメータとしてコールバックメソッドのユーザが入力したデータを呼び出します。この定義によれば、上記ブロッキング、非ブロッキング同期多重モデルは、非同期モデルが非同期です。

 

公共の数(数)に:スキャンコード懸念

おすすめ

転載: www.cnblogs.com/yufengzhang/p/11408358.html