IOとの間の差は、投票を選択し、ファイルディスクリプタ差が選択、投票、ファイルディスクリプタ(Sogouのインタビュー)IOは、ファイルディスクリプタの概要を多重IOのポーリングOマルチプレクサ要約の要約を選択マルチプレクサマルチプレクサ

選択、投票、ファイルディスクリプタ(Sogouのインタビュー)との差

 

(1)> == Oの時間複雑度(N)を選択します

それは唯一のI / Oイベントが発生、しかし、我々は唯一の未分化投票すべてのストリームは、読み取りを識別することができますいくつかのストリームは(1、より多くの、あるいはすべてがあるかもしれない)というものについて知りませんが、知っていますデータ、または書き込みデータ・ストリームは、それらを操作します。だから、選択ポーリングは何の違いの複雑性O(n)が持っていない、より多くのストリーム処理はしばらく長い未分化のポーリング時間を。

(2)ポーリング==> Oの時間複雑度(N)

世論調査は、本質的に何の違いを選択しないと、ユーザーはカーネル空間に渡された配列をコピーし、FDに対応する各機器の状態を照会、だろう  が、それは接続の最大数を制限しません、それが記憶されたリストに基づいているため、。

O(1)の(3)ファイルディスクリプタ==>時間計算

ファイルディスクリプタの世論調査では、イベントとして理解することができるビジーポーリングと非差別の世論調査とは異なり、流れはI / Oイベントは、私たちが知っているどのように発生しますがepoll。私たちは実際のepoll言うように、イベント駆動型(FDに関連付けられている各イベントを)、そしてこの時点で、我々はこれらのストリームで動作している意味があります。(複雑さはO(1)に還元されます)

、投票を選択し、ファイルディスクリプタは、IO多重化メカニズムです。I / O機構を介して多重化、ディスクリプタを複数のディスクリプタを監視することができ、一度レディ(準備一般読み取りまたは書き込みレディ)、プログラム読み取りおよび書き込み操作に応じて通知することができます。しかし、彼らはイベント後の読み取りおよび書き込みする必要があるので、それは、I / Oを選択し、ポーリング、ファイルディスクリプタの本質同期していることは読み書きプロセスがブロックされていることを、自分自身の読み込みと書き込みのための責任準備ができて、非同期I / Oは、自身に必要ではありません読み書きを担当し、非同期I /ユーザーへのカーネル空間からコピーされたデータの実装のためのO責任を負います。  

ファイルディスクリプタは、I / Oの多重化を選択し、マルチチャネルでのソリューションを提供することができます。そこ今やLinux固有のファイルディスクリプタでのLinuxカーネルをサポートすることができる、およびPOSIXで指定する必要があります選択し、一般的なオペレーティング・システムが実現しています

選択する:

さらなる処理は、設定または選択フラグFD性質に格納されたデータ構造をチェックすることによって行われます。このような欠点が原因で発生します。

1、FDの数を監視することができ、単一の処理が制限され、すなわち、限られたサイズは、ポートを監視することができます。

      一般に、これは大きな数との関係のメモリシステムでは、特定の数の缶猫を/ proc / sys / fs /ファイル-maxの図です。デフォルトでは、32ビットマシン1024です。デフォルトは2048 64ビットマシンです。

:ソケットがリニアスキャン走査する、すなわち、ポーリング方式、あまり効率的である2、

       各々が()を選択する複数のソケットはFD_SETSIZEソケットを横断スケジューリングすることによって行われるべき場合、ソケットは関係なくのが再び横断されるアクティブです。これは、多くのCPU時間を無駄にします。彼らは、アクティブ、オートコンプリート関連操作しているとき、ソケットはコールバック関数を与えるために登録されている場合、それは世論調査、ファイルディスクリプタを回避し、これはkqueueのがそうです。

3、オーバーヘッド構造を渡すときに、ユーザーが大空間とカーネル空間にコピーできるように、データ構造を格納するために多量のFDを維持する必要性

世論調査:

