Académique Documents
Professionnel Documents
Culture Documents
PROJET
OPERATING SYSTEM
PROJET :
Mise en œuvre d’un
ordonnanceur pour la gestion
des processus
MEMBRES DU GROUPE :
Moussa KANE
Adama COULIBALY
Table des matières
INTRODUCTION.....................................................................................................................4
1 Présentation des algorithmes d’ordonnancement..........................................................5
1.1 ROUND ROBIN (RR).................................................................................................5
1.2 PRIORITY SCHEDULING (PS).................................................................................6
1.3 ORDONNANCEMENT RR & PS...............................................................................6
2 Implémentation du simulateur RR & PS........................................................................7
2.1 Présentation des technologies utilisées.....................................................................7
2.1.1 Le langage C++.....................................................................................................7
2.1.2 Microsoft Visual studio 2022................................................................................7
2.1.3 Les structures de données utilisées.......................................................................8
2.1.4 La bibliothèque wxWidgets..................................................................................8
2.2 Conception et fonctionnalités du simulateur...........................................................8
2.2.1 Implémentation en mode CLI...............................................................................9
2.2.2 Implémentation en mode GUI............................................................................14
CONCLUSION.......................................................................................................................24
INTRODUCTION
Pour la gestion des processus dans un système mono ou multi processeur, chaque processus
doit être exécuté séquentiellement par le processeur. Dans de tels systèmes, le processeur est
affecté à chaque processus à un moment donné : on parle ainsi d’ordonnancement.
Lors de la réalisation de ce projet, nous avons eu à concevoir un ordonnanceur basé sur deux
algorithmes d’ordonnancements : ROUND ROBIN et PRIORITY SCHEDULING.
Dans ce rapport nous aurons ainsi deux grandes sections :
La première section est la présentation des algorithmes d’ordonnancement utilisés
pour la conception du simulateur.
La deuxième section concerne l’implémentation de l’ordonnanceur ainsi que sa
conception détaillée.
1 Présentation des algorithmes d’ordonnancement
L’ordonnancement est un processus permettant de déterminer quel processus possédera le
processeur pour l'exécution pendant qu'un autre processus est en attente. La tâche principale
de l’ordonnanceur est de s'assurer que chaque fois que le processeur reste inactif, le système
d'exploitation sélectionne au moins l'un des processus disponibles dans la file d'attente prête
pour l'exécution.
Lorsqu’un processus est déjà exécuté par le processeur, il dispose d’un délai d’exécution
limité, mais s’il ne peut pas se terminer, il est préempté. Ainsi, au fur et à mesure que le temps
progresse, les chances que le processus soit préempté augmentent et sa priorité diminue. Alors
que le processus qui attend dans la file d’attente des prêts augmente ses chances d’obtenir le
processeur suivant. Ainsi, sa priorité augmente.
Dans la figure 2 le processus P1 s’exécute en premier parce qu’il a la priorité la plus élevé
suivie de P3 pour finir par exécuter P2.
Nous avons ainsi créé une classe Processus (figure 1) qui contient toutes les exigences de
modélisation comme attribut public. Nous avons aussi deux méthodes pour cette classe :
CreerProcessus( ) qui nous permet de créer un processus et AfficherProcessus( ) pour
afficher les informations d’un processus. Au niveau du constructeur (figure 2), le processus
est initialisé avec l’Id à 0, la durée à 0, le nom du programme à NULL, la priorité à 9, l’ID de
l’utilisateur à 0, le temps restant à 0.
Figure 4: Classe Processus
Nous pouvons constater dans les deux captures précédentes un pointeur suivant de type
Processus. Ce pointer va nous servir lors de l’implémentation d’une liste chainé simple pour
l’implémentation de notre liste de processus. Il est initialisé à NULL dans le Constructeur.
Nous avons créé une classe Scheduler (figure 4) qui contient les attributs définis
précédemment au niveau de la modélisation. Nous avons aussi deux méthodes pour cette
classe : defineScheduler( ) qui nous permet de définir le quantum de temps et startScheduler(
) pour démarrer le simulateur. Au niveau du premier constructeur (figure 5), la liste est
initialisée à NULL et le quantum à 0. Le deuxième constructeur quant à lui prend une liste et
le quantum de temps en paramètre pour initialiser les attributs liste et quantum.
Figure 7: Classe Scheduler
Nous pouvons constater au niveau de la figure 11 que nous avons 9 méthodes publiques, 1
méthode protected virtuelle et 1 méthode privée. Pour les méthodes publiques, nous avons :
OnQuit : Cette méthode réagit à l’événement Quitter qui, comme son nom l’indique,
permet de fermer le frame créé.
OnAbout : Cette méthode réagit à l’événement Information qui permet d’avoir les
informations sur l’auteur du simulateur.
OnConfigure : Cette méthode réagit à l’événement Ajouter des processus qui permet
de créer des processus et de les ajouter à une liste.
OnQuantum : Cette méthode réagit à l’événement Définir le quantum de temps qui
permet de déterminer le quantum pour l’ordonnancement.
OnStart : Cette méthode réagit à l’événement Démarrer qui déclenche l’exécution du
simulateur les informations.
OnStop : Cette méthode réagit à l’événement Arrêter qui permet d’arrêter l’activité
du simulateur et de réinitialiser la liste à NULL.
OnPause : Cette méthode réagit à l’événement Pause qui permet de mettre en pause
l’activité du simulateur.
OnResume : Cette méthode réagit à l’événement Reprendre qui permet de reprendre
l’activité du simulateur précédemment mise en pause.
WriteList : Cette méthode permet d’écrire sur la section de journalisation les détails
du processus en activité et les informations sur les threads.
Nous avons une méthode protected DoLogRecord( ) qui transfert les messages de
journalisation au niveau de WriteList( ).
Une méthode privée CreateThread( ) est aussi présente pour la création de thread.
2.2.2.3 Description de la classe MyApp
Cette classe représente l’application elle-même. Elle est dérivée de la classe wxApp. Elle
comprend les attributs suivants :
m_critsect – Instance wxCriticalSection (wxCriticalSection)
m_threads – Instance wxArrayThreads (wxArrayThreads)
m_semAllDone – Instance wxSemaphore (wxSemaphore)
m_shuttingDown – Indication de l’arrêt de tous les threads (bool)
Cette classe a un constructeur par défaut MyApp( ) qui affecte false à la variable
m_shuttingDown et un Destructeur virtuel. Nous avons aussi une méthode virtuelle OnInit( )
(figure 12) qui est équivalente au rôle que joue la fonction main. Cette méthode est chargé de
généré la Frame principale de la classe MyFrame.
En plus des constructeurs et des attributs, nous avons aussi des méthodes. Nous avons 6
méthodes publiques et 2 méthodes privées.
getProgramName : qui récupère le nom du processus entré dans la zone de nom
getProgramTime : qui récupère la durée du processus entré dans la zone de temps et
le converti en int.
getProgramPriority : qui récupère la priorité du processus entré dans la zone de
priorité
et le converti en int.
getProgramUserid : qui récupère l’ID de l’utilisateur entré dans la zone de UserId
et le converti en int.
getProgramQuantum : qui récupère le quantum entré dans la zone de quantum
et le converti en int.
ReinitialiserField : qui réinitialise tous les champs après mis un processus à la liste.
Nous pouvons constater que des méthodes ont aussi été ajoutées. ProcessusEnAttente( )
renvoie les détails d’un processus en attente, add_waiting_time( ) calcule le temps d’attente
de l’instance, update_pass( ) met à jour le nombre de fois qu’un processus a été exécuté et
setArrivalTime( ) détermine la date d’arrivée du processus dans la base.
Au niveau de la classe Scheduler, nous avons enlevé que la méthode DefineScheduler( ).
Quant aux fonctions de la liste chainée, nous avons modifier afficherListeProcessus( ) pour
faire en sorte qu’on affiche la liste des processus en attente s’il y’en a .
Après avoir intégré les bibliothèques nécessaires, il faut gérer les boîtes de dialogue (ajout de
processus et quantum de temps).
Pour l’ajout de processus, il faut d’abord remplir les zones de texte du nom, du temps
d’exécution, de la priorité et de l’ID de l’utilisateur. Cela est géré par la méthode
OnConfigure de la classe MyFrame. Si tous les champs sont entrés, le processus est ajouté en
fin de liste avec sa date d’arrivée dans la liste. Un message est ensuite affiché pour nous dire
qu’un processus a été ajouté dans la liste. Si au moins un champ n’a pas de valeur, un
message nous est renvoyé pour nous dire de remplir tous les champs. A chaque fois qu’un
processus est ajouté à la liste, les champs sont réinitialisés et on peut à nouveau ajouter un
processus à la liste si on le souhaite. Tant que le bouton CLOSE n’est pas cliqué, l’utilisateur
peut ajouter autant de processus qu’il souhaite. A noter que les processus sont ajoutés en
ordre, donc si est processus P1 est ajouté en premier à la liste par rapport à un processus P2, le
processus P1 est considéré comme arrivé en premier et la date de passage dans la base nous le
confirmera.
Figure 22: Boite de dialogue Ajouter des processus
Après avoir ajouter des processus et définit le quantum de temps, on peut démarrer le
simulateur en cliquant sur le bouton Démarrer.
Figure 24: Simulateur en pause
On peut constater dans la figure précédente plusieurs choses. D’abord la date de passage dans
la base pour chaque processus montre que P1 est arrivé en premier suivi de P2, P3, P4 et P5.
On peut aussi constater que les processus sont triés en fonction de leur priorité. P2 ayant la
priorité la plus élevée est exécutée en premier suivit de P3, P5. P1 et P4 ont la même priorité,
le processus P1 étant arrivé en premier sera d’abord exécuté suivit de P4. Chaque processus
est exécuté à tour de rôle jusqu’à ce qu’il n’y ait plus aucun processus dans la liste.
CONCLUSION