Ok, 7 anos depois eu tenho uma resposta mais convincente com base em este artigo de Evan Klitzke.
Primeiramente, a razão pela qual fiz a pergunta em primeiro lugar é a vantagem de desempenho mencionada com frequência de epoll
em comparação com poll
/ select
. A palavra diz que epoll
é assintoticamente mais eficiente (O (1)) do que poll
(O ( N )).
O que não é tão conhecido é que apenas acionado por borda epoll
é realmente O (1), enquanto que nível-acionado epoll
tem a mesma assintótica de O ( N ). De fato, o sabor level-triggered precisa passar por cima da lista de fds assistidos toda vez que é chamado para encontrar aqueles que potencialmente ainda têm mais dados pendentes. A variedade Edge-trigger pode confiar em sinais em resposta a novos bytes que aparecem em um fd.
Seria interessante descobrir como exatamente um tópico resumido descobre qual fd o despertou, mas é certamente possível que esse dado seja passado durante o despertar acionado por epoll.
Obviamente, poll
/ select
não pode usar acionado por borda epoll
, pois as semânticas são diferentes. Como vimos, a implementação com level-triggered epoll
não traria benefícios de desempenho assintótico. E, possivelmente, também afetá-lo negativamente se os fatores constantes ou os termos constantes forem altos (pois parecem basear-se em uma comparação grosseira que fiz e citei em outro comentário).
Para mais informações, leia Bloqueio de E / S, E / S não bloqueantes e Epoll .