選択/投票/epoll比較分析

  
 

select /poll /epollは、同時に複数のディスクリプタを監視することができるIO多重化メカニズムで、ディスクリプタの準備が完了すると(読み取りまたは書き込み準備ができたとき)、対応するプログラムに直ちに読み取りまたは書き込みが通知されます。本質的にselect /poll /epollは同期I /Oです、すなわち読み書きはブロックされます。 1つ、select

プロトタイプ:
int select(int n、fd_set * readfds、fd_set * writefds、fd_set * exceptfds、struct timeval * timeout);

select関数から3つのクラスを監視するファイル記述子:writefds、readfds、exceptfds。記述子の準備が整う(データが読み取り可能、書き込み可能、​​または例外が発生する)かタイムアウトになるまでselect関数を呼び出すとブロックされ、関数は戻ります。 select関数が戻ったら、ディスクリプタセットをたどって準備ができたディスクリプタを見つけることができます。

selectのデメリット

  • 1つのプロセスが監視できるファイル記述子の最大数は、Linuxでは1024ですマクロの定義を変更することで上限を増やすことができますが、それも存在します。低い効率;
    IOの効率監視対象の記述子の数が増えると、その効率も直線的に低下します。

    2、poll

    プロトタイプ:
    Int poll(構造体pollfd * fds、符号なしint nfds、intタイムアウト);

    ここで、pollfdは、次のように監視対象記述子のセットを表します。
    struct pollfd {int fd; //ファイル記述子短いイベント; //監視対象request short short revents; //発生したイベント};

    pollfd構造体には、監視するイベントと発生するイベントが含まれ、pollfdに上限はありません(ただし、大きすぎるとパフォーマンスが低下します)。 select関数と同様に、poll関数が戻ったときには、ディスクリプタセットをトラバースすることでレディディスクリプタを見つけることができます。

    上記から、戻った後にファイルディスクリプタをトラバースして準備完了ソケットを取得する必要があることを選択してポーリングします。実際、同時に接続された多数のクライアントは、一度に少数の作動可能状態を持つことがあるため、モニター対象記述子の数が増えると、それらの効率も直線的に低下します。
    3、epoll

    epollは2.6カーネルで提案された、select and pollの拡張版です。選択および投票と比較して、epollはより柔軟であり、記述子の制限はありません。 Epollはファイルディスクリプタを使用して複数のディスクリプタを管理し、ユーザー空間のファイルディスクリプタ内のイベントをカーネル内のイベントテーブルに格納するので、ユーザー空間とカーネル空間へのコピーは1回だけ必要です。 epollメカニズムは、Linuxの最も効率的なI /O多重化メカニズムで、複数のファイルハンドルに対するI /Oイベントを待ちます。

    選択/ポーリングにはメソッドが1つだけあり、epollにはepoll_create()、epoll_ctl()、およびepoll_wait()の3つのメソッドがあります。
    3.1 epoll_create()
    int epoll_create(int size);

    はepollハンドルを作成するために使用され、sizeはlistenする記述子の数を参照します。現在カーネルは動的拡張をサポートしています。十分なスペースがない場合、最初に割り当てられたfdの数は動的に拡張されます。 epollハンドルを作成した後、それはfd値を取ります。
    ls /proc /< pid> /fd ///これは端末で実行できますepollを使用した後にfd

    を見た後、close()を呼び出さなければなりません。オフにすると、そうでなければfdが使い果たされる可能性があります。
    3.2 epoll_ctl()
    int epoll_ctl(int epfd、int op、int fd、struct epoll_event * event);

    は、fdのような、監視が必要なファイルディスクリプタ(fd)に対してop操作を実行するために使用されます。 epollハンドルに追加します。

  • epfd:はepoll_create()の戻り値です。
  • op:は3つのマクロで表され、fdのlistenイベントの追加、削除、および変更を表すop操作を示します。;
  • EPOLL_CTL_ADD(追加)
  • EPOLL_CTL_DEL(削除)
  • EPOLL_CTL_MOD(修正)


  • FD:ファイルの説明は聞く必要があります

  • epoll_event:監視されるイベント、struct epoll_eventは次のように構成されています。
    struct epoll_event {__uint32_tイベント; /* Epollイベント* /epoll_data_tデータ; /*ユーザー使用可能データ* /};

    イベントは、対応するファイル記述子の値を示すことができる:(操作)
    ログイン

  • EPOLLIN:ノーマルクローズピアSOCKET)を含む(読み取り、
  • EPOLLOUT:書き込み可能;
  • EPOLLERR:エラー;
  • EPOLLHUP:割り込み;
  • EPOLLPRI:優先順位の高い可読性(ここでは帯域外データの存在を示す必要があります);
    < Li> EPOLLET:EPOLLをエッジトリガモードに設定します。これはフェーズです。レベルトリガの条件で。
  • EPOLLONESHOT:聞くだけで1事件、この事件を聞いて終了したら、もはやこのイベントに耳を傾けるだろうで
    3.3のイベントがepoll_wait()
    int型のイベントがepoll_wait(epfdに存在するint型、struct epoll_event * events、int maxevents、int timeout);
  • epfd:epfdでioイベントを待ち、maxeventsイベントを返す;
  • events:カーネルからイベントを取得するために使用されるコレクション;
  • maxevents:events、epoll_create()の作成時にmaxeventsの値をサイズより大きくすることはできません。
  • timeout:timeout(ミリ秒、0は直ちに戻ります)。

    この関数は、タイムアウトしたことを示すために0を返すなど、処理が必要なイベントの数を返します。 select /pollでは、プロセスは特定のメソッドを呼び出した後にすべての監視対象ファイル記述子をスキャンし、epollはepoll_ctl()を介して事前にファイルを登録します。ディスクリプタ - ファイルディスクリプタの準備が整うと、カーネルはコールバックのようなコールバックメカニズムを使用してファイルディスクリプタをすばやく起動し、プロセスがepoll_wait()を呼び出したときに通知を受けます。 (ここではファイル記述子の走査は削除されていますが、コールバックのメカニズムを監視することによって行われています。これがepollの魅力です。)

    epollの利点

    1. 監視ディスクリプタの数に制限はありませんサポートされているFDの制限は、オープンファイルの最大数ですcat /proc /sys /fs /file-maxで確認できます一般的に言って、この数はシステムメモリと大きな関係があります。携帯電話の場合、この値は200,000から300,000です。

    2. IO効率がFDの低下を監視する数を増加することはありません。 Epollはpollおよびpoll pollの方法とは異なりますが、各fdで定義されているコールバック関数によって実装されており、ready fdだけがコールバック関数を実行します。あなたはアイドル接続またはデッド接続の多くをしない場合


      、ファイルディスクリプタと効率性比率が非常に高い/投票を選択しませんが、アイドル状態の接続が多数に直面したとき、あなたは見つけるでしょうEpollはselect /pollよりもはるかに効率的です。
      zh-CN"],null,[1],zh-TW"]]]

  • Copyright © Windowsの知識 All Rights Reserved