Level-Triggered epoll
ist sehr ähnlich zu poll
. Warum ist nicht poll
nur ein Wrapper für epoll
Systeme, die letzteres unterstützen?
EDIT: Ich meine, gibt es technische Hindernisse gegen eine solche Entscheidung? Die Implementierung poll
als epoll
würde dramatisch steigert die Leistung von vielen Netzwerkanwendungen. Es sollte ein technisches Problem geben, das ich nicht bemerke.
poll
als Wrapper fürepoll
wäre unglaublich komplex und ineffizient. Sie müssten entweder einen neuen Epoll-Deskriptor einrichten und jedes Mal konfigurieren, oder Sie müssten den aktuellen Umfragesatz mit dem bereits mit dem Epoll-Deskriptor verknüpften vergleichen. Yuck!Antworten:
Umfrage ist für einfache Fälle viel einfacher; Es ist wahrscheinlich genauso effizient für eine kleine Anzahl von Dateideskriptoren. Der Anrufer muss sich nicht um die Verwaltung von Umfrage-FDs und das Hinzufügen / Entfernen von FDs kümmern. Er kann einfach alle hinzufügen, die er bei jedem Anruf zur Abfrage haben möchte.
Mein Gefühl ist, dass sie kostenlos sind, obwohl Umfrage als Wrapper für Epoll implementiert werden könnte, sollte es wahrscheinlich nicht sein.
epoll könnte (fast) als Wrapper für Umfragen implementiert werden, aber das würde seine Effizienzargumente zunichte machen.
quelle
Die Semantik von
poll()
undepoll
ist unterschiedlich. Wennpoll()
Sie darüber informiert werden, dass ein Deskriptor lesbar ist, lesen Sie etwas, lesen jedoch nicht alle verfügbaren Bytes und übergeben Sie diesen Deskriptorpoll()
erneut. Er wird sofort aktiviert. AFAIK das gleiche gilt nicht fürepoll
.Beachten Sie auch, dass
epoll
Deskriptoren eine begrenzte Ressource sind. Die Manpage spricht überepoll_create()
Fehlerbedingungen, bei denen AFAIK nicht auftrittpoll()
.Während ich bin nicht sicher , der alle Details der Implementierung, daraus können wir sagen , dass es keinen Sinn macht , um
poll()
für einen Wrapperepoll
. Der Programmierer muss sich dieser Punkte bewusst sein, und vorhandener Code, der mit den zulässigen Annahmen geschrieben wurde,poll()
würde brechen.quelle
Okay, 7 Jahre später habe ich eine überzeugende Antwort basierend auf diesen Artikel von Evan Klitzke.
Erstens ist der Grund, warum ich die Frage gestellt habe, der oft erwähnte Leistungsvorteil
epoll
gegenüberpoll
/select
. Das Wortepoll
ist asymptotisch effizienter (O (1)) alspoll
(O ( N )).Was nicht so allgemein bekannt ist, ist, dass nur flankengetriggert
epoll
wirklich O (1) ist, während pegelgesteuertepoll
die gleiche Asymptotik von O ( N ) aufweist. In der Tat muss der durch Level ausgelöste Geschmack jedes Mal, wenn er aufgerufen wird, die Liste der beobachteten FDS durchgehen, um diejenigen zu finden, bei denen möglicherweise noch mehr Daten ausstehen. Eine flankengetriggerte Variante kann sich auf Signale als Reaktion auf neue Bytes stützen, die in einem fd erscheinen.Es wäre interessant herauszufinden, wie genau ein wiederaufgenommener Thread herausfindet, welcher fd ihn aufgeweckt hat, aber es ist sicherlich möglich, dass dieses Datum während des epoll-ausgelösten Aufweckens durchlaufen wird.
Offensichtlich kann
poll
/select
kann keine flankengetriggerte Verwendung verwenden ,epoll
da die Semantik unterschiedlich ist. Wie wir gesehen haben, würde die Implementierung mit Level-Triggerepoll
keine asymptotischen Leistungsvorteile bringen. Und möglicherweise auch negativ beeinflussen, wenn konstante Faktoren oder konstante Terme hoch sind (da sie auf einem groben Benchmark zu beruhen scheinen, den ich gemacht und in einem anderen Kommentar zitiert habe).Weitere Informationen finden Sie unter Blockieren von E / A, Nichtblockieren von E / A und Epoll .
quelle