Difference between revisions of "Lib/sequencer offers Multitasking"
Jump to navigation
Jump to search
(translating) |
(began translation) |
||
Line 1: | Line 1: | ||
[[Category:Book]] |
[[Category:Book]] |
||
− | *** OK, I'm translating that |
+ | *** OK, I'm translating that --[[User:Cadrian|Cyril]] 14:34, 4 Jan 2006 (CET) |
+ | |||
+ | The <tt>lib/sequencer</tt> library implements one kind of cooperative multi-tasking of the event-driver kind. Unlike "pure" cooperative multi-tasking, a task cannot stop at any time (using an hypothetic <tt>yield</tt> feature) but only in lnown and stable states. That is conform to the Eiffel principles. |
||
+ | |||
+ | The principle is: |
||
+ | |||
+ | * the class [[library_class:LOOP_STACK|<tt>LOOP_STACK</tt>]] manages th emulti-tasking; |
||
+ | * the class [[library_class:JOB|<tt>JOB</TT>]] represents a task. The task core is the <tt>continue</tt> feature, in which the task controls the whole system; |
||
+ | * the class [[library_class:READY_DESCRIPTION|<tt>READY_DESCRIPTION</tt>]] allows to describe in which conditions a task can be executed. |
||
+ | |||
+ | We will successively see each of those concepts. |
||
+ | |||
+ | <!-- |
||
+ | == Gestionnaire du multi-tâches == |
||
+ | C'est la classe [[library_class:LOOP_STACK|<tt>LOOP_STACK</tt>]] qui est chargée de gérer les multiples tâches. On l'utilise en deux étapes : |
||
+ | * initialisation : création de l'objet <tt>LOOP_STACK</tt> et ajout des tâches à exécuter |
||
+ | * exécution : exécution de la méthode <tt>run</tt> |
||
+ | |||
+ | Bien sûr, on peut ajouter des tâches en cours d'exécution. Le gestionnaire peut aussi être arrêté, grâce à la méthode <tt>break</tt>. |
||
+ | |||
+ | D'autre part, la pile de boucles est composée de plusieurs boucles d'exécution ([[library_class:LOOP_ITEM|<tt>LOOP_ITEM</tt>]]). Ceci permet, par exemple, d'implanter une forme de ''modalité'' (cf. les fenêtres modales de [[lib/vision|Vision]]) |
||
+ | |||
+ | == Les tâches == |
||
+ | |||
+ | Une tâche a un cycle de vie qui se représente par les méthodes qui sont exécutées par le gestionnaire (en fait un [[library_class:LOOP_ITEM|<tt>LOOP_ITEM</tt>]] d'où les clauses d'export de ces fonctions). |
||
+ | |||
+ | # <tt>prepare</tt> permet de préparer la tâche ; dans cette phase, la tâche positionne les événements sur lesquels elle souhaite être activée. L'objet [[library_class:READY_DESCRIPTION|<tt>READY_DESCRIPTION</tt>]] est un objet sur lequel on peut positionner des conditions (grâces à ses méthodes <tt>when_*</tt>). |
||
+ | # <tt>is_ready</tt> permet de tester si la tâche a vraiment été activée. L'objet [[library_class:READY_DESCRIPTION|<tt>READY_DESCRIPTION</tt>]] est un objet sur lequel on peut tester des conditions (grâces à ses méthodes <tt>is_*</tt>). |
||
+ | # <tt>continue</tt> contient le corps de l'exécution de la tâche, si celle-ci est effectivement activée. |
||
+ | # <tt>done</tt> permet de dire si la tâche a terminé de s'exécuter. Dans ce cas, elle sera supprimée de la boucle d'exécution. Dans le cas contraire, le cycle recommence. |
||
+ | # <tt>restart</tt> permet de réinjecter une tâche dans la boucle d'exécution. |
||
+ | |||
+ | La fonction <tt>restart</tt> est rarement utile. Voir [[lib/vision|Vision]] pour des exemples d'utilisation. |
||
+ | |||
+ | == Conditions d'exécution == |
||
+ | |||
+ | La classe [[library_class:READY_DESCRIPTION|<tt>READY_DESCRIPTION</tt>]] permet de positionner des conditions et de les tester. Les conditions possibles sont : |
||
+ | |||
+ | * '''Le temps''' : ceci permet de créer des tâches périodiques. Voir les classes [[library_class:PERIODIC_JOB|<tt>PERIODIC_JOB</tt>]] et [[library_class:BACKGROUND_JOB|<tt>BACKGROUND_JOB</tt>]] ; |
||
+ | * '''Les entrées-sorties''' : |
||
+ | ** ''Les données sur un flux d'entrée'' : ceci permet de créer des tâches en attente sur la disponibilité de données en entrée (méthodes <tt>when_data</tt> et <tt>is_data</tt>), |
||
+ | ** ''Les données sur un flux de sortie'' : ceci permet de créer des tâches qui ne s'activent que quand elles peuvent écrire sur un flux de sortie (méthodes <tt>when_free</tt> et <tt>is_free</tt>) ; |
||
+ | * '''Le réseau''' : ceci permet de créer des tâches en attente d'une connection réseau (méthodes <tt>when_connection</tt> et <tt>is_connection</tt>). |
||
+ | |||
+ | == Le déroulement des tâches == |
||
+ | |||
+ | Le gestionnaire implante le cycle suivant : |
||
+ | |||
+ | * appel de la méthode [[library_class:READY_DESCRIPTION|<tt>READY_DESCRIPTION</tt>]].<tt>reset</tt> ; |
||
+ | * appel de la méthode <tt>prepare</tt> sur chaque tâche ; |
||
+ | * appel de la méthode [[library_class:READY_DESCRIPTION|<tt>READY_DESCRIPTION</tt>]].<tt>wait</tt> pour attendre qu'au moins une des conditions se réalise ; |
||
+ | * appel de la méthode <tt>is_ready</tt> sur chaque tâche ; |
||
+ | * pour chaque tâche prête, appel de la méthode <tt>continue</tt> ; |
||
+ | * sur ces mêmes tâches, appel de la méthode <tt>done</tt> et le cas échéant, suppression de la tâche de la boucle ; |
||
+ | * et on recommence. |
||
+ | |||
+ | == Les priorités == |
||
+ | |||
+ | Les tâches sont exécutées par ordre de priorité. Seules les tâches prêtes les plus prioritaires sont exécutées. Les autres, même si elles sont prêtes, devront attendre un futur tour où d'autres tâches plus prioritaires ne seront pas prêtes. |
||
+ | |||
+ | '''Noter''' que les tâches les plus prioritaires sont celles qui ont le ''plus petit numéro''. |
||
+ | |||
+ | == Bibliothèques utilisant le séquenceur == |
||
+ | |||
+ | * [[lib/net]] : les serveurs permettent en général d'accepter plusieurs connections simultanées. Ceci est implanté grâce à un séquenceur. |
||
+ | |||
+ | * [[lib/vision]] : la boucle de gestion d'événements est implantée grâce à un séquenceur. |
||
+ | --> |
Revision as of 14:34, 4 January 2006
*** OK, I'm translating that --Cyril 14:34, 4 Jan 2006 (CET)
The lib/sequencer library implements one kind of cooperative multi-tasking of the event-driver kind. Unlike "pure" cooperative multi-tasking, a task cannot stop at any time (using an hypothetic yield feature) but only in lnown and stable states. That is conform to the Eiffel principles.
The principle is:
- the class LOOP_STACK manages th emulti-tasking;
- the class JOB represents a task. The task core is the continue feature, in which the task controls the whole system;
- the class READY_DESCRIPTION allows to describe in which conditions a task can be executed.
We will successively see each of those concepts.