I/O多重化-pollとepoll
I/O多重化は、プログラムが複数のファイル記述子を同時にリスニングできるようにし、プログラムのパフォーマンスを向上させる上で重要な役割を果たし、I/O多重化が最も多く使用されるシナリオは、TCPサーバがリスニングsocketと接続socketを同時に処理することである.
I/O多重化は、複数のファイル記述子をリスニングする機能を有するが、本質的にブロックされている.なぜなら、複数のファイル記述子が準備されている場合、プログラム自体が各ファイル記述子を順番に処理するしかないためである.これは、プログラムがシリアルで実行されているように見え、同時実行を実現することはできない(同時実行はマルチプロセスとマルチスレッドプログラミングに依存するしかない).
Linuxシステムでは,I/O多重化を実現するシステム呼び出しは主にselect,poll,epollである.ここではpollとepollだけを紹介します.
まずpollを見てみましょう.
poll
Pollシステム呼び出しは、指定された時間内に一定数のファイル記述子をポーリングして、selectと基本的に同じように準備されたファイル記述子があるかどうかをテストします.Poll関数のプロトタイプは次のとおりです.
各パラメータの役割を分析しますパラメータfdsはpollfd構造タイプの配列であり、すべてのユーザが注目するファイル記述子で発生する読み取り可能、書き込み可能、異常などのイベントを指定する.pollfd構造体の定義は以下の通りである: パラメータnfdsは配列の長さ、要素の個数、またはユーザが注目するファイル記述子の個数 を表す.パラメータtimeoutはタイムアウト時間 を示す.戻り値int、戻り-1はエラー、0はタイムアウト、>0はレディファイル記述子の個数 を表す.
selectシステム呼び出しに比べてpollは次のようにします.ユーザーが注目しているイベントタイプは、より多くの です.カーネルで修正するファイル記述子は、ユーザが注目するファイル記述子とは別に表され、呼び出すたびに を再設定する必要はない.ファイル記述子はビット単位ではなくintタイプを採用するため、ユーザが注目するファイル記述子の値範囲は以前よりも大きくなり、ファイル記述子ユーザは自分で設定することができる.
epoll
まずepollはLinuxシステム特有のI/O多重関数であり,selectやpollと大きく異なる. epollは、ユーザが注目するファイル記述子 を傍受するために関数のセットを使用する. epollは、ユーザが注目するファイル記述子をカーネル内のイベントテーブルに格納し、呼び出すたびにファイル記述子セットまたはイベントセット を繰り返す必要はない. epollは、カーネル内のイベントテーブル を一意に識別するために追加のファイル記述子を使用する必要がある.
epollの関数のセット:
epollとpollの違い:で返されるファイル記述子は異なります.pollはすべてのユーザが注目しているファイル記述子(準備完了および未準備)を返し、epollは準備完了のファイル記述子のみを返すので、pollユーザプログラムは準備完了のファイル記述子を検出する時間の複雑さはO(n)、epollはO(1)である. 関数の数が異なります.pollシステム呼び出しはpollの1つの関数のみであり、epollシステム呼び出しは の関数のセットである.
関数#カンスウ#
機能
epoll_create
ファイル記述子の作成
epoll_ctl
epollカーネルイベントテーブルの操作
epoll_wait
ファイル記述子上のイベントの検出関数のパラメータが異なります.Pollは、ユーザが注目するイベントタイプとカーネルが変更したイベントタイプを分離して表し、epollはカーネルイベントテーブルによってユーザが注目するファイル記述子上のイベントタイプを維持する. 呼び出し時のファイル記述子のコピーは異なります.Pollは呼び出すたびにユーザ空間のデータをカーネル空間にコピーし、戻るとカーネル空間のデータをユーザ空間にコピーする必要がありますが、epollはepoll_のみを呼び出します.ctl時に1回コピー、epoll_wait呼び出し時にカーネル空間からユーザに準備されたファイル記述子のみをコピーする. カーネルの実装方法は異なります.Pollはポーリング方式で準備完了イベントを検出し、epollはコールバック方式を採用する. でサポートされている動作モードは異なります.PollはLTモードでのみ動作し,epollはより効率的なETモードをサポートする.
I/O多重化は、複数のファイル記述子をリスニングする機能を有するが、本質的にブロックされている.なぜなら、複数のファイル記述子が準備されている場合、プログラム自体が各ファイル記述子を順番に処理するしかないためである.これは、プログラムがシリアルで実行されているように見え、同時実行を実現することはできない(同時実行はマルチプロセスとマルチスレッドプログラミングに依存するしかない).
Linuxシステムでは,I/O多重化を実現するシステム呼び出しは主にselect,poll,epollである.ここではpollとepollだけを紹介します.
まずpollを見てみましょう.
poll
Pollシステム呼び出しは、指定された時間内に一定数のファイル記述子をポーリングして、selectと基本的に同じように準備されたファイル記述子があるかどうかをテストします.Poll関数のプロトタイプは次のとおりです.
int poll(struct pollfd *fds,nfds_t nfds,int timeout) //
各パラメータの役割を分析します
struct pollfd
{
int fd; //
short events; //
short revents; // ,
}
selectシステム呼び出しに比べてpollは次のようにします.
epoll
まずepollはLinuxシステム特有のI/O多重関数であり,selectやpollと大きく異なる.
epollの関数のセット:
int epoll_create(int size); //
int epoll_ctl(int epollfd,int op,int fd,struct epoll_event *event);
// ( , , )
epoll_wait(int epollfd,struct epoll_event *event,int maxevents,int timeout);
epollとpollの違い:
関数#カンスウ#
機能
epoll_create
ファイル記述子の作成
epoll_ctl
epollカーネルイベントテーブルの操作
epoll_wait
ファイル記述子上のイベントの検出