Was ist der Zweck der flankengesteuerten Option von epoll?

Lesezeit: 5 Minuten

Dans Benutzeravatar
Dan

Aus der Manpage von epoll:

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

Wann würde man die flankengesteuerte Option verwenden? Die Manpage gibt ein Beispiel, das es verwendet, aber ich sehe nicht, warum es in dem Beispiel notwendig ist.

Benutzeravatar von James McLaughlin
James McLaughlin

Wenn ein FD lese- oder schreibbereit wird, möchten Sie möglicherweise nicht unbedingt alle Daten sofort lesen (oder schreiben).

Level-getriggertes Epoll wird Sie so lange nörgeln, wie der FD bereit bleibt, während Edge-getriggertes Sie nicht wieder stört, bis Sie das nächste Mal eins bekommen EAGAIN (es ist also komplizierter zu programmieren, kann aber effizienter sein, je nachdem, was Sie tun müssen).

Angenommen, Sie schreiben von einer Ressource zu einem FD. Wenn Sie Ihr Interesse daran bekunden, dass dieser FD als stufengesteuert schreibbereit wird, erhalten Sie ständig eine Benachrichtigung, dass der FD immer noch schreibbereit ist. Wenn die Ressource noch nicht verfügbar ist, ist das ein verschwendetes Aufwachen, weil Sie sowieso nicht mehr schreiben können.

Wenn Sie es stattdessen als flankengesteuert hinzufügen würden, würden Sie eine Benachrichtigung erhalten, dass der FD einmal schreibbereit war, und wenn die andere Ressource bereit ist, schreiben Sie so viel wie Sie können. Dann wenn write(2) kehrt zurück EAGAINhören Sie auf zu schreiben und warten auf die nächste Benachrichtigung.

Dasselbe gilt für das Lesen, da Sie möglicherweise nicht alle Daten in den Benutzerbereich ziehen möchten, bevor Sie bereit sind, alles zu tun, was Sie damit tun möchten (daher müssen Sie sie puffern usw.). Mit flankengetriggertem Epoll wird Ihnen mitgeteilt, wann es zum Lesen bereit ist, und Sie können sich dann daran erinnern und das eigentliche Lesen “wie und wann” durchführen.

  • Ist dieses Flanken-getriggerte Verhalten sicher gegen Race-Conditions, zB wenn Daten danach verfügbar werden read scheitert mit EAGAIN Aber vorher epoll wird genannt?

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    6. Februar 2012 um 16:45 Uhr

  • Sicher. epoll kehrt einfach sofort zurück, wenn der FD bereits fertig ist und Sie noch nicht benachrichtigt wurden.

    – James McLaughlin

    6. Februar 2012 um 17:10 Uhr


  • ET ist auch besonders gut mit einem Multithread-Server auf einer Multicore-Maschine. Sie können einen Thread pro Kern ausführen und alle epoll_wait auf demselben epfd aufrufen lassen. Wenn Daten auf einem fd eingehen, wird genau ein Thread aufgeweckt, um sie zu verarbeiten.

    – Chris Dodd

    6. Februar 2012 um 19:51 Uhr

  • @windfinder Korrigieren Sie mich, wenn ich falsch liege, aber im LT-Modus mehrere Threads könnte parallel auf dem gleichen FD/SD geweckt werden, solange Daten vorhanden sind. Mit ET nur einer Benachrichtigung wird für FD/SD gesetzt, wenn Daten vorhanden sind, sodass nur ein Thread eine solche Benachrichtigung erhalten würde; andere Threads erhalten möglicherweise eine Benachrichtigung für dasselbe FD/SD, aber nur, wenn der ursprüngliche Thread gelesen/geschrieben hätte alle Daten für eine Benachrichtigung; wie Sie sich vorstellen können viel einfacher, MT-Epoll-Prozesse mit ET zu schreiben. Hoffe das hilft.

    – Emanuele

    11. August 2013 um 10:36 Uhr


  • @Emanuele – Bestätigt, ET garantiert, dass nur ein Thread aufwacht.

    – Alex

    12. August 2013 um 17:35 Uhr

