【イーポール】

epoll とは?

最終更新:
💡 大勢の中から、手を挙げた人だけを教えてくれる係

Linuxで、ソケットなど複数のファイルディスクリプタを登録し、読み書きが可能になったものなどのI/Oイベントを受け取る仕組み。多数の接続を扱うサーバーのイベントループなどで使う。

📌 このページのポイント
epoll:準備できた対象を通知例:監視するソケットのfdfd 4待機中✓ fd 7読める状態fd 9待機中epoll_wait()準備完了のイベントを返すアプリアプリ側でreadなどを実行通知とデータの読み取りは別ETでは、未読データの扱いに注意
通知を受け取ったあと、データを読む処理はアプリが行います。
ひよこ ひよこ
epollって、何を見張るの?
ペンギン先生 ペンギン先生
Linuxで、ソケットなどのファイルディスクリプタを見張るよ。「データを読める」「書き込みできる」といったI/Oイベントを受け取る仕組みなんだ。
ひよこ ひよこ
selectやpollとは、何が違うの?
ペンギン先生 ペンギン先生
epollでは、監視したい対象を登録しておき、準備ができた対象のイベントを受け取る。selectやpollのように、待つたびに監視対象の一覧を渡す方式とは違うよ。多数の接続を扱うイベントループで役立つんだ。
ひよこ ひよこ
どうやって、データを受け取るの?
ペンギン先生 ペンギン先生
epoll_create1で監視用のインスタンスを作り、epoll_ctlで対象を登録し、epoll_waitでイベントを待つ。その後、アプリがreadなどでデータを読むよ。epoll自身がデータを読み取って渡すわけではないんだ。
ひよこ ひよこ
レベルトリガとエッジトリガって何?
ペンギン先生 ペンギン先生
レベルトリガは、読めるデータが残っているなど、条件が続く間は通知する方式で、既定はこちら。エッジトリガは、監視対象の変化に応じて通知する方式だよ。どちらを使うかで、データを読む処理の書き方が変わるんだ。
ひよこ ひよこ
エッジトリガなら、通知を待てばいい?
ペンギン先生 ペンギン先生
一部だけ読んで次の通知を待つと、未読データがあっても待ち続けることがあるよ。典型的にはノンブロッキングにして、今はこれ以上読めないことを示すEAGAINまで読み進める。速さだけで選ばず、この扱いを設計しよう。通常のファイルやディレクトリなど、登録できない対象もあるんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「epoll」って出てきたら「Linuxで、読み書きできる接続などを効率よく見張る仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「epoll」 = LinuxのI/Oイベント通知API
💬 LinuxのAPIの名前だよ。ソケットなどのI/Oイベントを監視するときに使うんだ。

参考資料

← 用語集にもどる