Le modèle de programmation appliqué au projet Helixis est celui de la programmation par tâches qui se
caractérise par la découpe du code sous la forme de blocs simples (et facilement parallélisables). Actuellement,
la conception d'applications parallélisables est trop souvent orientée par un choix technique et ses contraintes.
Ce modèle de programmation permet de faire abstraction des problématiques techniques liées principalement aux fils d'exécution.
Offrir à l'utilisateur la possibilité de raisonner en terme de tâches lui permet de se détacher des contraintes d'accès concurrentiels et de se concentrer uniquement sur la conception.
Le système des tâches d'Helixis Framework s'appuie sur des fils d'exécution légers et très rapides appelés Protothread.
Habituellement, les changements de contexte entre plusieurs fils d'exécution sont couteux en cycle processeur car la pile doit être recopiée.
La force de cette technologie réside en l'absence de pile au sein des Protothreads, et donc de leur utilisation en mémoire très réduite et de
leurs changements de contexte qui n'ont quasiment plus aucun coût.
De plus, dans un soucis de performance, Helixis Framework utilise, en complément des Protothreads, des fils d'exécution du noyau. Ainsi, votre
programme bénéficie de tous les processeurs disponibles sur votre machine et, pour chacun, de la puissance des Protothreads.
Grâce à cette conception, le développeur n'a plus à se soucier des fils d'exécution lourds et de leurs contraintes inhérentes.
Ainsi, le programmeur fait abstraction des ressources du processeurs (nombre de cœurs).
En effet, peu importe le nombre de
cœurs de sa machine, l'ordonnanceur utilisera au mieux les ressources du système sans pour autant que le programmeur ait à changer
son code.
Afin d'éviter l'utilisation des techniques habituelles d'accès concurrentiels telles que Sémaphores et Mutex, Helixis utilise les opérations atomiques liées aux instructions des différents processeurs, notamment CAS ("Compare-And-Swap") et DCAS ("Double Compare-And-Swap").
Dans un soucis de simplicité et de performance, Helixis utilise en partie la librairie LDFS qui fourni toutes les opérations atomiques nécessaires ainsi que des implémentations de liste chainée et de pile FIFO ("First in, First out") basées sur ces opérations.
L'ordonnanceur de tâches a pour rôle de répartir automatiquement et le plus uniformément possible l'exécution des tâches de manière totalement transparente pour l'utilisateur. L'ordonnancement des tâches est basé sur le "Round Robin": les tâches sont tout simplement exécutées les unes à la suite des autres de manière cyclique.
En interne, on distingue deux fonctionnement de l'ordonnanceur lorsqueLorsqu'une tâche est ajoutée à l'ordonnanceur, celui-ci la placera dans le fil d'exécution le moins chargé selon lui.