Fibre (informatique)
En informatique, une fibre (fiber en anglais) est un type de thread particulièrement léger.
Comme les threads, les fibres partagent le même espace mémoire. Toutefois, les fibres utilisent impérativement un multitâche coopératif là où les threads utilisent en général un multitâche préemptif. Les threads dépendent souvent de l'ordonnanceur (en anglais scheduler) du noyau (en anglais kernel) pour préempter un thread occupé et reprendre l'exécution d'un autre thread. Les fibres doivent manuellement rendre l'exécution afin de permettre à une autre fibre de continuer sa propre exécution.
Fibres et coroutines
[modifier | modifier le code]Les fibres décrivent essentiellement le même concept que les coroutines. La distinction, s'il y en a une, est que les coroutines sont un concept même du langage, là où les fibres sont plus du domaine du système d'exploitation, vues comme des threads qui se trouvent ne pas s'exécuter en concurrence. La dépendance d'un concept envers l'autre n'est pas claire : Les fibres peuvent être vues comme une implémentation de coroutines[1], ou une fonctionnalité sur laquelle sont implémentées les coroutines[2].
Avantages et inconvénients
[modifier | modifier le code]Puisque les fibres fonctionnent dans un mode multitâche coopératif, la synchronisation n'est plus le problème majeur comme avec les threads fonctionnant en multitâche préemptifs. Les concepts usuels de synchronisation comme les sémaphores, les mutex et l'atomicité des opérations sont inutiles lorsque l'on écrit le code destiné à une fibre, puisque la synchronisation est implicite. Toutefois, certaines bibliothèques utilisant des fibres pour certaines opérations (comme les entrées/sorties non-bloquantes), il est recommandé de parcourir les documentations avant d'utiliser des fibres.
Les fibres ont l'inconvénient de ne pas bénéficier automatiquement d'une architecture multiprocesseurs sans passer par l'usage de threads préemptifs. Toutefois, un modèle de thread de type N:M avec pas plus de threads que de cœurs/processeurs peut être plus efficace qu'un modèle simple basé uniquement sur des threads, ou un modèle simple basé uniquement sur des fibres.
Support des fibres selon les systèmes d'exploitation
[modifier | modifier le code]Les fibres nécessitent moins de support de la part du système d'exploitation que les threads. Elles peuvent être implémentées sur les systèmes modernes Unix en utilisant des fonctions comme getcontext, setcontext et swapcontext définies dans l'entête ucontext.h de la bibliothèque GNU Portable Threads.
Sur Microsoft Windows, les fibres sont créées via les appels à ConvertThreadToFiber et CreateFiber; une fibre suspendue pouvant voir son exécution reprendre dans n'importe quel thread. Le Fiber local storage, analogue au Thread Local Storage, peut être utilisé pour créer des copies de variables uniques pour la fibre[3].
Symbian OS utilise un concept similaire aux fibres dans son Active Scheduler. Un Active object (Symbian OS) contient une fibre qui sera exécutée par l'Active Scheduler lorsque l'une des tâches asynchrones s'achève. De multiples Active objects peuvent être en attente d'exécution (selon leur priorité), et chacun doit restreindre son propre temps d'exécution.
Notes et références
[modifier | modifier le code]Voir aussi
[modifier | modifier le code]Liens externes
[modifier | modifier le code]- (en) GNU Portable threads
- (en) libpcl Portable Coroutine Library
- (en) Fiber Pool Une plateforme C++ implémentant les fibres fonctionnant sur multicœurs.