4MMPS Sched

De Ensiwiki
Aller à : navigation, rechercher
Mycomputer.png  Deuxième Année  CDROM.png  Informatique 
Fleche haut.png

Dans cette séance, on va implanter la politique d'ordonnancement et généraliser nos tests pour N processus.

Ordonnancement selon l'algorithme du tourniquet

Pour commencer, on va continuer à travailler avec les processus idle et proc1 dont on donne le code ci-dessous :

void idle(void)
{
    for (;;) {
        printf("[idle] pid = %i\n", mon_pid());
        for (int i = 0; i < 100000000; i++);
        ordonnance();
    }
}

void proc1(void) {
    for (;;) {
        printf("[processus 1] pid = %i\n", mon_pid());
        for (int i = 0; i < 100000000; i++);
        ordonnance(); 
    }
}

On devra voir s'afficher à l'écran alternativement la trace de chaque processus. Les boucles for(int i = ...) servent simplement à ralentir l'affichage à l'écran pour le rendre lisible (adaptez la valeur de la constante à la vitesse de votre machine).

Vous devez compléter votre gestion de processus pour implanter ce test :

  • la fonction void ordonnance(void) a pour rôle d'implanter la politique d'ordonnancement en choisissant le prochain processus à activer (comme il n'y en a que 2 pour l'instant, ça ne devrait pas poser de difficulté) et de provoquer le changement de processus en appelant la fonction ctx_sw avec les bons paramètres ;
  • l'ordonnanceur a besoin de savoir quel est le processus en cours d'exécution : le plus simple pour cela est de conserver un pointeur vers la structure de processus sous la forme d'une variable globale par exemple ;
  • la fonction int mon_pid(void) renvoie simplement le pid du processus en cours d'exécution, elle ne pose pas de difficulté d'implantation.

Généralisation à N processus

Vous devez maintenant généraliser votre code pour N processus : pour les tests, on choisira N = 4.

On rajoute donc 2 nouveaux processus dans le système, proc2 et proc3 dont le code est similaire à celui de proc1 (note : pour faciliter la mise au point de votre code, on vous recommande de copier-coller le code de proc1 deux fois et d'adapter les traces pour écrire en dur le nom du processus, plutôt que de ré-utiliser la même fonction).

La généralisation ne nécessite pas beaucoup de changements :

  • la fonction ordonnance doit être adaptée pour implanter la politique du tourniquet, qui active les processus dans l'ordre de leur pid : 0, 1, 2, 3, 0, 1, 2, 3, etc.
  • on vous recommande de factoriser le code de création et d'initialisation des processus proc1, proc2 et proc3 avec une fonction int cree_processus(void (*code)(void)) qui prend en paramètre le code de la fonction à exécuter et renvoie le pid du processus créé, ou -1 en cas d'erreur (i.e. si on a essayé de créer plus de processus que le nombre maximum).

Si vous avez fini en avance

Vous pouvez pour aller plus loin implanter une politique d'ordonnancement plus évoluée que celle du tourniquet, en introduisant une notion de priorité. Un exercice d'ordonnancement intéressant consiste alors à garantir que sur une période de 6 quantum :

  • le processus 0 ne prendra jamais la main ;
  • le processus 1 prendra la main une fois ;
  • le processus 2 prendra la main deux fois ;
  • le processus 3 prendra la main trois fois.

A vous de trouver comment jouer avec les priorités pour obtenir ce résultat.