わかりました、7年後、私はEvan Klitzkeによるこの記事に基づいて、より説得力のある答えを得ました。
最初に、私が最初に質問した理由は、/ epoll
と比較してよく言及されるパフォーマンス上の利点です。つまり、(O(N))よりも(O(1))の方が漸近的に効率的です。poll
select
epoll
poll
あまり広く知られていませんが、エッジトリガー のみepoll
が真にO(1)であるのに対し、レベルトリガー epoll
はO(N)と同じ症状を示します。実際、レベルトリガーのフレーバーは、呼び出されるたびに監視中のfdsのリストを調べて、まだ保留中のデータがまだ残っている可能性があるものを見つける必要があります。エッジトリガーバラエティは、fdに現れる新しいバイトに応答する信号に依存できます。
再開されたスレッドがどのfdがそれを起こしたかを正確に知る方法を見つけることは興味深いでしょうが、このデータが、epollによってトリガーされたウェイクアップ中に渡される可能性は確かにあります。
明らかに、セマンティクスが異なるため、poll
/ select
はエッジトリガー epoll
を使用できません。見てきたように、レベルトリガー で実装してepoll
も、漸近的なパフォーマンス上のメリットはありません。そして、おそらく、定数因子または定数項が高い場合にも悪影響を及ぼします(これらは、私が行って別のコメントで引用した大まかなベンチマークに基づいているようです)。
詳細については、ブロックI / O、非ブロックI / O、およびEpollを参照してください。