エッジトリガ (epoll) の話

エッジトリガのメリットとしては、「データが貯まった状態で処理を後回ししても起こされない」というのもあるみたいだけど、これはEPOLLONESHOTというオプションを使うとレベルトリガでも実現可能。

epollであえてエッジトリガを使うとすれば、「ノンブロッキングI/Oでいつも最後までデータを読んでるから、レベルトリガはただの無駄だよねー」とかいうときの気持ちの問題ではなかろうか。

http://d.hatena.ne.jp/nishidakeisuke/20080703/p1

エッジトリガとレベルトリガで、コーディングの差が大きくなるのは、むしろデータを書く場合なんじゃないのかなぁ。レベルトリガだと、

  • send(2) が EAGAIN を返したら epoll に fd を登録
  • アプリケーション側のバッファが空になったら、epoll から fd を削除

というコードを書かないといけない (と思う) のに対し、エッジトリガなら、fd は epoll に登録しっぱなしにしておいて、

  • アプリケーション内で書込が発生する際
    • アプリケーション側のバッファが空であれば即 send(2)
    • バッファが空でなければ、バッファに追記
  • epoll イベントを受け取ったら、send(2)

という形で書くことができる (と思う)。

結局、アプリケーション内でちゃんとバッファリングを行う場合は、(読み書きともに) エッジトリガで十分なわけだし、その方が、より軽く、より簡潔なコードになるんじゃないかなと思った。

自分は (select(2) や poll(2) との互換性を保つのが面倒だから) いままでレベルトリガしか使ったことがないので、外しているかもしれませんが。

追記: エッジトリガはステート情報を交換するための API、レベルトリガはステートを確認するための API と言うといいのかなぁ。