epollは、スケーラブルな I/O イベント通知メカニズムのためのLinux カーネル システムコールであり、 Linux カーネルのバージョン 2.5.45 で初めて導入されました。[1]その機能は、複数のファイル記述子を監視して、それらのいずれかで I/O が可能かどうかを確認することです。これは、古いPOSIX select(2)およびpoll(2) システムコールを置き換え、監視するファイル記述子の数が多い、より要求の厳しいアプリケーションでより優れたパフォーマンスを実現することを目的としています ( O ( n ) 時間で動作する古いシステムコールとは異なり、Oepoll (1) 時間で動作します)。[2]
epollはFreeBSDのと似ており、ユーザ空間関数kqueueのセットで構成され、各関数は設定可能なカーネルオブジェクトを示すファイル記述子引数を受け取り、それらに対して協調して動作します。 は、現在監視されているすべてのファイル記述子を追跡するために、赤黒木(RB木)データ構造を使用します。[3]epoll
翻訳
int epoll_create1 ( intフラグ);
オブジェクトを作成しepoll、そのファイル記述子を返します。flagsパラメータにより、epoll の動作を変更できます。有効な値は 1 つだけです。EPOLL_CLOEXECはepoll_create()の古いバージョンでありepoll_create1()、Linux カーネル バージョン 2.6.27 および glibc バージョン 2.9 では非推奨です。[4]
int epoll_ctl ( int epfd 、int op 、int fd 、struct epoll_event *イベント);
このオブジェクトによって監視されるファイル記述子と、監視されるイベントを制御 (構成) します。ADD op、MODIFY、または DELETE を指定できます。
int epoll_wait ( int epfd 、struct epoll_event * events 、int maxevents 、int timeout );
に登録されたイベントのいずれかがepoll_ctl、少なくとも 1 つ発生するかタイムアウトが経過するまで待機します。 で発生したイベントを一度にevents最大 まで返します。 は監視する /file 記述子の最大数です。 [5] [6]ほとんどの場合、は引数のサイズ(配列) の値に設定されます。
maxeventsmaxeventsepoll_eventmaxevents*eventsstruct epoll_event *events
トリガーモード
epollは、エッジ トリガー モードとレベル トリガーモードの両方を提供します。エッジ トリガー モードでは、 の呼び出しは、epoll_wait新しいイベントがオブジェクトにキューに入れられたときにのみ戻りますepollが、レベル トリガー モードでは、epoll_wait条件が満たされている限り戻ります。
たとえば、に登録されたパイプepollがデータを受信した場合、 の呼び出しはepoll_wait戻り、読み取るデータが存在することを通知します。リーダーがバッファからデータの一部のみを消費したと仮定します。レベル トリガー モードでは、epoll_waitパイプのバッファに読み取るデータが含まれている限り、 のさらなる呼び出しはすぐに戻ります。ただし、エッジ トリガー モードでは、epoll_wait新しいデータがパイプに書き込まれた場合にのみ が戻ります。[1]
バグ
ブライアン・カントリルは、 Linuxには、入出力完了ポート、イベントポート(Solaris)、kqueueなどepollの前身から学んでいれば避けられたはずの間違いがあると指摘した。[7]しかし、彼の批判の大部分は、Linuxのとオプションによって解決された。は、2004年2月にリリースされたLinuxカーネルメインラインのバージョン2.6.2で追加されました。は、2016年3月にリリースされたバージョン4.5で追加されました。[8]epollEPOLLONESHOTEPOLLEXCLUSIVEEPOLLONESHOTEPOLLEXCLUSIVE
参照
参考文献
- ^ ab "epoll(7) - Linuxマニュアルページ". Man7.org. 2012-04-17 . 2014-03-01閲覧。
- ^ Oleksiy Kovyrin (2006-04-13). 「非同期ネットワークプログラミングのための epoll() の使用」Kovyrin.net . 2014-03-01閲覧。
- ^ 「epollの実装(1)」。idndx.com。2014年9月。
- ^ ラブ、ロバート (2013)。Linuxシステムプログラミング(第 2 版)。オライリー。97、98 ページ。ISBN 978-1-449-33953-1。
- ^ 「epoll_wait: maxevents」. 2010年6月3日. 2023年7月6日閲覧。
- ^ "epoll_wait(2) — Linuxマニュアルページ". 2023-03-30 . 2023-07-06閲覧。
- ^ Ghostarchive および Wayback Machine にアーカイブされています: 「Ubuntu Slaughters Kittens | BSD Now 103」。YouTube。
- ^ 「Epoll は根本的に壊れている 1/2」。idea.popcount.org。2017 年 2 月 20 日。2017年 10 月 6 日閲覧。
外部リンク
- epoll マニュアルページ
- epoll パッチ
