4MMPS Sleep

De Ensiwiki
Aller à : navigation, rechercher
AttentionCette page est maintenue uniquement par les enseignants. Afin de ne pas perturber le déroulement des cours, elle n'a pas vocation à être modifiée par les élèves. Mais si vous avez des modifications à proposer, merci d'en discuter ou d'envoyer un e-mail aux auteurs de la page (cf. historique)


Mycomputer.png  Deuxième Année  CDROM.png  Informatique 
Fleche haut.png

Dans cette séance, on va rendre l'ordonnancement préemptif, c'est à dire permettre à l'horloge d'interrompre un processus en cours d'exécution pour donner la main à un autre. Puis on travaillera sur un mécanisme permettant d'endormir les processus, pour permettre d'exécuter des tests intéressants.

Ordonnancement préemptif

On va connecter l'ordonnanceur à l'interruption horloge, ce qui en pratique ne nécessite que très peu de modifications par rapport à ce que vous avez fait à la séance précédente.

Les processus de tests seront maintenant les suivants :

void idle(void)
{
    for (;;) {
        printf("[idle] pid = %i\n", mon_pid());
        sti();
        hlt();
        cli();
    }
}

void proc1(void) {
    for (;;) {
        printf("[processus 1] pid = %i\n", mon_pid());
        sti();
        hlt();
        cli();
    }
}

... (idem proc2 et proc3)

Vous devez bien sûr remettre dans la fonction kernel_start toutes les initialisations nécessaires à l'interruption horloge que vous aviez géré pendant la séance 2 (note : ne mettez pas d'appel à sti dans kernel_start : c'est la fonction idle qui activera les interruptions la première fois).

Vous devez penser à ajouter un appel à la fonction ordonnance à la fin de la fonction appelée par le traitant de l'interruption horloge, pour provoquer le changement de processus.

L'affichage obtenu doit être le même que pour la séance précédente : les traces des processus s'afficheront très vite, mais vous pouvez mettre en pause la machine virtuelle en tapant ctrl p ou cmd p.

Endormissement des processus

Dans cet exercice, on va implanter un mécanisme permettant d'endormir un processus pendant un certain nombre de secondes, de façon similaire à la fonction sleep de la bibliothèque C standard.

Une façon simple de mettre en oeuvre ce mécanisme consiste à ajouter à votre structure de processus :

  • un booléen indiquant si le processus est endormi ;
  • un naturel contenant l'heure de réveil du processus, exprimée en nombre de secondes écoulées depuis le démarrage du système.

La fonction d'ordonnancement doit continuer à implanter l'algorithme du tourniquet, mais sauter (i.e. ne pas activer) les processus endormis dont l'heure de réveil n'a pas encore été atteinte. Elle doit aussi réveiller les processus lorsque l'heure de réveil est atteinte.

Il est nécessaire de connaître le nombre de secondes écoulées depuis le démarrage du système : cette information est normalement déjà gérée par la fonction d'affichage de l'horloge, il suffit donc de la rendre accessible à l'ordonnanceur.

Vous testerez votre implantation avec les 4 processus développés plus haut, en remplaçant les hlt par des appels à la fonction d'endormissement (vous devez aussi enlever les sti() et cli(), car la fonction d'endormissement fait partie du code noyau qui doit toujours être appelé avec les interruptions masquées) : par exemple, proc1 peut s'endormir 2 secondes, proc2 3 secondes et proc3 5 secondes à chaque tour de boucle, pour générer des traces de périodicités différentes. Le processus idle n'a lui bien sûr pas le droit de s'endormir, sinon on risquerait de se retrouver dans un système sans aucun processus activable !