- In das Modul
std.Io.Eventedder Zig-Standardbibliothek wurden neue Implementierungen auf Basis von io_uring und Grand Central Dispatch (GCD) integriert - Beide Implementierungen arbeiten mit Stack-Umschaltung im User-Space (Fibers, stackful coroutines, green threads)
- Derzeit befinden sie sich noch im experimentellen Stadium; weitere Arbeiten wie bessere Fehlerbehandlung, Entfernen von Logging, Analyse der Ursachen für Performance-Einbußen und Ausbau der Tests sind noch nötig
- Im selben Anwendungscode kann nur das I/O-Backend ausgetauscht werden, um einfach zwischen io_uring und GCD zu wechseln
- Auch der Zig-Compiler funktioniert mit beiden Implementierungen; nach einer späteren Stabilisierung könnten sie sich zu einer plattformübergreifenden Grundlage für integriertes asynchrones I/O entwickeln
std.Io.Evented-Implementierungen auf Basis von io_uring und GCD
-
Gegen Ende des Release-Zyklus von Zig 0.16.0 wurde
std.Io.Eventedaktualisiert, um die jüngsten API-Änderungen zu berücksichtigen- Neu hinzugekommene Implementierungen sind io_uring (Linux) und Grand Central Dispatch (GCD) (macOS)
- Beide Implementierungen verwenden die Technik der Stack-Umschaltung im User-Space (Fibers, stackful coroutines, green threads)
-
Beide Implementierungen befinden sich derzeit im experimentellen Zustand; für einen stabilen Einsatz sind noch mehrere Verbesserungen nötig
- Verbesserung der Fehlerbehandlung erforderlich
- Entfernung von Logging sowie Analyse der Ursachen für Performance-Einbußen nötig (bei Verwendung von
IoMode.eventedkommt es zu Performance-Verlusten im Compiler) - Einige Funktionen sind noch nicht implementiert und die Testabdeckung muss erweitert werden
- Es wird ein Builtin zur Prüfung der maximalen Stack-Größe pro Funktion benötigt (um praktische Nutzbarkeit bei deaktiviertem
overcommitsicherzustellen)
Beispiel für den Austausch der I/O-Implementierung
-
Im selben Anwendungscode lässt sich der Betrieb durch Austausch nur des I/O-Backends umstellen
- Im Beispielcode läuft die Ausführung auf Basis von io_uring, wenn statt
std.Io.Threadedstd.Io.Eventedverwendet wird - Die Funktion
appbleibt identisch, ebenso das Ausgabeergebnis (Hello, World!)
- Im Beispielcode läuft die Ausführung auf Basis von io_uring, wenn statt
-
Ein Vergleich der
strace-Ergebnisse zeigt die Unterschiede zwischen den beiden Ausführungsartenhello_threadedverwendet gewöhnliche threadbasierte I/O-Aufrufehello_eventednutzt io_uring-Systemaufrufe (io_uring_setup,io_uring_enterusw.)
Einsatz im Zig-Compiler und aktueller Stand
-
Auch der Zig-Compiler selbst funktioniert korrekt mit
std.Io.Evented- Der Compiler kann sowohl mit io_uring als auch mit GCD ausgeführt werden
- Allerdings ist die Ursache der Performance-Einbußen noch ungeklärt, sodass weitere Analyse nötig ist
-
Durch diese Änderung nähert sich Zig einer Struktur, in der sich I/O-Implementierungen leicht austauschen lassen
- Damit wird eine Grundlage geschaffen, um plattformspezifische asynchrone I/O-Modelle einheitlich zu behandeln
Weitere Aufgaben
- Für einen stabilen Einsatz sind Performance-Verbesserungen und stärkere Tests erforderlich
- Wenn Funktionen zur Verwaltung der Stack-Größe ergänzt werden, könnte die praktische Nutzung auch in Umgebungen mit deaktiviertem Overcommit möglich werden
- Nach Fertigstellung dürfte Zigs Abstraktionsschicht für asynchrones I/O deutlich gestärkt sein
Fazit
- Dieses Update ist ein wichtiger Fortschritt beim Ausbau des Standard-I/O-Systems von Zig
- Durch die Integration von io_uring und GCD entsteht eine Grundlage für konsistente asynchrone Verarbeitung über Plattformgrenzen hinweg
- Nach Abschluss der weiteren Stabilisierung dürfte sich Zigs leistungsfähiges und flexibles I/O-Modell deutlich erweitern
Noch keine Kommentare.