Ich entwerfe Ereignisschleife für asynchrone Socket IO mit Epoll/devpoll/kqueue/poll/auswählen (einschließlich Windows-Select).Asynchrone Ereignisschleife Design und Probleme
Ich habe zwei Möglichkeiten der Durchführung, IO-Betrieb:
Non-Blocking-Modus Umfrage auf EAGAIN
- Set Socket nicht blockierenden Modus.
- Lesen/Schreiben an Buchse.
- Wenn der Vorgang erfolgreich ist, nach der Beendigungsbenachrichtigung an die Ereignisschleife.
- Wenn ich EAGAIN bekomme, füge Socket zu "select list" hinzu und suche den Socket ab.
Polling-Modus: Umfrage und dann
- socket ausführen Liste auswählen und abrufen.
- Warten auf Benachrichtigung, dass es lesbar beschreibbar ist
- Lese-/
- Beitrag Abschlussmeldung an Eventloop von sucseeds schreiben
Für mich ist es wie bei der ersten weniger System würde erfordern, sieht aufruft, wenn im normalen Modus , speziell für das Schreiben in Socket (Puffer sind ziemlich groß). Auch sieht es so aus, dass es möglich wäre, den Overhead über die Anzahl von "Select" Ausführungen zu reduzieren, besonders ist es nett, wenn Sie nicht etwas haben, das als epoll/devpoll/kqueue gut skaliert.
Fragen:
- Gibt es irgendwelche Vorteile des zweiten Ansatzes?
- Gibt es Portabilitätsprobleme mit nicht blockierenden Operationen auf Sockets/Dateideskriptoren über zahlreiche Betriebssysteme: Linux, FreeBSD, Solaris, MacOSX, Windows.
Hinweise: Bitte schlagen nicht Event-Loop/socket-api Implementierungen
Ich sehe keinen Grund, warum Sie nicht warten können, Speicher un zuweisen bis benötigt mit dem ersten Ansatz. Fehle ich etwas? – Ioan
Ich nehme an, aber in der Praxis ist es nicht so implementiert. Im ersten Fall benötigen Sie den verfügbaren Puffer aus den Schritten 2-4, in der zweiten benötigen Sie ihn nur in Schritt 3. – karunski