LinuxネットワークIOモデル

EDITORIAL

本論文では、しかし、ネットワークIOモデルのUNIX / Linuxの5種類について説明します。ためには、より良い5ネットワークIOの下に言及した概念を理解し、私たちは以下のこれらの概念を明確にする必要があります。

ユーザ空間とカーネル空間

コンピュータは、通常、コンピュータのような特定のサイズのメモリ空間は、アドレス空間の4ギガバイトを持っているが、これらのアドレス空間が分割されてプログラムが完全に、これらのアドレス空間を使用していないユーザ空間とカーネル空間の。ユーザーは、ここに記載されているアプリケーションのユーザー・スペース・メモリはアプリケーションにメモリ空間のアプリケーションではなく、実アドレス空間へのアクセスの使用を意味することができます。ここではどのようなユーザ空間とカーネル空間を見ては、次のとおりです。

ユーザ空間

:ユーザースペースは、従来のプロセスは、通常のプロセスは、従来のプロセスを確認するために、タスクマネージャ開いて何される領域であります

JVMは、ユーザ空間、例えば直接コード実行の領域内のハードウェアデバイスにアクセスすることができないようなユーザスペースが非特権領域、に駐留、従来のプロセスです。

カーネル空間

カーネル空間は、主に、仮想メモリの使用またはプログラム論理ハードウェア資源に接続されたような、実行中のオペレーティングシステムのスケジューラが使用されていることをいいます。カーネルコードのような装置として特別な権利を持っているコントローラと通信することができ、プロセスの運転状態の領域全体を制御します。そして、I / O関連のポイントは次のとおりです。すべてのI / Oは、カーネル空間から直接または間接的です。

なぜ、その後、ユーザ空間とカーネル空間を分割すべきか?これは、オペレーティングシステムの安定性とセキュリティを確保することもあります。ユーザプログラムは、ハードウェアリソースにアクセスする必要がある場合、ユーザプログラムは、直接、ハードウェアリソースにアクセスすることはできません、あなたは、オペレーティングシステムによって提供されるインタフェースを呼び出す必要があり、このプロシージャ・コール・インターフェースは、システムコールです。各システムコールは、2つのメモリ空間の間でデータ交換を提示する、一般的にネットワーク伝送システムコールは、ネットワークデータ上に送信された第1のデータ空間をカーネルに、ユーザ空間から、カーネル空間へのリモートマシンから受信されますユーザプログラムのため。

次の図は、このプロセスによって、より鮮やかに描いています。

ヒント:安全性と安定性プログラムを実行するが、効率の費用の一部を維持するものの、このカーネル空間とユーザー空間データをコピーすることは、非常に時間がかかります。しかし、現在のオペレーティングシステムは、このいずれかの利益のために最適化されてきた、これは私たちの議論の焦点では​​ありません。

ヒント:ユーザ空間とカーネル空間を割り当てる方法の比率が問題であるが、プログラムを使用するユーザーのために、ユーザのより多くのスペースに割り当てられている、または最初のコアが実行するために、またはバランスをとるために部屋の多くを持って維持します。1(3ギガバイトのユーザ空間、1GBのカーネル空間):デフォルトの32ビットLinuxシステムにおける比は3であるが、1:現在のWindows 32ビットオペレーティングシステムでは、デフォルトのユーザスペース:カーネルスペース比が1です。

同期および非同期

同期および非同期のアイデアで、よりになりますフィールドに触れ、I / Oフィールド(同期IO、非同期IO)、フィールド(同期要求、非同期要求、同期呼び出し、非同期呼び出し)をコールすることを要求。それはさまざまな分野に関与していないがが、考え方は同じです。同期および非同期の、本当の懸念があるメッセージ通信メカニズム

シンクロナス

、つまり、同期いわゆる、例えば「コール」には、「呼び出し要求」を発行する際にノーの結果まで、「呼び出し要求」は返さない、しかし、あなたが得れば、コールは戻り値を返します言い換えれば、「発信元」の結果を得るためにアクティブ待機、中に「呼び出し先」私たちは通常、書きたい、方法Aは、B法は、発信者がこれらのメソッドで主導権を取るために戻るのを待っているのでString.substring()メソッドは同期呼び出しされるコールMath.random()メソッドを呼び出します。

非同期な

いわゆる非同期は、対照的に、非同期呼び出しの要求が行われたときに、呼び出し側はこの要求の実際の結果の実行は、結果だけですぐに返された擬似かもしれない直後に結果を得ることはありませんそのため、非同期呼び出しは、データの一貫性のそれらのシーンに適用される非常に高いものではない、または非常に時間のかかるプロセスは、シーンを実行します。このようなシナリオは、私たちは非同期呼び出しの結果を取得したい場合は、「呼び出し先」の発信者に通知し、またはこれに対処するためのコールバック関数を呼び出すことによってする状態で通知することができる、フューチャー/ FutureTaskで対応するJavaがあり、待つ/反映通知このアイデア。