すべてのトラバース場合ポーリングとは、本質的に何の違いを選択していない、FDに対応する各機器の状態を問い合わせるその後、カーネル空間に渡された配列をコピーしてしまうユーザーは、装置内のデバイスは、レディキューとトラバーサルに追加された場合は、続けていいえデバイスはデバイスの準備ができてまたはアクティブタイムアウトになるまでのfd再び通過した後に再び目を覚ます、現在のプロセスを中断し、準備ができFDました。このプロセスは、多くの不必要なトラバーサルを受けています。

これは、接続の最大数を制限しませんそれはチェーン店をベースとしているため、だけでなく、欠点があります。

図1に示すように、FDアレイの多数にかかわらず、そのようなコピーは意味がないかどうか、ユーザ・モードとカーネルアドレス空間の間でその全体がコピーされます。                   

2は、世論調査もう一つの特徴は、「トリガレベル」で報告されたFD、処理されていない場合、それは再び次のポーリングをFDを報告します。

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

EPOLLLTとEPOLLETトリガモードの2種類を持っているのepoll、LTはデフォルトのモードである、ETは、「高速」モードです。LTモードで、限りFD読み取るべきデータが存在するように、それぞれのイベントがepoll_waitプログラムを操作することをユーザに思い出させるために、そのイベントを返し、ETで(エッジトリガ)モードでは、それは、次回までのデータのみプロンプト一度あります流れる前に、それはもはや読めるFD内のデータが存在するか否かを促されません。したがって、ETモードでは、読み取りは、それが光バッファ読むのに時間を取らなければならないFD、戻り値を読み出すために、読み取り要求されたことが少ないEAGAINに遭遇した値、またはエラーを超えています。もう一つの特徴は、epoll_ctl登録FDを通じて「イベント」の準備の通知方法を使用してファイルディスクリプタは、fdの準備ができたら、カーネルはFDをアクティブにするために同様のコールバックコールバックメカニズムを使用して、イベントがepoll_waitに通知することが可能です。

epollはなぜトリガモードをEPOLLET必要がありますか?

EPOLLLTモード場合、システムは、あなたが、彼らは戻りますがepoll_waitを呼び出すたびに読み書きする必要はありませんファイル記述子の数が多いが、それは非常にあなたが気にファイルディスクリプタを取得する準備ができて処理効率を低下させる準備ができたら..です こうしたエッジトリガモードEPOLLET語の使用、監視対象のイベントのファイル記述子はイベントがepoll_wait(書き込み可能)の読み書きにハンドラを通知します。これは読み取りを行われていない場合は、ファイルディスクリプタまで(例えば、読み取りおよび書き込みバッファが小さすぎるなど)、すべてのデータは、次のコールがepoll_waitを()、それは、それは一度ご連絡いたします、であること、を通知しません書きます2番目のイベントは、読み取り、書き込みはご連絡いたします表示されることがあります!このモデルは、効率のトリガレベルよりも高くなると、システムは、あなたが気にしない準備ができたファイルディスクリプタが殺到されることはありません

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

1、最大同時接続数に制限は開閉可能の上限FD 1024(約100 000ポート1Gメモリに聞くことができる)有意に高い、存在しない ;
2、効率を向上させる、いずれかのポーリング方式ではなく、FDの数として効率を高めます。利用可能なFDは、コールバック関数と呼ばれるだけアクティブ、
最大の利点は、その実際のネットワーク環境では、効率がepollをよりはるかに高くなります、それはちょうどあなたが「アクティブ」な接続のepollが、接続の合計数とは何の関係もあることですしています選択して投票。

