Le niveau déclenché epoll
est très similaire à poll
. Pourquoi n'est-il pas poll
juste un wrapper pour epoll
les systèmes prenant en charge ces derniers?
EDIT: Je veux dire, y a-t-il des obstacles techniques à une telle décision? Une mise poll
en œuvre telle que celle- epoll
ci augmenterait considérablement les performances de nombreuses applications réseau. Il devrait y avoir un problème technique que je ne remarque pas.
poll
tant que wrapper pourepoll
serait incroyablement complexe et inefficace. Vous devrez soit mettre en place un nouveau descripteur epoll et le configurer à chaque fois, soit effectuer une comparaison douloureuse de l'ensemble de sondages actuel avec celui déjà associé au descripteur epoll. Beurk!Réponses:
le sondage est beaucoup plus simple pour les cas faciles; il est probablement tout aussi efficace pour un petit nombre de descripteurs de fichiers. L'appelant n'a pas à s'inquiéter de la maintenance des FD d'interrogation et de l'ajout / suppression de FD, il peut simplement ajouter tous ceux qu'il souhaite à chaque appel à interroger.
Mon sentiment est qu'ils sont complémentaires, même si le sondage POURRAIT être implémenté comme un wrapper pour epoll, il ne devrait probablement pas l'être.
epoll pourrait (presque) être implémenté comme wrapper pour poll, mais cela irait à l'encontre de ses arguments d'efficacité.
la source
La sémantique de
poll()
etepoll
est différente. Sipoll()
vous informe qu'un descripteur est lisible, alors vous effectuez une lecture mais ne lisez pas tous les octets disponibles, puis transmettez àpoll()
nouveau ce descripteur , il se réveillera immédiatement. AFAIK la même chose n'est pas vraieepoll
.Notez également que les
epoll
descripteurs sont une ressource limitée. La page de manuel parle deepoll_create()
conditions d'échec avec lesquelles l'AFAIK ne se produit paspoll()
.Bien que je ne sois pas sûr de tous les détails de l'implémentation, nous pouvons dire que cela n'a pas de sens de faire
poll()
un wrapper pourepoll
. Le programmeur doit être conscient de ces points, et le code existant écrit avec les hypothèses lepoll()
permet se briserait.la source
D'accord, 7 ans plus tard, j'ai une réponse plus convaincante basée sur cet article d'Evan Klitzke.
Premièrement, la raison pour laquelle j'ai posé la question en premier lieu est l'avantage de performance souvent mentionné
epoll
par rapport àpoll
/select
. Le mot va quiepoll
est asymptotiquement plus efficace (O (1)) quepoll
(O ( N )).Ce qui n'est pas aussi largement connu, c'est que seul le déclenchement sur front
epoll
est vraiment O (1), tandis que le niveau déclenchéepoll
a les mêmes asymptotiques que O ( N ). En effet, la saveur déclenchée par le niveau doit parcourir la liste des fds surveillés chaque fois qu'elle est appelée pour trouver ceux qui ont potentiellement encore plus de données en attente. La variété déclenchée par le front peut s'appuyer sur des signaux en réponse à de nouveaux octets apparaissant dans un fd.Il serait intéressant de savoir comment un thread repris reprend exactement quel fd l'a réveillé, mais il est certainement possible que cette donnée soit transmise pendant le réveil déclenché par epoll.
De toute évidence,
poll
/select
ne peut pas utiliser le déclenchementepoll
par front car la sémantique est différente. Comme nous l'avons vu, l'implémentation avec un niveau déclenchéepoll
n'apporterait pas d'avantages de performances asymptotiques. Et peut-être aussi l'affecter négativement si des facteurs constants ou des termes constants sont élevés (car ils semblent être basés sur un repère grossier que j'ai fait et cité dans un autre commentaire).Pour plus d'informations, veuillez lire E / S bloquantes, E / S non bloquantes et Epoll .
la source