ブロッキングとノンブロッキング

プロセスのためのブロッキングと非ブロッキング、または実際には、スレッドの状態を決定します。このときのデータのカーネルバッファの準備ができていない場合には、その後、一つの方法は、そこにブロックされたオペレーティング・システム・ユーザー・プロセスを使用する場合、以下の例では、ユーザ・プロセスは、オペレーティング・システムのカーネル・バッファからデータを読み出しますしたがって、この時間は、ユーザプロセスの状態が遮断された状態に走行状態からブロックされます。

上記の基本を知って、我々は正式にLinuxのネットワークIOモデルに入りました。

LinuxネットワークIOモデル

5つのネットワークI / Oモデルを理解する前に、我々は最初のオブジェクトを含むことになる明確なネットワークIOイベントを、持っている必要があり、どのような手順が発生します。

主題に関連するIOネットワーク

ネットワークIO(ここでは例えば、読み取り)について、それは1つがIOプロセスやスレッドを呼び出している、と他のは、Linuxカーネル空間とユーザ空間で、2つのシステムオブジェクトを伴うだろう。

I / O操作を実行するためのステップのプロセス

このプロセスは、I / O動作を実行する、オペレーティングシステムにリクエストを発行する、またはそれがバッファデータ列クリーナー(書き込み)を書き込むようにすることですに帰着、またはバッファがデータ(読み出し)が充填されています。操作のうち、内部のメカニズムのオペレーティングシステムプロセスのタスクは、その複雑さは想像を絶するかもしれないが、概念的には、それは我々がここでは、ネットワークのために、IOは非常に簡単で理解しやすい内のすべてのプロセスデータを処理するために、このメカニズムを使用します読み出し動作が発生したときに、それは二つの段階を通過します、例えば、読んで:

  1. データを準備するカーネルバッファ

  2. ユーザバッファにコピーされたカーネル・バッファ・データ

いくつかの違いIOモデルは2つの段階、これらのIOモデルのいくつかの以下の詳細な説明に反映されています。

IOをブロック

ユーザーがのrecvfromプロセスは、この機能を開始呼び出すと、IOが始まったデータを準備するためにカーネルバッファ:最初のフェーズを十分なデータが来るのをネットワークIOの場合、データは一定時間の蓄積にのみ送信され、今回のカーネルバッファを待たなければなりません。バッファの使用者側では、ユーザプロセスが常にますオペレーティングシステムでブロックされ、カーネルバッファのデータの準備ができたとき、それはユーザバッファにデータカーネルバッファにコピーし、その後、オペレーティング・システムによってウェイクアップがブロックされていますユーザプロセスと結果はこの時点では、ユーザー・プロセスとユーザープロセスに返さが再び稼働していました。そのため、機能を遮断することが2つの段階で行わIO IOがブロックされているです

IOをノンブロッキング

データがまだ準備ができていない、場合、ユーザー・プロセスは、読み出し動作、カーネルバッファを発行図から分かるように、それはユーザプロセスをブロックしませんが、すぐにエラーを返しますユーザプロセスの観点から、それは後の読み出し動作を開始し、ブロックされていないが、すぐに結果を得ました。ユーザープロセスは、判定誤差の結果であり、それは、データの準備ができていなかったことを知っている、それは操作を読んで、これにより無期限に行く再送信することができますので、ここでの第一段階は、回転になっています。データカーネルバッファは準備ができて、再度ユーザプロセスの読み出し要求を受信したら、それはすぐにユーザバッファにカーネルバッファからデータをコピーし、その後ユーザスレッドに戻って、これが第二段階です。だから、実際には、ユーザー・プロセスは、第1段階で、オペレーティング・システムによってブロックされていないが、常にカーネルバッファのデータについて質問する必要性は良くありません。それだけは阻止されたときにコピーされたデータの第二段階では

IO多重化

IOが実際機構を介して多重化され、プロセスの複数、一旦、この機構を準備完了(レディ一般読み取りまたは書き込みレディ)、対応するプログラムを読み出しを通知することができ、書き込み動作を説明FDをFD監視することができますそこを選択し、PSELECT、世論調査、ファイルディスクリプタがありますが、それらは、本質的に、同期IOです。