図3に示すように、メモリコピー)(MMAPを使用してファイルマッピングメモリ加速度とカーネル空間メッセージング、すなわちMMAPのファイルディスクリプタの複製オーバーヘッド削減を使用。
、投票、ファイルディスクリプタの違いの概要を選択します。

図1に示すように、接続の最大数を開くことができるプロセスをサポート

選択する

(サイズは32 32ビットマシンでサイズが32整数の大きされた単一のプロセスFD_SETSIZEマクロ定義で開くことができる接続の最大数、同様に64ビットマシン上で32 FD_SETSIZE 32 64)、我々はもちろんの缶さらにテストを必要とする、修正し、カーネルを再コンパイルしますが、パフォーマンスが影響を受ける可能性があります。

投票

そして、世論調査に本質的な違いを選択していないが、それはストアにリンクされたリストに基づいているため、それは、接続の最大数を制限しません

epollを

接続数が上限を有するが、しかし大きな、機械1Gメモリに約100,000の接続を開くことができ、2Gメモリマシンは約20万を開くように接続することができます。

2、FDはIOの効率の劇的な増加をもたらします

選択する

なぜなら、接続のFD増加が遅くトラバースをもたらすように、各コールを横切る線状になり、「線形性能低下の問題」を

投票

同上

epollを

epollカーネルの実装は、各FD上のコールバック関数に従って達成されているので、唯一のアクティブなソケットが呼び出しコールバックするためのイニシアチブをとるだろう、それほどアクティブソケットの場合には、パフォーマンスの問題の使用は、フロントの両方には直線的に減少するのepollありませんすべてのソケットがアクティブになっているときには、パフォーマンスの問題があるかもしれません。

3、メッセージングモード

選択する

カーネルは、カーネルのコピー操作が必要で、ユーザ空間にメッセージを配信する必要があります

投票

同上

epollを

epollを共有カーネルとユーザ空間メモリを通じて達成しました。

要約:

要約すると、選択SELECT、P OLLは、自らの特性や特定の場面に応じて3つの方法がepollをするとき。

ケース1、最高のepollの表面特性が、接続および接続の数が少ないが、非常にアクティブで、選択して、ポーリング性能が良くepollをよりすることができ、通知メカニズムの後のepollは、関数コールバックの多くを必要とします。

それはすべてのポーリングを必要とするため、2、非効率的な選択。場合によってはしかし、また、優れた設計により、比較的非効率的に改善することができます 

 

3についてIOは非常に明確に書かれた3本の要約の前に、使用を多重化し、再帰反射エコーでサーバープログラムは、テストされています。次のように接続されています:

SELECT:IO多重化のSELECT概要

世論調査:Oの多重化の世論調査概要

epoll:IOはファイルディスクリプタの概要の多重化

  次のように今日では、これら三つのIO多重比較、参考書やオンライン上記の情報は、要約されています:

1、実現を選択

呼び出し手順を選択して、次のとおりです。

(1)は、ユーザ空間からカーネルスペースFD_SETにcopy_from_userをコピーします

コールバック関数を登録する(2)__pollwait

対応するポーリング・メソッドを呼び出し、すべてのFD、(ソケットに対して、ポーリングがsock_pollある、tcp_poll、udp_poll又はdatagram_pollに場合によって呼び出しをsock_poll)〜(3)

(4)tcp_poll例に、そのコアの実装では、コールバック関数の上方に登録されている__pollwait、です。

(5)__ pollwait主な仕事は、現在の(現在のプロセス)を入れてデバイスへのキュー待機中にハングアップすることで、異なるデバイスがtcp_pollごとに異なる待ちキューを持って、そのキューはSK-> sk_sleep(ノートがあることハングへのプロセスキューで待機している)は、プロセスがスリープされていることを意味するものではありません。デバイスがメッセージ(ネットワーク機器)やファイルデータを記入(ディスクデバイス)を受信した場合、デバイスはキューで待機しているプロセスを寝て目を覚ますでしょう、そして現在は起こされるだろう。

(6)ポーリングは、マスクFD_SET割り当てに応じて、読み取りまたは書き込み動作の準備リターンマスクマスクするかどうかをマスクする方法戻る説明しました。

すべてのFDを経て完成した場合(7)、また、読み書き可能なマスクマスクがスリープ状態になる(、最新であることを)選択プロセスを呼び出すschedule_timeout呼び出されます返されませんでした。デバイスドライバは、独自のリソースを読み書きすることができたときに発生し、それがキューで待機して眠っているプロセスを起動します。より特定のタイムアウトより(schedule_timeoutは、指定された)、または誰も目覚めない、プロセスがGETのCPUまで再選択するきっかけと呼ばれ、その後、再反復FD場合、裁判官は何の準備ができて、FDを持っていません。

(8)は、ユーザ空間にカーネル空間からコピーFD_SET。

要約:

いくつかの主要な欠点を選択します。

とき、多くのFD(1)は、各呼び出しは、カーネルモードへのユーザモードからFDコレクションをコピーする必要性を選択するには、このオーバーヘッドは素晴らしいものです

(2)同時に、各コールがカーネルに渡されたトラバースするすべての必要性を選択するFD際に、多くのFD、このオーバーヘッドも素晴らしいです

ファイルの数は、選択のサポートをディスクリプタ(3)が小さすぎる、デフォルトは1024です

2投票達成

  ポーリングおよび選択の実装は非常に類似しているが、別の方法はポーリングFD_SET構造pollfd構造体ではなく、選択を使用して、FDのセットを説明し、そしてほとんどすべての他の、記述子は、複数の状態記述子に応じた処理、ポーリングを管理していますしかし、世論調査では、ファイル記述子の数には上限の制限はありません世論調査や欠点も存在する選択は、配列がユーザーモードとカーネルアドレススペースにその全体がコピーされる間に関係なく、ファイルディスクリプタの、多数のファイル記述子が含まれているファイルディスクリプタの数とその支出を増加する準備ができています直線的に増加します。

3、ファイルディスクリプタ

  これを選択して投票ファイルディスクリプタ改善されるので、上記3つの欠点を回避することができなければなりません。それのepollは、それを解決する方法ですか?これに先立ち、我々は異なる見て、選択して、ポーリング呼び出しインターフェースを選択しファイルディスクリプタにのみ機能--selectまたはポーリング機能を提供してポーリングします。ファイルディスクリプタは、次の3つの機能、epoll_create、epoll_ctlやイベントがepoll_waitを提供し、epoll_createはファイルディスクリプタのハンドルを作成することです。epoll_ctlは、イベントタイプをリッスンするために登録されている、イベントがepoll_waitは、待機イベントです。

  第1の欠点、ファイルディスクリプタソリューションepoll_ctl機能のために。epollハンドルが、fdはすべてかなりのイベントがepoll_wait時に複製コピーよりも、カーネルにコピーされます(中epoll_ctlにEPOLL_CTL_ADD指定された)新しいイベントを登録するたびに。ファイルディスクリプタfdの各プロセス全体で一度だけコピーしてください。

  第二の欠点のために、ファイルディスクリプタのソリューションを選択、または同じ現在のデバイスのターンは(再び不可欠である)現在の上にハングアップし、それぞれにepoll_ctl場合にのみ、追加待ち行列をfdに対応するたびにポーリングのようなデバイスはキューで待機して目を覚ます人たちを待って、準備ができたときにコールバック関数を指定し、FD、それはコールバック関数を呼び出しますが、このコールバック関数)がFDの準備リストに参加できるようになります。イベントがepoll_wait実際に動作するが、何の準備ができてFDが存在しない、レディリストを見ることです(しばらくの間、睡眠を達成するために使用schedule_timeoutは()、ステップ7は、判決の効果になり、選択の実装は似ています)。

  100,000特定の数について第3の欠点のために、ファイルディスクリプタFDが1GBのメモリマシン上で、例えば、この数は、一般的に2048よりもはるかに大きい、上限は、ファイルの最大数を開くことが可能であるサポートし、この制限を持っていません缶猫を/ proc / sys / fs /ファイル-maxのビューは、一般的に、これは大きな数とシステムメモリとの間の関係です。