In meinen Experimenten garantiert ET nicht, dass nur ein Thread aufwacht, obwohl es oft nur einen aufweckt. Das EPOLONESHOT-Flag dient diesem Zweck.

  • man 7 epoll: Da sogar mit Flanken getriggert epollkönnen beim Empfang mehrerer Datenblöcke mehrere Ereignisse generiert werden, der Aufrufer hat die Möglichkeit, dies anzugeben EPOLLONESHOT Flagge, zu erzählen epoll um den zugehörigen Dateideskriptor nach dem Empfang eines Ereignisses mit zu deaktivieren epoll_wait(2). Wenn der EPOLLONESHOT -Flag angegeben ist, liegt es in der Verantwortung des Aufrufers, den Dateideskriptor mithilfe von neu zu aktivieren epoll_ctl(2) mit EPOLL_CTL_MOD.

    – zeekvfu

    17. Mai 2014 um 5:27 Uhr

  • Genau, Sie werden einmal pro steigender Flanke benachrichtigt. Wenn Sie stdin zu einer Epoll hinzufügen, die als EPOLLET festgelegt ist, wird bei jedem Drücken der Eingabetaste ein Ereignis generiert. Aus diesem Grund wird EPOLONESHOT benötigt.

    – Guido

    11. Juni 2014 um 23:12 Uhr

  • Hatten Sie verschiedene epoll-FDs oder nur eine, die von mehreren Threads geteilt wurde? Mein Verständnis ist, dass alle epoll-FDs aufwachen sollten, aber vielleicht nur ein Thread für eine gemeinsame FD. Das neue EPOLLEXCLUSIVE behebt das Donnerherdenproblem für mehrere epoll FDs.

    – Goswin von Brederlow

    11. Dezember 2018 um 11:38 Uhr

  • Ich meine, mehrere Threads warteten auf eine einzelne FD. Manchmal wachten mehrere Threads auf, wenn das EPOLONESHOT-Flag nicht gesetzt war. Während nur einer aufwachte, wenn die Flagge gesetzt war.

    – cpq

    17. Dezember 2018 um 14:41 Uhr

  • Ebene ausgelöst

    Verwenden Sie den Level-Trigger-Modus, wenn Sie nicht alle Daten im FD verbrauchen können und möchten, dass epoll weiter triggert, solange Daten verfügbar sind.

    Wenn Sie beispielsweise große Dateien von FD empfangen möchten und nicht alle Dateidaten von FD auf einmal verbrauchen können und die Triggerung für den nächsten Verbrauch fortgesetzt werden soll. Der Level-Trigger-Modus könnte für diesen Fall geeignet sein.

    • Nachteil

      • donnernde Herde
        • Das EPOLLEXCLUSIVE Richtlinie soll das Donnerphänomen verhindern
      • weniger Effizienz
        • Wenn ein Lese-/Schreibereignis auf dem überwachten Dateideskriptor auftritt, epoll_wait() teilt dem Handler mit, ob er lesen oder schreiben soll. Wenn Sie nicht alle Daten auf einmal lesen oder schreiben (z. B. wenn der Lese-/Schreibpuffer zu klein ist), werden Sie beim nächsten Aufruf von epoll_wait() benachrichtigt, dass Sie mit dem Lesen oder Schreiben des Dateideskriptors fortfahren sollen nicht zu Ende gelesen oder geschrieben hat, aber wenn Sie nie gelesen oder geschrieben haben, wird es Sie natürlich weiterhin benachrichtigen.
        • Wenn das System über eine große Anzahl fertiger Dateideskriptoren verfügt, die Sie nicht lesen oder schreiben müssen, und sie jedes Mal zurückkehren, kann dies die Effizienz des Handlers beim Abrufen der fertigen Dateideskriptoren, die ihm wichtig sind, erheblich beeinträchtigen.
    • Anwendungsfälle

      • redis epoll Da der IO-Thread von Redis Single-Threaded ist, wird der Level-Trigger-Modus verwendet.
  • Flanke ausgelöst

    Verwenden Sie den flankengesteuerten Modus und stellen Sie sicher, dass alle verfügbaren Daten gepuffert und schließlich verarbeitet werden.

    Wie Chris Dodd in den Kommentaren erwähnte

    ET ist auch besonders gut mit einem Multithread-Server auf einer Multicore-Maschine. Sie können einen Thread pro Kern ausführen und alle epoll_wait auf demselben FD aufrufen lassen. Wenn Daten auf einem FD eingehen, wird genau ein Thread geweckt, um sie zu verarbeiten

1416700cookie-checkWas ist der Zweck der flankengesteuerten Option von epoll?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy