Previous Up Next

4  Ordonnancement

La primitive switch_to_ctx() du mécanisme de coroutines impose au programmeur d’expliciter le nouveau contexte à activer. Par ailleurs, une fois l’exécution de la fonction associée à un contexte terminée, il n’est pas possible à la primitive swicth_to_ctx() d’activer un autre contexte ; aucun autre contexte ne lui étant connu.

Un des objectifs de l’ordonnancement est de choisir, lors d’un changement de contexte, le nouveau contexte à activer. Pour cela il est nécessaire de mémoriser l’ensemble des contextes connus ; par exemple sous forme d’une structure chaînée circulaire des contextes.

On propose une nouvelle interface avec laquelle les contextes ne sont plus directement manipulé dans « l’espace utilisateur » :

int create_ctx(int stack_size, func_t f, void *args); 
void yield();

La primitive create_ctx() ajoute à l’ancien init_ctx() l’allocation dynamique initiale de la structure mémorisant le contexte. La primitive yield() permet au contexte courant de passer la main à un autre contexte ; ce dernier étant déterminé par l’ordonnancement.


Exercice 8
  
  1. Étendez la structure de donnée struct ctx_s pour créer la liste chaînée des contextes existants.
  2. Modifiez la primitive init_ctx() en une primitive create_ctx() pour mettre en place ce chaînage.
  3. Traitez des conséquences sur les autres primitives.

Exercice 9
   Donnez une implantation de yield().

Previous Up Next