同時に、運転しながら、上記のブロッキングとノンブロッキング・IO IOのユーザプロセスがちょうど通話のrecvfrom関数であり、ここではユーザプロセスがその後、選択関数を呼び出します、ユーザー・プロセスが選択呼び出されたときに、そのプロセス全体がブロックされることに注意してくださいシステムは、任意のソケットカーネルバッファに対応するデータの準備ができたときに責任ソケットカーネルバッファを、対応するすべて選択データは、それが通知読める状態に戻ります「監視」します。この時点で、ユーザプロセスは、さらに、データは、ユーザバッファにカーネルバッファからコピーされ、読み出し動作。

この図とIOをブロックするには、グラフィックが、実際には、実際にはさらに多くの悪いことに大きな違いはありません。これは2つのシステムコールを使用する必要があるため(選択してのrecvfrom)、およびブロッキングIOは唯一のシステムコール(のrecvfrom)を呼び出します。しかし、選択利点を呼び出すと、それは同時に複数のソケットを扱うことができるということです。接続プロセスの数が非常に高くない場合には、より良い(そう、複数のWebサーバーのパフォーマンスの+ IOブロックよりもスレッドが、また、遅延する可能性が高いを使用することはできませんWebサーバーを選択します。

ヒント:選択の利点を強調し、単一のためのより高速な接続を処理することはできないが、それはより多くの接続を処理することができます。

上記のようにIO多重化モデルでは、実際には、各ソケットに対して、通常、非ブロッキングに設定され、しかし、全体のプロセスは、実際にユーザがブロックされていています。ユーザは単に機能プロセスが代わりにソケットIOをブロックするので、ブロックされている(またはオペレーティングシステムがブロックされていると理解することができる)を選択します。

そこ役割はソケットカーネルバッファを対応する準備ができているデータを参照するためにそれらを監視するためのソケットを確立するために、複数のユーザー・プロセスがブロックされ、その後、これらのユーザー・プロセスとサーバーを選択していないことを尋ねるために誰かも、その後、ユーザーに通知する必要がありますユーザーがデータコピーのZaifayiciのrecvfrom要求を処理することができ、プロセス、。それは、人々はそれがより効率的に言うのepollなぜ、また道のepollの役割は?今、私は詳細に理由のepoll高い効率を紹介します。我々は最初のLinuxの選択、投票のepollの機能を見ていることを知っています。

私たちは、最初の違いは何で、何であるかのLinuxの選択、投票、epollを特定の役割を見て?

選択

選択機能モニタリングFD(ディスク記述子注:Linuxのコンポーネントはディスク記述子の形であるシステム、例えば、ソケット)は、3つのカテゴリー、すなわちwritefds、readfds、およびexceptfdsに分けます。(リターンがすぐにnullに設定されている場合、タイムアウトは、時間を待っている指定)(データは除いてあり、読み取り、書き込み、または)FD準備ができるまでブロックする、またはタイムアウトになる選択機能を呼び出した後、それだけということになりますすべてが(データはFDのロゴの代わりにカーネルバッファになり、これはマーカーでマークされることに注意してください)識別子の対応するセットが監視FD_SET fdがカーネルバッファがFD_SETを横断する場所を見つけるために、再度ユーザプロセスとユーザープロセスに戻されますFD領域の準備ができたデータ識別子であり、その後のrecvfrom送信要求を移動し、第二段階が始まります。

長所を選択します。

  1. ほとんどその優れたクロスプラットフォームのサポートによってサポートされているすべてのプラットフォーム上で、今選択し、また、その利点の一つです。

短所を選択します。

  1. 大きな欠点は、単一のプロセスの選択数fdはFD_SETSIZE限度で構成されて一定の限界がある監視することができますされ、デフォルトでは、あなたがそれを変更した場合、あなたはカーネルを再コンパイルする必要があり、1024年であるが、これはネットワーク効率をダウンさせるだろう

  2. カーネルアドレス空間およびユーザアドレス空間のデータが一部のモデルですべてのFDをコピー複製されるたびに、増加の数として、ごく一部fdがアクティブであってもよいFD、しかし各コールは全体FD_SETを横断する選択、チェック低効率につながる各FDデータレディ状態、。

投票

世論調査の性質とは差を選択していない、それはまた、ユーザプロセスに全体FD_SETを教えてくれます。そして、別の選択、それがストアにリンクされたリストに基づいているため、それは、最大接続数を制限しないことです。

投票短所:

  1. モデルの下でカーネルアドレス空間とユーザアドレス空間は、それぞれの時間データの複製は、FDのすべてをコピーすることです。

  2. 特徴的な世論調査があります:FD、レディ状態で報告され処理されていない場合は、次回のポーリングがfdのとき、トリガ・レベルは、それが再び報告します。パフォーマンスの低下でリニアスキャン結果fdの増加を。

epollを

epollをサポートレベルトリガとエッジトリガは、最大の特徴は、エッジトリガは、それが唯一のプロセスfdがレディ状態になり、一度だけ気づく何伝えるということです。もう一つの特徴は、使用してのepoll、あるイベント登録epoll_ctl fdで通知の-Readyビデオモードは、FD準備ができたら、カーネルはFDをアクティブにするために同様のコールバックコールバックメカニズムを使用して、イベントがepoll_waitに通知することができます。

ファイルディスクリプタの利点:

  1. そこには上限同時接続はありません、FDオペレーティングシステムのファイルハンドルでサポートされているその最大値を制限します。

  2. 効率の向上、選択して投票とは異なり、ファイルディスクリプタにする唯一のアクティブ(レディ状態のデータ)は FD動作、ファイルディスクリプタのFDは、カーネルの実装における上記コールバック関数の各々に従って達成されるので、それが唯一のアクティブFDでありますコールバック関数を呼び出すためのイニシアチブをとるだろう、他のアイドル状態ではないでしょうfdが。ファイルディスクリプタの性能は、FDの合計数によって限定されるものではありません。

  3. /投票を選択し、ユーザ空間へのメッセージ通知をfdにカーネルを必要とし、カーネルとユーザスペースでのepollのmmap同じメモリを実装。
    ファイルディスクリプタfdは2つの動作モードがありますLT(レベルトリガ)とET(エッジ・トリガ)を、デフォルトのモードは、LTです。

ヒント:
次のようにETとLTモードモデルとの違いは以下のとおりです。
LTモード:イベントがepoll_waitイベント記述子がこのイベントを検出し、アプリケーションに通知する場合、アプリケーションは次のコールがepoll_waitにすぐにイベントを処理しないかもしれないが、再び応答しますアプリケーションとこのイベントを通知します。
ETモード:イベントがepoll_waitがディスクリプタ・イベントとイベント通知アプリケーションを検出した場合、アプリケーションは、すぐにイベントを処理する必要があります対処しなければ、次の呼び出しのイベントがepoll_waitは、再度アプリケーションに対応し、このイベントを気付くことはありません。

ここではいくつかの機能の違いを示すためのテーブルを見てと:

カテゴリ 選択 投票 epollを
最大接続数は、サポートされています FD_SETSIZEによって制限 リスト記憶に基づいて、制限はありません システムによる最大ハンドル限界
サージFDの影響 低性能のリニアスキャンへのFdリード セレクト付 実現のコールバックFDに基づいていない、何もパフォーマンスの低下の問題
メッセージパッシングのメカニズム カーネルへのメッセージは、ユーザ空間に必要と、カーネルはコピーする必要があります セレクト付 epollは、共有メモリのカーネルとユーザー空間を通じて達成すること

ここで、我々はおそらく、なぜ選択し、世論調査の効率よりも高いepollを知っています。

IO駆動信号

プロセスとするとき、カーネルデータの準備ができてFD、SIGIOを確立し、その後、他の自分のことを行うと、ブロックしないのカーネルハンドラそれははsigactionシステムコールをトリガーするのrecvfrom、この時点では、準備ができてユーザプロセスの問題をユーザプロセスのデータを伝えます第二段階。

非同期IO

ユーザプロセスが非同期IOを発行した後、IOは、ユーザー・プロセスは、あなたが他の事を行うことができ、すぐにすべての作業を戻しますが、すべてのカーネルの後に完了すること。カーネルデータの準備が整ったら、カーネルは自動的に(ここでは、上記の異なるいくつかあるユーザプロセスがブロックされていない)ユーザ空間にデータをコピーし、ユーザプロセスへの信号は、コピーが完了した後に送信します。

ヒント:実際には非常に少ないとLinuxでの非同期IO。

最後に、五のネットワークIOモデルでのLinuxの比較を見てみましょう。

このネットワークIOモデルを書くことも、皆のためのいくつかの質問を解決したいと考えている、NIOの深さの研究をバックアップし、ネッティーを準備することです。

参考:

https://blog.csdn.net/baidu_39511645/article/details/78283680
https://www.cnblogs.com/wlwl/p/10291397.html
https://juejin.im/entry/585ba7038d6d810065d3d54a
ます。https:// WWW .cnblogs.com / xrq730 / P / 5074199.html
https://blog.51cto.com/xingej/1971598
https://www.cnblogs.com/javalyy/p/8882066.html
ます。https://www.jianshu。 COM / P / 6f132d27aeaf?utm_campaignを
https://blog.csdn.net/u013374645/article/details/82808301
http://baijiahao.baidu.com/s?id=1604983471279587214&wfr=spider&for=pc

おすすめ

転載: www.cnblogs.com/tkzL/p/11494134.html