- De nouvelles implémentations basées sur io_uring et Grand Central Dispatch (GCD) ont été intégrées au module
std.Io.Eventedde la bibliothèque standard de Zig - Les deux implémentations fonctionnent avec un changement de pile en espace utilisateur (fibers, coroutines à pile, green threads)
- Elles sont pour l’instant au stade expérimental et nécessitent encore des travaux de suivi, notamment l’amélioration de la gestion des erreurs, la suppression des logs, l’analyse des causes de la baisse de performances et le renforcement des tests
- Il est possible de remplacer uniquement le backend I/O dans un même code applicatif pour basculer facilement entre io_uring et GCD
- Les deux implémentations fonctionnent également dans le compilateur Zig et pourraient, une fois stabilisées, devenir une base unifiée d’I/O asynchrones selon les plateformes
Implémentations de std.Io.Evented basées sur io_uring et GCD
-
À la fin du cycle de publication de Zig 0.16.0,
std.Io.Eventeda été mis à jour pour refléter les derniers changements d’API- Les nouvelles implémentations ajoutées sont io_uring (Linux) et Grand Central Dispatch (GCD) (macOS)
- Les deux implémentations utilisent la technique du changement de pile en espace utilisateur (fibers, coroutines à pile, green threads)
-
Les deux implémentations sont actuellement expérimentales et plusieurs chantiers restent ouverts pour un usage stable
- Nécessité d’améliorer la gestion des erreurs
- Nécessité de supprimer les logs et de diagnostiquer les causes de la baisse de performances (une dégradation des performances du compilateur se produit lors de l’utilisation de
IoMode.evented) - Présence de fonctions non encore implémentées et besoin de renforcer la couverture de tests
- Nécessité d’ajouter une fonction intégrée permettant de vérifier la taille maximale de pile par fonction (afin d’assurer un usage pratique quand
overcommitest désactivé)
Exemple de remplacement d’implémentation I/O
-
Le même code applicatif peut fonctionner en remplaçant uniquement le backend I/O
- Dans l’exemple de code, utiliser
std.Io.Eventedà la place destd.Io.Threadedpermet une exécution basée sur io_uring - La fonction
appreste identique, et le résultat affiché (Hello, World!) est lui aussi identique
- Dans l’exemple de code, utiliser
-
La comparaison des résultats
stracepermet de voir la différence entre les deux modes d’exécutionhello_threadedutilise des appels I/O classiques basés sur les threadshello_eventedutilise des appels système io_uring (io_uring_setup,io_uring_enter, etc.)
Application au compilateur Zig et état actuel
-
Le compilateur Zig lui-même fonctionne correctement en utilisant
std.Io.Evented- Le compilateur peut s’exécuter aussi bien avec io_uring qu’avec GCD
- Toutefois, les causes de la baisse de performances ne sont pas encore identifiées et demandent une analyse complémentaire
-
Cette évolution rapproche Zig d’une architecture où le code peut facilement remplacer son implémentation I/O
- Elle pose les bases d’une gestion unifiée des modèles d’I/O asynchrones selon les plateformes
Travaux à venir
- Des améliorations de performances et un renforcement des tests sont nécessaires pour un usage stable
- L’ajout d’une fonction de gestion de la taille de pile permettrait un usage pratique même dans des environnements où l’overcommit est désactivé
- Une fois aboutie, la couche d’abstraction des I/O asynchrones de Zig devrait s’en trouver nettement renforcée
Conclusion
- Cette mise à jour constitue une avancée importante dans l’extension du système d’I/O standard de Zig
- En intégrant io_uring et GCD, elle établit une base pour une cohérence du traitement asynchrone entre plateformes
- Une fois le travail de stabilisation achevé, elle élargira les possibilités d’un modèle I/O Zig à la fois performant et flexible
Aucun commentaire pour le moment.