poll() vs. select() unter Linux, POLLIN/POLLOUT und stdin...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

ok, meine Fragen sind nicht mehr ganz bei Python und dennoch hier nicht völlig deplatziert:

1. Wenn ich prüfen möchte, ob es auf 'stdin' etwas zum Auslesen gibt, kann ich entweder 'poll()' oder 'select()' verwenden. Die allermeisten Codebeispiele, die 'stdin', 'stdout' oder 'stderr' prüfen, verwenden 'select()', 'poll()' sieht man eigentlich eher dann, wenn es um Abfragen auf Servern geht, wo Performance eine wichtige Rolle spielt.
Meine Frage ist nun: Ist 'poll()' unter Linux ein Wrapper zu 'select()' oder 'select()' ein Wrapper zu 'poll()'?
Oder falls meine Frage falsch gestellt ist: Ich kann mir nicht vorstellen, dass das 'select'-Modul für 'poll()' und 'select()' zwei völlig unterschiedliche Wege geht. Irgendwo muss ja erkannt werden, ob unter dem jeweiligen OS eher ein 'poll()' oder eher ein 'select()' Sinn macht.

2. Immer unter Berücksichtigung, dass ich 'stdin' darauf prüfen möchte, ob es etwas zum Auslesen gibt:
Es hat bisher keine Auswirkung, ob ich via 'poll()' auf 'POLLIN' oder auf 'POLLOUT' prüfe oder 'stdin' via 'select()' an 'rlist' oder 'wlist' übergebe.
Die Doku sagt ja auch zu ...
... select.poll():
POLLIN: There is data to read
POLLOUT: Ready for output: writing will not block
... select.select():
rlist: Wait until ready for reading
wlist: Wait until ready for writing
Ist es aber vor dem Hintergrund von 'stdin' nicht so, dass immer dann, wenn Daten zum Auslesen vorhanden sind gleichzeitig auch Daten zur Ausgabe bereitstehen.
Welchen Fall kann es denn geben, dass nur 'POLLIN' oder nur 'POLLOUT' signalisiert wird?
Oder ist es bei 'stdin' tatsächlich egal, welchen Zustand ich prüfe?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Die Unterschiede von poll und select sind eher historischer Natur - der BSD-Zweig hatte früher nur select und System-V nur die poll Variante, von heutigen System werden idR beide Wege vorgehalten, wobei BSDs poll auf select aufsetzen und System-V-Klone select auf deren poll.
Die select Architektur hat u.a. den Nachteil, dass die Anzahl der prüfbaren fds beschränkt ist, was bei poll nicht der Fall ist. In einem Server kann das schnell zum Flaschenhals werden.
Die Linux-Implementation hierzu findest Du in fs/select.c.

Zu STDIN und POLLIN/POLLOUT (bzw. select-Analoga):
Die beiden Flags sind sehr verschieden. POLLOUT prüft nur, ob Du nicht blockend schreiben kannst, d.h. ob eine anstehende Schreibaktion Deinen Prozess im Zweifelsfalle pausieren würde (bis ein Abnehmer bereit steht oder evtl. Kernelpuffer frei sind) oder Du drauflosschreiben kannst. Beim Drauflosschreiben ist zu beachten, dass ein write(fd, Adresse, count) einen Rückgabewert hat, der die tatsächlich geschriebene Anzahl an bytes anzeigt, d.h. es ist nicht sichergestellt, dass Du alle Daten mit einmal unterbringst (weil vllt. ein Puffer kleiner ist als Deine Datenmenge, beim nächsten Schreibversuch ohne zwischenzeitl. Abnehmer der Daten würde write wieder blockieren).
POLLIN kümmert sich nicht ums Schreiben, es zeigt Dir an, ob Daten von fd gelesen werden können (ohne Änderung des fd auf NONBLOCKING würde das Lesen ohne Daten dann blockieren).
lunar

@mutetella: In der Dokumentation ist ein wesentlicher Unterschied doch beschrieben:
The poll() system call, supported on most Unix systems, provides better scalability for network servers that service many, many clients at the same time. poll() scales better because the system call only requires listing the file descriptors of interest, while select() builds a bitmap, turns on bits for the fds of interest, and then afterward the whole bitmap has to be linearly scanned again. select() is O(highest file descriptor), while poll() is O(number of file descriptors).
Antworten