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 epollgegenüber poll/ select. Das Wort epollist asymptotisch effizienter (O (1)) als poll(O ( N )).
Was nicht so allgemein bekannt ist, ist, dass nur flankengetriggert epoll wirklich O (1) ist, während pegelgesteuert epoll 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/ selectkann keine flankengetriggerte Verwendung verwenden ,epoll da die Semantik unterschiedlich ist. Wie wir gesehen haben, würde die Implementierung mit Level-Trigger epoll 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 .