next up previous index
Next: Gestion de la mémoire Up: Systèmes d'exploitation (Module Maıtrise Previous: Introduction.

Gestion des Processus.

Un processus.

Définition.

Processus = programme + contexte.

Modèle d'un processus.


automate25
 

L'ordonnancement de processus.

Les types d'ordonnancements.

Ils sont distingués suivant les transitions permises dans le graphe d'état d'un processus.

transition "interrompu" interdite
sans réquisition (multiprogrammation).
transition "interrompu" autorisée
avec réquisition (temps partagé).

Les différentes phases de l'ordonnancement.

Les critères d'ordonnancement.

Les objectifs sont contradictoires, il faut des compromis.

Les algorithmes d'ordonnancement.

FIFO.
Utilisation maximale de l'UC. Equitable.

Tourniquet (Round Robin).
Equitable. Utilisation de l'UC et temps moyen de réponse dépendent du quantum, ce choix favorise soit les calculs, soit les E/S.

Tourniquet avec priorités statiques.
Non équitable. Utilisation de l'UC et temps moyen de réponse peuvent être bons.

Tourniquet avec priorités dynamiques.
Equitable. Utilisation de l'UC et temps moyen de réponse sont bons. Diverses stratégies pour la gestion des priorités.

PCTE (Plus Court Temps d'Exécution).
Non équitable. Temps moyen de restitution optimal. (analogie avec la file d'attente à une caisse de grande surface, où une règle de politesse est de laisser passer quelqu'un qui a peu d'objets si l'on a un plein caddie).

Implémentable dans les SGBD, mais pas dans un SE généraliste, car le temps du prochain cycle d'exécution n'est pas connu.

Une implémentation est possible en utilisant une fonction d'estimation du temps du prochain cycle. Par exemple t= a * t + b * te.

PCTER (Plus Court Temps d'Exécution Restant).
Une variante du précédent.

L'ordonnancement à plusieurs niveaux.

L'ensemble des processus prêts est souvent trop important pour tenir en RAM. Certains sont donc sur disque. Un processus élu qui est sur disque prend beaucoup plus de temps qu'un processus en RAM pour être chargé dans l'UC.

Le processus élu est donc toujours pris parmi ceux en RAM. L'algorithme est alors non équitable.

La solution consiste à utiliser un deuxième algorithme d'ordonnancement pour gérer les déplacements des processus prêts entre le disque et la RAM.


automate81

La synchronisation (communication) de processus.

La mémoire est partagée entre plusieurs processus (exemple BD), il y a donc des risques de comportements bizarres.

Exemple d'une variable compte modifiée par deux processus, le résultat dépend de l'entrelacement des actions, donc de l'ordonnancement des processus.

Il y a donc un besoin de contrôler le déroulement d'un processus.

 

Le problème de la section critique.

N processus exécutent le programme suivant :

debut
tant que vrai faire debut
        "entrer en section critique"
        Section Critique
        "sortir de section critique"
        Section Non Critique
        fin
fin

Les objectifs :

Les solutions logicielles.

Première idée pour 2 processus: un feu vert/rouge.
le feu est initialisé à vert.
debut
tant que vrai faire debut
        tant que feu = rouge faire rien;
        feu := rouge;
        Section Critique;
        feu := vert;
        Section Non Critique
        fin
fin
Les 2 processus peuvent être ensemble en S.C

Deuxième idée : Deux drapeaux
Flag[i] signifie que Pi veut entrer et les drapeaux sont initialisés à faux.
debut
tant que vrai faire debut
        Flag[i] := true;
        tant que Flag[j] faire rien;
        Section Critique;
        Flag[i] := false;
        Section Non Critique
        fin
fin

Les 2 processus ne peuvent pas être ensemble en S.C

Il n'y a pas d'attente s'il n'y a pas de compétition.

Il y a possibilité d'attente infinie (famine).

la preuve est faite par la construction du graphe du comportement des deux processus.

Troisième idée : une variable qui indique "A qui le tour".
debut
tant que vrai faire debut
        tant que tour = j faire rien;
        Section Critique;
        tour := j ;
        Section Non Critique
        fin
fin

2 processus ne peuvent pas être ensemble en S.C

Il n'y a pas d'attente infinie.

Il peut y avoir attente s'il n'y a pas de compétition. C'est un algorithme d'alternance (jeton).

Algorithme de Peterson pour 2 processus.
Combiner les deuxième et troisième idées.
debut
tant que vrai faire debut
        Flag[i] := true;
        tour := i ;
        tant que (Flag[j] et tour = i) faire rien;
        Section Critique;
        Flag[i] := false;
        Section Non Critique
        fin
fin
La preuve sera faite en TD

Section critique pour N processus.
Solutions complexes et difficiles à prouver.

Le SE doit fournir des primitives pour synchroniser des processus.

Les primitives matérielles de synchronisation.

Les solutions logicielles font les hypothèses suivantes :

Le problème devient plus simple si on les change.

Le défaut commun à ces solutions est l'attente active (gaspillage de l'UC).

Le SE doit fournir des appels systèmes pour endormir et réveiller des processus.

Les appels systèmes de synchronisation.

On suppose l'existance de deux appels systèmes: d'une part block qui permet à un processus de se mettre en état d'attente; d'autre part wakeup(P) qui permet de mettre l'état du processus P à prêt.

Avec ces hypothèses, il est assez facile d'éliminer l'attente active. Il suffit de remplacer faire rien par block, puis ajouter en fin de la phase de sortie une boucle pour reveiller tous les processus "en attente" grâce à un wakeup(P)

Cette solution est moyennement satisfaisante, car en fait un seul proceesus doit être reveillé, les autres feront en effet un nouveau block.

Les sémaphores : Dijkstra - 1965

L'idée est de combiner les appels block et wakeup avec les procédures wait et signal.

Définition

Une structure de données

type semaphore = (n : entier; l : liste de processus);
manipulée uniquement par les actions atomiques wait et signal.
procedure wait(var S : semaphore)         procedure signal(var S : semaphore)
debut                                     debut
S.n := S.n - 1;                           S.n := S.n + 1;
si (S.n < 0) alors debut                  si (S.n <= 0) alors debut
        ajouter(moi,S.l);                         enlever(P,S.l);
        block;                                    wakeup(P);
        fin                                       fin
fin                                       fin

Une solution au problème de la section critique

Une solution équitable pour N processus au problème de la section critique avec un sémaphore mutex initialisé à (1,vide).

debut
tant que vrai faire debut
        wait(mutex);
        Section Critique;
        signal(mutex);
        Section Non Critique
        fin
fin
La solution est équitable si la liste de processus est une FIFO.

Implémentation

Les sémaphores peuvent être implémentés de deux façons :

Utilisation

 

Autres solutions

Il existe des solutions équivalentes (en terme de puissance de synchronisation) pour la synchronisation de processus.

Les messages

Le SE propose les primitives

Les S.E. conçus autour d'un micro-noyau utilise principalement cette technique.

Les messages permettent de synchroniser des processus distants.

Il existe des variantes en fonction des sémantiques :

Une solution au problème de la section critique.

utilse un processus controleur qui délivre les autorisations d'entrée en SC.

processus Pi
debut
tant que vrai faire debut
        emettre(demande,controleur);
        recevoir(aquittement,controleur);
        Section Critique;
        emettre(fin,controleur);
        Section Non Critique
        fin
fin

processus Controleur
debut
tant que vrai faire
        cas de 
        recevoir(demande,P1); emettre(aquittement,P1); recevoir(fin,P1);
        ou 
        recevoir(demande,P2); emettre(aquittement,P2); recevoir(fin,P2);
        ou 
        ...
        ou 
        recevoir(demande,Pn); emettre(aquittement,Pn); recevoir(fin,Pn);
        sac
fin

Equivalence de modèles

Il est possible d'implémenter les messages à l'aide des sémaphores et réciproquement.

Les structures précédentes (sémaphores et messages) sont puissantes, mais encore difficiles d'utilisation. Les suivantes sont plus simples d'emploi.

Les régions critiques conditionnelles

Une variable partagée est déclarée par :

var v : shared T;

et ne peut être utilisée que de la façon suivante :

region v when B do S;

Une solution au problème de la section critique

Les variables manipulées dans la section critique sont rassemblées dans une structure v déclarée partagée.

debut
tant que vrai faire debut
        region v when true do
        Section Critique;
        Section Non Critique
        fin
fin

Le risque, pour l'utilisateur, d'erreur d'entrelacement est nettement diminué.

Equivalence

Il est possible d'implémenter une région critique conditionnelle à l'aide des sémaphores mutex(1,vide), delai1(0,vide) et delai2(0,vide), et des entiers compteur1 et compteur2 initialisés à 0.

debut
wait(mutex);
tant que non B faire debut
        compteur1 := compteur1 + 1;
        si compteur2 > 0 alors
                signal(delai2);
        sinon
                signal(mutex);
        wait(delai1);
        compteur1 := compteur1 - 1;
        compteur2 := compteur2 + 1;
        si compteur1 > 0 alors
                signal(delai1);
        sinon
                signal(delai2);
        wait(delai2);
        compteur2 := compteur2 - 1;
        fin;
S;
si compteur1 > 0 alors
        signal(delai1);
sinon
        si compteur2 > 0 alors
                signal(delai2);
        sinon
                signal(mutex);
fin

Les moniteurs

Un moniteur est déclaré ainsi :

Problèmes classiques de synchronisation

Il existe plusieurs problèmes de synchronisation de processus qui permettent de valider, et de comparer les facilités d'utilisation des différents mécanismes.

Le Producteur/Consommateur avec buffer limité

Un producteur dépose des messages dans un buffer, duquel un comsommateur les retire. La synchronisation doit satisfaire les points suivants :

Les lecteurs/rédacteurs

Un objet est partagé par des lecteurs qui veulent connaıtre sa valeur, et des rédacteurs qui peuvent modifier sa valeur.

Les philosophes mangeurs de spaghettis

N philosophes alternativement pensent et mangent. Pour manger, ils disposent d'une table circulaire ayant N assiettes et N fourchettes.


next up previous index
Next: Gestion de la mémoire Up: Systèmes d'exploitation (Module Maıtrise Previous: Introduction.

Alain GRIFFAULT
Mon May 4 10:52:02 CEST 1998