O nível acionado epoll
é muito parecido com poll
. Por que não é poll
apenas um invólucro para epoll
sistemas que suportam o último?
EDIT: Quero dizer, existem barreiras técnicas contra essa decisão? A implementação poll
como epoll
drasticamente aumentaria o desempenho de muitos aplicativos de rede. Deve haver algum problema técnico que não percebo.
poll
como um wrapper paraepoll
seria incrivelmente complexo e ineficiente. Você precisaria configurar um novo descritor de epoll e configurá-lo a cada vez ou teria que fazer uma comparação dolorosa da pesquisa atual definida com a já associada ao descritor de epoll. Que nojo!Respostas:
pesquisa é muito mais simples para casos fáceis; provavelmente é tão eficiente para pequenos números de descritores de arquivos. O chamador não precisa se preocupar em manter os DFs de pesquisa e adicionar / remover FDs; eles podem apenas adicionar todos os que desejam em cada chamada para pesquisa.
Meu sentimento é que eles são complementares, embora a pesquisa possa ser implementada como um invólucro para epoll, provavelmente não deveria ser.
O epoll poderia (quase) ser implementado como um invólucro para a enquete, mas isso derrotaria seus argumentos de eficiência.
fonte
A semântica de
poll()
eepoll
é diferente. Sepoll()
você informar que um descritor é legível, você faz algumas leituras, mas não lê todos os bytes disponíveis e, em seguida, passa esse descritorpoll()
novamente, ele será ativado imediatamente. AFAIK o mesmo não é verdadeepoll
.Observe também que os
epoll
descritores são um recurso limitado. A página de manual fala sobreepoll_create()
condições de falha com as quais o AFAIK não ocorrepoll()
.Embora eu não tenha certeza de todos os detalhes da implementação, podemos dizer que não faz sentido criar
poll()
um invólucroepoll
. O programador deve estar ciente desses pontos, e o código existente escrito com as suposiçõespoll()
permitidas seria interrompido.fonte
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
epoll
comparação compoll
/select
. Diz a palavra queepoll
é assintoticamente mais eficiente (O (1)) do quepoll
(O ( N )).O que não é tão conhecido é que apenas o disparo por borda
epoll
é verdadeiramente O (1), enquanto o disparo por nívelepoll
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
/select
não pode usar borda desencadeadaepoll
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 .
fonte