要約:

(1)を選択し、ポーリング連続達成世論調査では、すべてのデバイスの準備ができるまで、あなたがスリープ状態にしたいと代替の間に何回か目を覚ますことがあり、自分のFDのセットを必要としています。そして、常にポーリングレディリストのepollイベントがepoll_waitを呼び出す必要があり、それが交互に繰り返してもよい睡眠と覚醒の間に、それは、デバイスの準備ができているとき、コールバック関数を呼び出すで、レディリストに入れて準備ができfdが実際には、スリープ状態になり、イベントがepoll_waitに目覚めますプロセス。すべての睡眠が交互ますが、選択して「目覚め」時間の世論調査では、単に準備リストは、CPUの節約ライン、上空であるかを決定する際、「目覚め」でコレクション全体のFD、およびファイルディスクリプタを横断します時間。これは、パフォーマンスを向上させるためにコールバックメカニズムによって引き起こされます。

(2)は、各コールは一度カーネルモードのコピーにユーザーモードからFDに設定されている必要があり、デバイスに現在のポーリングし、選択し、ハングアップを待っているキューを作成し、ファイルディスクリプタただ一つのコピーが、待っている現在のキューがハングします(デバイスがキュー待ち行列を待っていますが、定義された待機中のキューのepoll内部にはないことに注意してくださいは、イベントがepoll_waitの初めに)一度だけぶら下がっ。これは、オーバーヘッドを大幅に節約することができます。 

 
転載: https://www.cnblogs.com/aspirant/p/9166944.html

