2 Punkte von GN⁺ 2026-02-15 | Noch keine Kommentare. | Auf WhatsApp teilen
  • In das Modul std.Io.Evented der 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.Evented aktualisiert, 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.evented kommt 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 overcommit sicherzustellen)

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.Threaded std.Io.Evented verwendet wird
    • Die Funktion app bleibt identisch, ebenso das Ausgabeergebnis (Hello, World!)
  • Ein Vergleich der strace-Ergebnisse zeigt die Unterschiede zwischen den beiden Ausführungsarten

    • hello_threaded verwendet gewöhnliche threadbasierte I/O-Aufrufe
    • hello_evented nutzt io_uring-Systemaufrufe (io_uring_setup, io_uring_enter usw.)

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.

Noch keine Kommentare.