Linux におけるポーリングと選択の違いは次のとおりです。単一の選択プロセスで開くことができる接続の最大数は「FD_SETSIZE」マクロによって定義され、そのサイズは 32 の整数ですが、ポーリングはリンクされた接続を使用します。リストストレージなので、最大接続数に制限はありません。
#このチュートリアルの動作環境: linux7.3 システム、Dell G3 コンピューター。
各プロセスで使用される選択には、最大接続数に制限があり (FD_SETSIZE のみ)、ポーリングにはそのような制限はありません。 (リンク リスト ストレージを使用);
epoll と select は両方とも、マルチチャネル I/O 多重化ソリューションを提供できます。これらはすべて現在の Linux カーネルでサポートできますが、このうち epoll は Linux に固有ですが、select は POSIX で規定され、一般的なオペレーティング システムで実装される必要があります。
#select は基本的に、fd フラグを格納するデータ構造を設定または確認することによって、次の処理ステップを実行します。この欠点は次のとおりです:1. 単一プロセスで監視できる fd の数は制限されており、リスニング ポートのサイズは制限されています。
一般に、この数値はシステム メモリと密接に関係しており、具体的な数値は cat /proc/sys/fs/file-max で確認できます。 32 ビット マシンのデフォルトは 1024 です。 64 ビット マシンのデフォルトは 2048.2 です。ソケットをスキャンするときは、リニア スキャンです。つまり、効率が低いポーリング メソッドが使用されます。多くのソケットがあります。各 select() は、FD_SETSIZE ソケットをトラバースすることによってスケジューリングを完了する必要があります。どのソケットがアクティブであっても、一度トラバースされます。これにより、多くの CPU 時間が無駄になります。ソケットのコールバック関数を登録し、関連する操作がアクティブなときに自動的に完了できる場合は、ポーリングを回避できます (これが epoll と kqueue の機能です)。 3. 多数の FD を格納するために使用されるデータ構造を維持する必要があるため、ユーザー空間とカーネル空間の間で構造を転送するときに高いコピー オーバーヘッドが発生します。 #poll:
Poll は基本的に select と同じです。ユーザーによって渡された配列をカーネル空間にコピーし、各 fd に対応するデバイスのステータスをクエリします。デバイスの準備ができている場合は、 , デバイスの待機キューに項目を追加して続行します。トラバーサル、すべての fd を走査した後に準備完了のデバイスが見つからない場合、デバイスの準備が完了するかイニシアチブがタイムアウトになるまで、現在のプロセスは一時停止されます。ウェイクアップされた後、トラバースします。またFD。このプロセスでは、多くの不必要な走査が行われました。
リンク リストに基づいて保存されるため、接続の最大数に制限はありませんが、欠点もあります:
1. 多数の fd 配列が次のようにコピーされます。このようなコピーが意味があるかどうかに関係なく、ユーザー モードおよびカーネル アドレス空間間で全体がコピーされます。
2. ポーリングのもう 1 つの機能は「水平トリガー」です。fd が報告されても処理されなかった場合、次回ポーリングされたときに fd が再度報告されます。 。
epoll:epoll には、EPOLLLT と EPOLLET という 2 つのトリガー モードがあります。LT はデフォルト モードで、ET は「高速」モードです。 LT モードでは、fd に読み取るデータがある限り、epoll_wait は毎回そのイベントを返し、ユーザー プログラムに動作するよう通知します。ET (エッジ トリガー) モードでは、次のデータがあるまで一度だけプロンプトを表示します。 fd に読み取り可能なデータがまだあるかどうかに関係なく、流入の前にそれ以上のプロンプトは表示されません。したがって、ET モードでは、fd を読み取るときに、読み取りの戻り値が要求された値より小さくなるか、EAGAIN エラーが発生するまで、そのバッファーを読み出す必要があります。もう 1 つの特徴は、epoll が「イベント」準備通知メソッドを使用して、epoll_ctl を通じて fd を登録することです。fd の準備が完了すると、カーネルはコールバックのようなコールバック メカニズムを使用して fd をアクティブ化し、epoll_wait が通知を受信できるようになります。
なぜ epoll には EPOLLET トリガー モードがあるのですか?EPOLLLT モードが採用されている場合、読み書きする必要のない準備完了ファイル記述子がシステム内に多数存在すると、epoll_wait が呼び出されるたびにそれらのファイル記述子が返されます。ファイル記述子の効率は、処理プログラムが処理可能なファイルを取得する能力を大幅に低下させます。 EPOLLET のエッジ トリガー モードが使用されている場合、監視対象のファイル記述子で読み取りおよび書き込み可能なイベントが発生すると、epoll_wait() はハンドラーに読み取りと書き込みを通知します。今回、すべてのデータの読み取りおよび書き込みが行われていない場合 (たとえば、読み取り/書き込みバッファーが小さすぎる場合)、次回 epoll_wait() を呼び出したときに通知されません。つまり、通知されるまでは 1 回だけ通知されます。ファイル記述子は、2 番目の読み取りおよび書き込み可能なイベントが発生するまで通知されません。 ! !このモードは水平トリガーよりも効率的です。システムは、必要のない大量の準備済みファイル記述子で溢れかえることはありません。
epoll の利点:1. 最大同時接続数の制限はなく、開くことができる FD の上限は 1024 よりはるかに大きくなります (1G メモリで約 100,000 のポートを監視できます); 2. 効率の向上ではありません。ポーリング方式のため、FDの数が増加しても増加しません。増加しても効率は低下します。アクティブで使用可能な FD のみがコールバック関数を呼び出します。
Epoll の最大の利点は、「アクティブな」接続のみを考慮し、接続の総数とは関係がないことです。ネットワーク環境、Epoll の効率は、選択してポーリングするよりもはるかに高くなります。
3. メモリ コピー: mmap() ファイル マッピング メモリを使用して、カーネル スペースでのメッセージ パッシングを高速化します。つまり、epoll は mmap を使用してコピーのオーバーヘッドを削減します。 select、poll、epoll の違いの概要: 1. プロセスによってオープンできる接続の最大数をサポートします。 select 単一プロセスで開くことができる接続の最大数は FD_SETSIZE マクロによって定義され、そのサイズは 32 個の整数のサイズです (32 個の整数の場合)。ビット マシンの場合、サイズは 3232、同様に 64 ビット マシンの FD_SETSIZE は 3264)、もちろん変更してカーネルを再コンパイルすることはできますが、パフォーマンスが影響を受ける可能性があるため、さらなるテストが必要です。 poll poll は基本的に select と同じですが、リンクされたリストに基づいて保存されるため、最大接続数に制限はありません epoll 接続数には上限がありますが、非常に多く、メモリ 1G のマシンでは約 100,000、メモリ 2G のマシンでは約 200,000 の接続を開くことができます。 select によって引き起こされる IO 効率の問題 接続は呼び出されるたびに線形に通過するため、FD が増加すると、トラバース速度のゆっくりとした「線形低下」が発生し、パフォーマンスの問題が発生します。」 poll 上記と同じ epoll epoll カーネルの実装は各 fd のコールバック関数に基づいているため、アクティブなソケットのみがcallback はアクティブに呼び出されるため、アクティブなソケットが少ない場合、epoll を使用すると、前の 2 つのような直線的なパフォーマンス低下の問題は発生しませんが、すべてのソケットがアクティブな場合には、パフォーマンスの問題が発生する可能性があります。 #3. メッセージ受け渡し方法 select 要約: 要約すると、select、poll、または epoll を選択するときは、特定の使用機会とこれら 3 つのメソッドの特性を考慮する必要があります。 Linux ビデオ チュートリアル
以上がLinuxのポーリングと選択の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。