(1)> == Oの時間複雑度(N)を選択します

それは唯一のI / Oイベントが発生、しかし、我々は唯一の未分化投票すべてのストリームは、読み取りを識別することができますいくつかのストリームは(1、より多くの、あるいはすべてがあるかもしれない)というものについて知りませんが、知っていますデータ、または書き込みデータ・ストリームは、それらを操作します。だから、選択ポーリングは何の違いの複雑性O(n)が持っていない、より多くのストリーム処理はしばらく長い未分化のポーリング時間を。

(2)ポーリング==> Oの時間複雑度(N)

世論調査は、本質的に何の違いを選択しないと、ユーザーはカーネル空間に渡された配列をコピーし、FDに対応する各機器の状態を照会、だろう  が、それは接続の最大数を制限しません、それが記憶されたリストに基づいているため、。

O(1)の(3)ファイルディスクリプタ==>時間計算

ファイルディスクリプタの世論調査では、イベントとして理解することができるビジーポーリングと非差別の世論調査とは異なり、流れはI / Oイベントは、私たちが知っているどのように発生しますがepoll。私たちは実際のepoll言うように、イベント駆動型(FDに関連付けられている各イベントを)、そしてこの時点で、我々はこれらのストリームで動作している意味があります。(複雑さはO(1)に還元されます)

、投票を選択し、ファイルディスクリプタは、IO多重化メカニズムです。I / O機構を介して多重化、ディスクリプタを複数のディスクリプタを監視することができ、一度レディ(準備一般読み取りまたは書き込みレディ)、プログラム読み取りおよび書き込み操作に応じて通知することができます。しかし、彼らはイベント後の読み取りおよび書き込みする必要があるので、それは、I / Oを選択し、ポーリング、ファイルディスクリプタの本質同期していることは読み書きプロセスがブロックされていることを、自分自身の読み込みと書き込みのための責任準備ができて、非同期I / Oは、自身に必要ではありません読み書きを担当し、非同期I /ユーザーへのカーネル空間からコピーされたデータの実装のためのO責任を負います。  

ファイルディスクリプタは、I / Oの多重化を選択し、マルチチャネルでのソリューションを提供することができます。そこ今やLinux固有のファイルディスクリプタでのLinuxカーネルをサポートすることができる、およびPOSIXで指定する必要があります選択し、一般的なオペレーティング・システムが実現しています

選択する:

さらなる処理は、設定または選択フラグFD性質に格納されたデータ構造をチェックすることによって行われます。このような欠点が原因で発生します。

