Ordonnancement de processus Introduction
Transcription
Ordonnancement de processus Introduction
Ordonnancement de processus • Introduction • Niveaux d’ordonnancement • Objectifs d’ordonnancement • Politiques d’ordonnancement • Ordonnanceurs non préemptifs • Ordonnanceurs préemptifs • Etudes de cas – Cas d’UNIX – Cas de Linux – Cas de Windows XP – Implémentation : Ordonnanceur de Nachos Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.1 Introduction • Les programmes lancés sont d’abord admis par le système qui se charge d’en créer les processus nécessaires. • Dans un système multiprogrammé, plusieurs processus peuvent être présents en mémoire centrale. • Le système d’exploitation décide de l’ordre et du moment de l’admission des programmes en attente (ordonnanceur de haut niveau). • Il gère également l’allocation du processeur aux différents processus à exécuter (ordonnanceur de bas niveau). • L’exécution d’un processus est une séquence alternée de calculs CPU (rafales « burst ») et d’attentes d’événements (E/S, attente d’un sémaphore..). • Lorsque le processus en cours se bloque, le processeur est alloué à un autre => L’ordonnanceur de bas niveau se charge des changements de contexte. Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.2 1 Programme A Mode utilisateur Introduction (2) Commutation de contexte Mode kernel Programme B Mode utilisateur exécution Sauvegarder état dans PCB A exécution Charger état de PCB B Sauvegarder état en PCB B Charger état de PCB A exécution • Pour accélérer la commutation, certains processeurs sont dotés de deux ou plusieurs groupes de registres. Génie Informatique École Polytechnique de Montréal Systèmes d’exploitation Chapitre 7.3 Niveaux d’ordonnancement Ordonnancement Expiration de haut niveau Lot de travaux en attente d’admission File d’attente, prêt Ordonnancement de bas niveau Terminé Process eur Processeur Ordonnancement de niveau intermédiaire File d’attente, prêt hors mémoire Ordonnancement de niveau intermédiaire File d’attente, attente hors mémoire Occurrence File d’attente, attente d’événement Attente d’événement d’événement Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.4 2 Niveaux d’ordonnancement (2) • L’ordonnanceur de haut niveau décide du degré de la multiprogrammation ( nombre maximal de processus dans le système). • L’ordonnanceur de niveau intermédiaire gère le déplacement des processus d’une file d’attente à une autre. • Dans la majorité des systèmes actuels, les niveaux intermédiaire et haut sont combinés -> haut niveau. • L’ordonnanceur de bas niveau (dispatcher ou répartiteur) est sollicité plusieurs fois par seconde et doit constamment résider en mémoire. • L’ordonnancement doit se faire selon une politique bien réfléchie visant à répondre à des objectifs de performance. Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.5 Objectifs d’ordonnancement 1. Maximiser le nombre de processus exécutés par unité de temps. 2. Minimiser le temps d’attente d’exécution de chaque processus. 3. Maximiser les temps d’utilisation des processeurs et autres ressources. 4. Respecter les échéanciers (terminer l’exécution avant leurs deadlines). 5. Éviter le problème de famine (attente infinie). 6. Favoriser les processus les plus prioritaires (éviter le problème d’inversion des priorités). 7. Minimiser le nombre et la durée des changements de contexte. Difficile de les satisfaire à la fois (exemple objectifs 1 et 4). Prioriser les objectifs. Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.6 3 Objectifs d’ordonnancement (2) Critères de performances • Temps de séjour d’un processus (temps de rotation ou de virement) : temps entre l’admission du processus et sa sortie. • Temps d' attente d’un processus : somme des périodes que le processus passe à l' état prêt • Temps de réponse: temps qui s' écoule entre l' entrée d' un processus et le moment où il commence à être traité • Capacité de traitement : nombre de processus traités par unité de temps. • Taux d’utilisation d’un processeur. Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.7 Politique d’ordonnancement • Choix du processus à exécuter ? – Premier arrivé, premier servi. – Plus prioritaire (priorités statiques ou dynamiques). – Plus court temps …. • Le temps d’allocation du processeur au processus choisi : – Allocation jusqu’à terminaison ou libération volontaire (ordonnanceur non préemptifs). – Temps d’allocation limité fixe ou variable (ordonnanceur préemptifs). • Quand appeler l’ordonnanceur ? – Le processus en cours se termine, se bloque ou cède le processeur, – Le temps alloué a expiré. – L’arrivée d’un processus plus prioritaire… Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.8 4 Ordonnanceurs non préemptifs (sans réquisition) • Le système d’exploitation choisit le prochain processus à exécuter : – Premier arrivé, Premier servi (FCFS, First-Come First-Served) ou – Plus court d’abord (SPF, Short Process First ou SJF Short Job First). – Plus prioritaire d’abord (priorite = (temps d’attente + temps d’exécution) / temps d’exécution). • Il lui alloue le processeur jusqu’à ce qu’il se termine, se bloque (en attente d’un événement) ou cède le processeur. Il n’y a pas de réquisition. Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.9 Ordonnanceurs non préemptifs (2) FCFS Processus Exécution Arrivée A 3 0 B 6 1 C 4 4 D 2 6 E 1 7 AAABBBBBBCCCCDDE Temps de séjour moyen : 7.6 Temps moyen d’attente : 4.4 Nombre de changements de contexte : 5 Remarque : Temps moyen d’attente élevé si de longs processus sont exécutés en premier. Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.10 5 Ordonnanceurs non préemptifs (3) Short Processus First (SPF ou SJF) Processus Exécution Arrivée A 3 0 B 6 1 C 4 4 D 2 6 E 1 7 AAABBBBBBEDDCCCC Temps de séjour moyen : 6.4 Temps moyen d’attente : 3.2 Nombre de changements de contexte : 5 Remarque : Meilleur temps moyen d’attente. Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.11 Ordonnanceurs non préemptifs (4) SPF • Parmi les processus prêts, le processus élu est celui dont la prochaine rafale est la plus courte. Comment estimer le temps de la prochaine rafale ? • Le temps de la prochaine rafale de chaque processus est estimé en se basant sur le comportement passé du processus. • Soient Si et Ti les temps d’exécution estimé et mesuré pour la iième rafale, les estimations successives sont : S0 ; pour la première S1 = αT0 +(1- α )S0 ; pour la seconde S2 = αT1 +(1- α )S1 ; pour la troisième …. 0≤α≤1 Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.12 6 Ordonnanceur non préemptifs (5) à priorité (éviter la famine) • • • • Processus Exécution Arrivée A 3 0 B 6 1 C 4 4 D 2 6 E 1 7 Priorité = (temps d’attente + temps d’exécution) / temps d’exécution AAABBBBBBEDDCCCC Le temps moyen de séjour : 6,4 Le temps moyen d’attente : 3,2 Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.13 Ordonnanceurs avec réquisition (préemptifs) • Pour s’assurer qu’aucun processus ne s’exécute pendant trop de temps, les ordinateurs ont une horloge électronique qui génère périodiquement une interruption. • A chaque interruption d’horloge, le système d’exploitation reprend la main et décide si le processus courant doit : – poursuivre son exécution ou – être suspendu pour laisser place à un autre. • S’il décide de suspendre l’exécution au profit d’un autre, il doit d’abord sauvegarder l’état des registres du processeur avant de charger dans les registres les données du processus à lancer (commutation de contexte). • Cette sauvegarde est nécessaire pour pouvoir poursuivre ultérieurement l’exécution du processus suspendu. Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.14 7 Ordonnanceurs avec réquisition (2) (préemptifs) • Le processeur passe donc d’un processus à un autre en exécutant chaque processus pendant quelques dizaines ou centaines de millisecondes. • Le temps d’allocation du processeur au processus est appelé quantum. • Cette commutation entre processus doit être rapide (temps nettement inférieur au quantum). • Le processeur, à un instant donné, n’exécute réellement qu’un seul processus. • Pendant une seconde, le processeur peut exécuter plusieurs processus et donne ainsi l’impression de parallélisme (pseudo-parallélisme). Génie Informatique École Polytechnique de Montréal Systèmes d’exploitation Chapitre 7.15 Ordonnanceurs préemptifs (3) (Shortest Remaining Time SRT) • • Lorsqu’un processus arrive, l’ordonnanceur compare le temps estimé de son exécution avec celle du processus actuellement en exécution (version préemptive du SPF). Si ce temps est plus petit, on exécute immédiatement le nouveau processus. AAABCCCCEDDBBBBB Processus Exécution Arrivée A 3 0 B 6 1 C 4 4 D 2 6 E 1 7 Temps moyen de séjour : 5.8 Temps moyen d’attente : 2.6 Nombre de changements de contexte : 6 Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.16 8 Ordonnanceurs préemptifs (4) Ordonnancement circulaire (Tourniquet ou round robin) • Algorithme ancien, simple, fiable et très utilisé. • Il mémorise dans une file (FIFO : First In First Out), la liste des processus en attente d’exécution (prêts). Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.17 Ordonnanceurs préemptifs (5) Ordonnancement circulaire Choix de la valeur du quantum • Algorithme équitable mais sensible au choix du quantum. • Un quantum trop petit provoque trop de commutations de processus et abaisse l’efficacité du processeur. • Un quantum trop élevé augmente le temps de réponse des courtes commandes en mode interactif. • Il était de 1 seconde dans les premières versions d’UNIX. • Il varie entre 20 et 120 ms. Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.18 9 Ordonnanceurs préemptifs (6) Ordonnancement circulaire Exemple 1 Quantum = 1 Temps de commutation = 0 Processus Exécution Arrivée A 3 0 B 6 1 C 4 4 D 2 6 E 1 7 ABABACBDCEBDCBCB Temps moyen de séjour : 8,0 Temps moyen d’attente : 4,8 Nombre de changements de contexte : 16 Génie Informatique École Polytechnique de Montréal Systèmes d’exploitation Chapitre 7.19 Ordonnanceurs préemptifs (7) Ordonnancement circulaire Exemple 2 Quantum = 3 unités Commutation de contexte = 1 unité Processus Exécution Arrivée A 8 0 B 5(2)3 3 C 4 7 • • • Systèmes d’exploitation Le temps de séjour moyen : 21.33. Le temps moyen d’attente : 14 Nombre de changements de contexte : 8 Génie Informatique École Polytechnique de Montréal Chapitre 7.20 10 Ordonnanceurs préemptifs (8) Ordonnancement circulaire Exemple 3 Quantum = 5 unités Commutation de contexte = 1 unité Processus Quantum = 5 unités A A A A A • • • B B B B B Exécution Arrivée A 8 0 B 5(2)3 3 C 4 4 C C C C A A A B B B Le temps de séjour moyen : (21+22+13)/3 (soit 18,66). Le temps d’attente moyen : 11,33. Nombre de changements de contexte : 5 Génie Informatique École Polytechnique de Montréal Systèmes d’exploitation Chapitre 7.21 Ordonnanceurs préemptifs (9) Ordonnancement circulaire Exemple 4 Processus Exécution Arrivée A 8 0 B 5(2)3 3 C 4 4 CC C C A B B B Quantum = 7 unités Commutation de contexte = 1 unité Quantum = 7 unités A A A A A A A • • • B B B B B Le temps de séjour moyen : (21+22+15)/3 (soit 19.33). Le temps d’attente moyen : 8. Nombre de changements de contexte : 5 Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.22 11 Ordonnanceurs préemptifs (10) Ordonnanceur à priorité avec files multiples • Il attribue une priorité à chaque processus (statique ou dynamique). • Les processus de même priorité sont dans une file FIFO • Il y a autant de files qu’il y a de niveaux de priorité • Les processus de chaque file sont ordonnancés selon l’algorithme du Tourniquet (Round Robin avec un quantum variable ou fixe) ou FCFS. Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.23 Ordonnanceurs préemptifs (11) Ordonnanceur à priorité avec files multiples Problèmes • Équité : L’exécution des processus moins prioritaires peut être constamment retardée par l’arrivée de processus plus prioritaires. • Inversion des priorités : – un processus moins prioritaire détient une ressource nécessaire à l’exécution d’un processus plus prioritaire. – Le processus moins prioritaire ne peut pas s’exécuter car il y a constamment des processus actifs plus prioritaires. Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.24 12 Ordonnanceurs préemptifs (12) Ordonnanceur à priorité avec files multiples Attribution et évolution des priorités • Pour empêcher les processus de priorité élevée de s’exécuter indéfiniment, l’ordonnanceur diminue régulièrement la priorité du processus en cours d’exécution (priorité dynamique) et augmente progressivement celles des processus en attente. • La priorité du processus en cours est comparée régulièrement à celle du processus prêt le plus prioritaire (en tête de file). Lorsqu’elle devient inférieure, la commutation a lieu. • Dans ce cas, le processus suspendu est inséré en queue de file correspondant à sa nouvelle priorité. • Pour favoriser les processus qui font beaucoup d’E/S, ils doivent acquérir le processeur dès qu’ils le demandent, afin de leur permettre de lancer leurs requêtes suivantes d’E/S. • Pour éviter qu’il y ait beaucoup de commutations pour les processus consommateurs de temps CPU, il est préférable d’allouer un plus grand quantum à ces processus (quantum variable). Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.25 Etudes de cas Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.26 13 Cas d’UNIX (traditionnel) • C’est un ordonnanceur à deux niveaux. L’ordonnanceur de bas niveau se charge d’élire un processus parmi ceux qui résident en mémoire. • L’ordonnanceur de haut niveau se charge des transferts de processus entre la mémoire centrale et le disque. • L’ordonnanceur de bas niveau utilise plusieurs files, une priorité est associée à chaque file (plusieurs niveaux de priorité). • Les processus prêts qui sont en mémoire, sont répartis dans les files selon leur priorité. • Les priorités des processus s’exécutant en mode utilisateur sont positives ou nulles, alors que celles des processus s’exécutant en mode noyau sont négatives. • Les priorités négatives sont les plus élevées. Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.27 Cas d’UNIX (traditionnel) (2) • L’ordonnanceur de bas niveau choisit le processus le plus prioritaire qui se trouve en tête de file. • Le processus élu est alors exécuté pendant au maximum un quantum (100 ms). S’il ne se termine pas ou ne se bloque pas au bout de ce quantum, il est suspendu. • Le processus suspendu est inséré en queue de sa file. • La priorité initiale d’un processus utilisateur est en général égale à 0. La commande nice permet d’attribuer une priorité plus basse à un processus (>0). • Les priorités des processus prêts en mémoire sont recalculées périodiquement toutes les secondes. Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.28 14 CAS d’UNIX (traditionnel) (3) Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.29 Cas de Linux • L’ordonnanceur de Linux est un ordonnanceur préemptifs et à priorité. • Il distingue trois classes de tâches (processus) qu’il ordonnance différemment: – Processus FIFO temps réel (les plus prioritaires) : Aucun processus de cette classe ne peut être interrompu par un autre, à moins que ce soit un processus plus prioritaire de la même classe. – Processus Tourniquet temps réel. – Processus Temps partagé (les moins prioritaires) : Ils s’exécutent uniquement si aucun processus des classes 1 et 2 n’est prêt. • Chaque processus créé fait partie d’une des trois classes et a une priorité comprise entre 1 et 40 (20 par défaut). • Les valeurs élevées correspondent à des priorités élevées. Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.30 15 Cas de Linux (2) • Chaque processus de la deuxième et troisième classe a un Quantum : valeur initiale = priorité. • Le Quantum du processus en cours d’exécution diminue de 1 unité à chaque consommation de 10 ms de temps CPU. • Les quanta sont réajustés lorsque tous les processus sont bloqués ou leurs quanta sont nuls : Quantum = Quantum / 2 + priorité • Lorsque l’ordonnanceur prend le contrôle, il attribue une note à chaque processus : Note = 1000 + priorité si le processus appartient aux classes temps-réel Note = Quantum >0 ? Quantum + priorité : 0 sinon • Le processus élu est celui qui a une plus forte note. • Le temps d’allocation du processeur est au plus égal à 10 fois son Quantum. Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.31 Cas de Linux (3) Répéter • Réajuster les quanta si tous les processus sont bloqués ou leurs quanta sont nuls : Quantum = Quantum / 2 + priorité • Calculer la note de chaque processus prêt : Note = 1000 + priorité si le processus appartient aux classes temps-réel Note = Quantum >0 ? Quantum + priorité : 0 • sinon Allouer le processeur à celui qui a la plus grande note (temps d’allocation maximun est 10 fois son quantum). Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.32 16 Cas de Linux (4) Exemple • • • Processus Priorité Exécution A 20 160 (180) 70 B 18 40 (150) 140 C 10 300 A s' exécute et s' interrompt après 160 ms (40 ms non utilisées). B s' exécute et s' interrompt après 40 ms (140 ms non utilisées). C s' exécute pendant 100 ms et est interrompu, A et B toujours bloqués. Processus Nouveau quantum A 4/2+20 = 22 B 14/2+18 = 25 C 0/2 +10 = 10 Génie Informatique École Polytechnique de Montréal Systèmes d’exploitation Chapitre 7.33 Cas de Linux (5) Exemple • Processus Priorité Exécution (ms) A 20 160 (180) 70 B 18 40 (150) 140 C 10 300 C s' exécute à nouveau et est interrompu (sa note est 0). Processus Note Quantum A 42 22 B 43 25 C 0 10 • B s' exécute et se termine au bout de 140 ms (250-140 ms non utilisées). • A s' exécute et se termine au bout de 70 ms. • C s’exécute et se termine au bout de 100 ms. Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.34 17 Cas de Windows XP • Windows XP ne contient pas un module autonome qui se charge de l’ordonnancement. Le code est dispersé. • Il ordonnance les threads sans se préoccuper de leurs processus. • C’est un ordonnanceur préemptif à priorité (32 niveaux de priorité). Les priorités sont dynamiques. • On distingue quatre classes de processus légers : – Les threads temps réel : chaque thread de cette classe a une priorité comprise entre 16 et 31. Sa priorité ne change jamais. – Les threads utilisateur : chaque thread de cette classe a une priorité comprise entre 1 et 15. Sa priorité varie durant sa vie mais reste toujours comprise entre 1 et 15. Il migre d’une file à une autre avec l’évolution de sa priorité. – Le thread zéro (priorité 0) : il s’exécute, en arrière plan, lorsque toutes les files, de priorité supérieure, sont vides. Il se charge de la remise à zéro des pages libérées. – Le thread idle : il s’exécute si toutes les files sont vides. Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.35 Cas de Windows XP (2) Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.36 18 Cas de Windows XP (3) • Les processus légers de même priorité sont dans une même file et ordonnancés selon l’algorithme du tourniquet. • L’ordonnanceur est appelé si : – Un thread passe à l’état prêt ou quitte l’état d’exécution. – La priorité ou l’affinité de processeur d’un thread change. • L’ordonnanceur choisit le processus léger le plus prioritaire en tête de file et lui alloue le processeur pendant au maximum un quantum. • Quand un processus léger est sélectionné, son exécution peut être interrompue (avant la fin du quantum) si un autre processus léger de priorité plus élevée devient prêt. Le thread préempté est remis en tête de la file associée à son niveau de priorité. • Si un thread est suspendu car il a consommé son quantum, sa priorité peut être diminuée. • S’il est interrompu pour une requête d’E/S, un sémaphore, etc., son quantum est décrémenté par contre sa priorité augmente. Elle augmente encore plus, s’il s’agit d’une requête d’E/S qui concerne un clavier ou un écran. Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.37 Cas de Windows XP (4) • Si un thread à l’état prêt reste trop longtemps en attente du processeur (depuis 4 secondes environ), il se voit attribuer une priorité 15 et un quantum de 4 unités (accélérer le threads pour éviter le problème de famine). • À la fin du quantum, le thread reprend sa priorité de base originale. • C’est le « balance set manager » qui se charge de la recherche de tels threads (toutes les secondes). • Afin de minimiser le temps CPU consommé par le balance set manager, au maximum 16 threads sont examiné à chaque passage. S’il y en a plus, il examinera les 16 suivants à son prochain passage. • Le balance set manager limite le nombre de threads à accélérer à 10. • Un changement de contexte se produit à chaque ordonnancement et exige que l’on mémorise : – Pointeur d’instruction (compteur ordinal) – Pointeurs de pile utilisateur et de pile noyau – Pointeur vers l’espace d’adressage dans lequel est exécuté le thread (répertoire des tables de pages du processus). Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.38 19 Implémentation Ordonnanceur Nachos #ifndef SCHEDULER_H #define SCHEDULER_H class Scheduler { public: Scheduler(); ~Scheduler(); // Initialize list of ready threads // De-allocate ready list void ReadyToRun(Thread* thread); // Thread can be dispatched. Thread* FindNextToRun(); // Dequeue first thread on the ready list, if any, and return thread. void Run(Thread* nextThread, bool finishing); // Cause nextThread to start running void CheckToBeDestroyed(); // Check if thread that had been running needs to be deleted void Print(); // Print contents of ready list private: List<Thread *> *readyList; // queue of threads that are ready to run but not running Thread *toBeDestroyed; // finishing thread to be destroyed // by the next thread that runs }; #endif // SCHEDULER_H Génie Informatique École Polytechnique de Montréal Systèmes d’exploitation Chapitre 7.39 Implémentation Ordonnanceur Nachos (2) Scheduler::Scheduler() { readyList = new List<Thread *>; toBeDestroyed = NULL; } Scheduler::~Scheduler() { delete readyList; } void Scheduler::ReadyToRun (Thread *thread) { ASSERT(kernel->interrupt->getLevel() == IntOff); DEBUG(dbgThread, "Putting thread on ready list: " << thread->getName()); thread->setStatus(READY); readyList->Append(thread); } Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.40 20 Implémentation Ordonnanceur Nachos (3) Thread * Scheduler::FindNextToRun () { ASSERT(kernel->interrupt->getLevel() == IntOff); if (readyList->IsEmpty()) return NULL; else return readyList->RemoveFront(); } void Scheduler::CheckToBeDestroyed() { if (toBeDestroyed != NULL) { delete toBeDestroyed; toBeDestroyed = NULL; } } void Scheduler::Print() { cout << "Ready list contents:\n"; readyList->Apply(ThreadPrint); } Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.41 Implémentation Ordonnanceur Nachos (4) void Scheduler::Run (Thread *nextThread, bool finishing) { Thread *oldThread = kernel->currentThread; ASSERT(kernel->interrupt->getLevel() == IntOff); if (finishing) { // mark that we need to delete current thread ASSERT(toBeDestroyed == NULL); toBeDestroyed = oldThread; } #ifdef USER_PROGRAM if (oldThread->space != NULL) { oldThread->SaveUserState(); oldThread->space->SaveState(); } #endif // ignore until running user programs // if this thread is a user program, // save the user' s CPU registers oldThread->CheckOverflow(); // check if the old thread had an undetected stack overflow Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.42 21 Implémentation Ordonnanceur Nachos (5) kernel->currentThread = nextThread; // switch to the next thread nextThread->setStatus(RUNNING); // nextThread is now running // This is a machine-dependent assembly language routine defined in switch.s. SWITCH(oldThread, nextThread); // interrupts are off when we return from switch! ASSERT(kernel->interrupt->getLevel() == IntOff); CheckToBeDestroyed(); #ifdef USER_PROGRAM if (oldThread->space != NULL) { oldThread->RestoreUserState(); oldThread->space->RestoreState(); } // check if thread we were running // before this one has finished // and needs to be cleaned up // if there is an address space // to restore, do it. } #endif Systèmes d’exploitation Génie Informatique École Polytechnique de Montréal Chapitre 7.43 22