75 votes

À quoi sert l'option de déclenchement par le bord d'epoll ?

Extrait de la page de manuel de epoll :

epoll is a variant of poll(2) that can be used either as an edge-triggered
or a level-triggered interface

Quand utiliser l'option de déclenchement par le bord ? La page de manuel donne un exemple qui l'utilise, mais je ne vois pas pourquoi elle est nécessaire dans cet exemple.

128voto

James McLaughlin Points 11924

Lorsqu'un FD devient prêt à être lu ou écrit, vous ne souhaitez pas nécessairement lire (ou écrire) toutes les données immédiatement.

L'époll déclenché par le niveau continuera à vous harceler tant que le FD reste prêt, tandis que l'époll déclenché par le bord ne vous dérangera plus jusqu'à la prochaine fois que vous obtiendrez un EAGAIN (il est donc plus compliqué de coder autour, mais peut être plus efficace en fonction de ce que vous devez faire).

Disons que vous écrivez d'une ressource vers un FD. Si vous enregistrez votre intérêt pour que ce FD devienne prêt à l'écriture comme déclenché par un niveau, vous recevrez une notification constante que le FD est toujours prêt à l'écriture. Si la ressource n'est pas encore disponible, c'est un gaspillage de réveil, car vous ne pouvez plus écrire de toute façon.

Si vous l'ajoutez plutôt en tant que déclencheur par le bord, vous recevrez une notification indiquant que le FD est prêt à l'écriture une fois, puis lorsque l'autre ressource devient prête, vous écrirez autant que vous le pouvez. Ensuite, si write(2) renvoie à EAGAIN vous arrêtez d'écrire et attendez la prochaine notification.

La même chose s'applique à la lecture, parce que vous ne voudrez peut-être pas transférer toutes les données dans l'espace utilisateur avant d'être prêt à faire ce que vous voulez en faire (et donc de devoir les mettre en mémoire tampon, etc etc). Avec l'epoll déclenché par le bord, on vous dit quand vous êtes prêt à lire, et vous pouvez vous en souvenir et faire la lecture proprement dite "comme et quand".

11voto

cpq Points 41

Dans mes expériences, ET ne garantit pas qu'un seul thread se réveille, bien qu'il en réveille souvent un seul. Le drapeau EPOLLONESHOT est destiné à cette fin.

6 votes

man 7 epoll : Puisque même avec le déclenchement par le front epoll Pour que des événements multiples puissent être générés lors de la réception de plusieurs morceaux de données, l'appelant a la possibilité de spécifier le numéro de l'événement. EPOLLONESHOT drapeau, pour dire epoll pour désactiver le descripteur de fichier associé après la réception d'un événement avec le symbole epoll_wait(2) . Lorsque le EPOLLONESHOT est spécifié, il est de la responsabilité de l'appelant de réarmer le descripteur de fichier en utilisant l'option epoll_ctl(2) avec EPOLL_CTL_MOD .

1 votes

Exactement, vous êtes notifié une fois par front montant. Si vous ajoutez stdin à un epoll défini comme EPOLLET, chaque pression sur la touche entrée générera un événement. C'est pourquoi EPOLLONESHOT est nécessaire.

0 votes

Aviez-vous des FD epoll différents ou un seul partagé entre les fils ? D'après ce que j'ai compris, tous les epoll FD devraient se réveiller, mais peut-être qu'un seul thread pour un FD partagé. Le nouveau EPOLLEXCLUSIVE corrige le problème du troupeau tonitruant pour les FDs à épandage multiple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X