1、FDの数を監視することができ、単一の処理が制限され、すなわち、限られたサイズは、ポートを監視することができます。

      一般に、これは大きな数との関係のメモリシステムでは、特定の数の缶猫を/ proc / sys / fs /ファイル-maxの図です。デフォルトでは、32ビットマシン1024です。デフォルトは2048 64ビットマシンです。

:ソケットがリニアスキャン走査する、すなわち、ポーリング方式、あまり効率的である2、

       各々が()を選択する複数のソケットはFD_SETSIZEソケットを横断スケジューリングすることによって行われるべき場合、ソケットは関係なくのが再び横断されるアクティブです。これは、多くのCPU時間を無駄にします。彼らは、アクティブ、オートコンプリート関連操作しているとき、ソケットはコールバック関数を与えるために登録されている場合、それは世論調査、ファイルディスクリプタを回避し、これはkqueueのがそうです。

3、オーバーヘッド構造を渡すときに、ユーザーが大空間とカーネル空間にコピーできるように、データ構造を格納するために多量のFDを維持する必要性

世論調査:

すべてのトラバース場合ポーリングとは、本質的に何の違いを選択していない、FDに対応する各機器の状態を問い合わせるその後、カーネル空間に渡された配列をコピーしてしまうユーザーは、装置内のデバイスは、レディキューとトラバーサルに追加された場合は、続けていいえデバイスはデバイスの準備ができてまたはアクティブタイムアウトになるまでのfd再び通過した後に再び目を覚ます、現在のプロセスを中断し、準備ができFDました。このプロセスは、多くの不必要なトラバーサルを受けています。

これは、接続の最大数を制限しませんそれはチェーン店をベースとしているため、だけでなく、欠点があります。

図1に示すように、FDアレイの多数にかかわらず、そのようなコピーは意味がないかどうか、ユーザ・モードとカーネルアドレス空間の間でその全体がコピーされます。                   

2は、世論調査もう一つの特徴は、「トリガレベル」で報告されたFD、処理されていない場合、それは再び次のポーリングをFDを報告します。

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

EPOLLLTとEPOLLETトリガモードの2種類を持っているのepoll、LTはデフォルトのモードである、ETは、「高速」モードです。LTモードで、限りFD読み取るべきデータが存在するように、それぞれのイベントがepoll_waitプログラムを操作することをユーザに思い出させるために、そのイベントを返し、ETで(エッジトリガ)モードでは、それは、次回までのデータのみプロンプト一度あります流れる前に、それはもはや読めるFD内のデータが存在するか否かを促されません。したがって、ETモードでは、読み取りは、それが光バッファ読むのに時間を取らなければならないFD、戻り値を読み出すために、読み取り要求されたことが少ないEAGAINに遭遇した値、またはエラーを超えています。もう一つの特徴は、epoll_ctl登録FDを通じて「イベント」の準備の通知方法を使用してファイルディスクリプタは、fdの準備ができたら、カーネルはFDをアクティブにするために同様のコールバックコールバックメカニズムを使用して、イベントがepoll_waitに通知することが可能です。

epollはなぜトリガモードをEPOLLET必要がありますか?

EPOLLLTモード場合、システムは、あなたが、彼らは戻りますがepoll_waitを呼び出すたびに読み書きする必要はありませんファイル記述子の数が多いが、それは非常にあなたが気にファイルディスクリプタを取得する準備ができて処理効率を低下させる準備ができたら..です こうしたエッジトリガモードEPOLLET語の使用、監視対象のイベントのファイル記述子はイベントがepoll_wait(書き込み可能)の読み書きにハンドラを通知します。これは読み取りを行われていない場合は、ファイルディスクリプタまで(例えば、読み取りおよび書き込みバッファが小さすぎるなど)、すべてのデータは、次のコールがepoll_waitを()、それは、それは一度ご連絡いたします、であること、を通知しません書きます2番目のイベントは、読み取り、書き込みはご連絡いたします表示されることがあります!このモデルは、効率のトリガレベルよりも高くなると、システムは、あなたが気にしない準備ができたファイルディスクリプタが殺到されることはありません

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

