Ok, sete anos depois, tenho uma resposta mais convincente com base neste artigo de Evan Klitzke.
Em primeiro lugar, a razão pela qual fiz a pergunta em primeiro lugar é a vantagem de desempenho frequentemente mencionada em epollcomparação com poll/ select. Diz a palavra que epollé assintoticamente mais eficiente (O (1)) do que poll(O ( N )).
O que não é tão conhecido é que apenas o disparo por borda epoll é verdadeiramente O (1), enquanto o disparo por nível epoll tem os mesmos assintóticos de O ( N ). De fato, o sabor acionado por nível precisa passar por cima da lista de fds vigiados toda vez que é chamado para encontrar aqueles que potencialmente ainda têm mais dados pendentes. A variedade acionada por borda pode depender de sinais em resposta a novos bytes que aparecem em um fd.
Seria interessante descobrir como exatamente um encadeamento retomado descobre qual fd o despertou, mas certamente é possível que esse dado seja transmitido durante a ativação do epoll.
Obviamente, poll/ selectnão pode usar borda desencadeada epoll como a semântica são diferentes. Como vimos, a implementação com acionamento por nívelepoll não traria benefícios de desempenho assintóticos. E, possivelmente, também o afetará negativamente se os fatores constantes ou os termos constantes forem altos (como parecem basear-se em uma referência grosseira que eu fiz e citei em outro comentário).
Para obter mais informações, leia E / S de bloqueio, E / S sem bloqueio e Epoll .