1、最大同時接続数に制限は開閉可能の上限FD 1024(約100 000ポート1Gメモリに聞くことができる)有意に高い、存在しない ;
2、効率を向上させる、いずれかのポーリング方式ではなく、FDの数として効率を高めます。利用可能なFDは、コールバック関数と呼ばれるだけアクティブ、
最大の利点は、その実際のネットワーク環境では、効率がepollをよりはるかに高くなります、それはちょうどあなたが「アクティブ」な接続のepollが、接続の合計数とは何の関係もあることですしています選択して投票。

図3に示すように、メモリコピー)(MMAPを使用してファイルマッピングメモリ加速度とカーネル空間メッセージング、すなわちMMAPのファイルディスクリプタの複製オーバーヘッド削減を使用。
、投票、ファイルディスクリプタの違いの概要を選択します。

図1に示すように、接続の最大数を開くことができるプロセスをサポート

選択する

(サイズは32 32ビットマシンでサイズが32整数の大きされた単一のプロセスFD_SETSIZEマクロ定義で開くことができる接続の最大数、同様に64ビットマシン上で32 FD_SETSIZE 32 64)、我々はもちろんの缶さらにテストを必要とする、修正し、カーネルを再コンパイルしますが、パフォーマンスが影響を受ける可能性があります。

投票

そして、世論調査に本質的な違いを選択していないが、それはストアにリンクされたリストに基づいているため、それは、接続の最大数を制限しません

epollを

接続数が上限を有するが、しかし大きな、機械1Gメモリに約100,000の接続を開くことができ、2Gメモリマシンは約20万を開くように接続することができます。

2、FDはIOの効率の劇的な増加をもたらします

選択する

なぜなら、接続のFD増加が遅くトラバースをもたらすように、各コールを横切る線状になり、「線形性能低下の問題」を

投票

同上

epollを

epollカーネルの実装は、各FD上のコールバック関数に従って達成されているので、唯一のアクティブなソケットが呼び出しコールバックするためのイニシアチブをとるだろう、それほどアクティブソケットの場合には、パフォーマンスの問題の使用は、フロントの両方には直線的に減少するのepollありませんすべてのソケットがアクティブになっているときには、パフォーマンスの問題があるかもしれません。

3、メッセージングモード

選択する

カーネルは、カーネルのコピー操作が必要で、ユーザ空間にメッセージを配信する必要があります

投票

同上

epollを

epollを共有カーネルとユーザ空間メモリを通じて達成しました。

要約:

要約すると、選択SELECT、P OLLは、自らの特性や特定の場面に応じて3つの方法がepollをするとき。

ケース1、最高のepollの表面特性が、接続および接続の数が少ないが、非常にアクティブで、選択して、ポーリング性能が良くepollをよりすることができ、通知メカニズムの後のepollは、関数コールバックの多くを必要とします。

それはすべてのポーリングを必要とするため、2、非効率的な選択。場合によってはしかし、また、優れた設計により、比較的非効率的に改善することができます 

 

3についてIOは非常に明確に書かれた3本の要約の前に、使用を多重化し、再帰反射エコーでサーバープログラムは、テストされています。次のように接続されています:

SELECT:IO多重化のSELECT概要

世論調査:Oの多重化の世論調査概要

epoll:IOはファイルディスクリプタの概要の多重化

  次のように今日では、これら三つのIO多重比較、参考書やオンライン上記の情報は、要約されています:

1、実現を選択

呼び出し手順を選択して、次のとおりです。

(1)は、ユーザ空間からカーネルスペースFD_SETにcopy_from_userをコピーします

コールバック関数を登録する(2)__pollwait

対応するポーリング・メソッドを呼び出し、すべてのFD、(ソケットに対して、ポーリングがsock_pollある、tcp_poll、udp_poll又はdatagram_pollに場合によって呼び出しをsock_poll)〜(3)

(4)tcp_poll例に、そのコアの実装では、コールバック関数の上方に登録されている__pollwait、です。

(5)__ pollwait主な仕事は、現在の(現在のプロセス)を入れてデバイスへのキュー待機中にハングアップすることで、異なるデバイスがtcp_pollごとに異なる待ちキューを持って、そのキューはSK-> sk_sleep(ノートがあることハングへのプロセスキューで待機している)は、プロセスがスリープされていることを意味するものではありません。デバイスがメッセージ(ネットワーク機器)やファイルデータを記入(ディスクデバイス)を受信した場合、デバイスはキューで待機しているプロセスを寝て目を覚ますでしょう、そして現在は起こされるだろう。

(6)poll方法返回时会返回一个描述读写操作是否就绪的mask掩码,根据这个mask掩码给fd_set赋值。

(7)如果遍历完所有的fd,还没有返回一个可读写的mask掩码,则会调用schedule_timeout是调用select的进程(也就是current)进入睡眠。当设备驱动发生自身资源可读写后,会唤醒其等待队列上睡眠的进程。如果超过一定的超时时间(schedule_timeout指定),还是没人唤醒,则调用select的进程会重新被唤醒获得CPU,进而重新遍历fd,判断有没有就绪的fd。

(8)把fd_set从内核空间拷贝到用户空间。

总结:

select的几大缺点:

(1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大

(2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大

(3)select支持的文件描述符数量太小了,默认是1024

2 poll实现

  poll的实现和select非常相似,只是描述fd集合的方式不同,poll使用pollfd结构而不是select的fd_set结构,其他的都差不多,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制。poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。

3、epoll

  epoll既然是对select和poll的改进,就应该能避免上述的三个缺点。那epoll都是怎么解决的呢?在此之前,我们先看一下epoll和select和poll的调用接口上的不同,select和poll都只提供了一个函数——select或者poll函数。而epoll提供了三个函数,epoll_create,epoll_ctl和epoll_wait,epoll_create是创建一个epoll句柄;epoll_ctl是注册要监听的事件类型;epoll_wait则是等待事件的产生。

  对于第一个缺点,epoll的解决方案在epoll_ctl函数中。每次注册新的事件到epoll句柄中时(在epoll_ctl中指定EPOLL_CTL_ADD),会把所有的fd拷贝进内核,而不是在epoll_wait的时候重复拷贝。epoll保证了每个fd在整个过程中只会拷贝一次。

  对于第二个缺点,epoll的解决方案不像select或poll一样每次都把current轮流加入fd对应的设备等待队列中,而只在epoll_ctl时把current挂一遍(这一遍必不可少)并为每个fd指定一个回调函数,当设备就绪,唤醒等待队列上的等待者时,就会调用这个回调函数,而这个回调函数会把就绪的fd加入一个就绪链表)。epoll_wait的工作实际上就是在这个就绪链表中查看有没有就绪的fd(利用schedule_timeout()实现睡一会,判断一会的效果,和select实现中的第7步是类似的)。

  对于第三个缺点,epoll没有这个限制,它所支持的FD上限是最大可以打开文件的数目,这个数字一般远大于2048,举个例子,在1GB内存的机器上大约是10万左右,具体数目可以cat /proc/sys/fs/file-max察看,一般来说这个数目和系统内存关系很大。

总结:

(1)select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而epoll其实也需要调用epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪时,调用回调函数,把就绪fd放入就绪链表中,并唤醒在epoll_wait中进入睡眠的进程。虽然都要睡眠和交替,但是select和poll在“醒着”的时候要遍历整个fd集合,而epoll在“醒着”的时候只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间。这就是回调机制带来的性能提升。

(2)select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把current往设备等待队列中挂一次,而epoll只要一次拷贝,而且把current往等待队列上挂也只挂一次(在epoll_wait的开始,注意这里的等待队列并不是设备等待队列,只是一个epoll内部定义的等待队列)。这也能节省不少的开销。 

おすすめ

転載: www.cnblogs.com/minikobe/p/12155584.html