Vous êtes sur la page 1sur 36

Gestion de processus

I- Gnralits Les processus correspondent lexcution de tches : les programmes des utilisateurs, les entres-sorties par le systme. Un systme dexploitation doit en gnral traiter plusieurs tches en mme temps. Comme il na, la plupart du temps, quun processeur, il rsout ce problme grce un pseudo-paralllisme. Il traite une tche la fois, sinterrompt et passe la suivante. La commutation des tches tant trs rapide, lordinateur donne lillusion deffectuer un traiteme nt simultan. Les processus des utilisateurs sont lancs par un interprte de commande. Ils peuvent euxmmes lancer ensuite dautres processus. On appelle le processus crateur : le pre, et les processus crs : les fils. Les processus peuvent donc se structurer sous la forme dune arborescence. Au lancement du systme, il nexiste quun seul processus, qui est lanctre de tous les autres.

P1

P2

P3

P4

P5

P6

Figure 1 : La hirarchie des processus.

Les processus sont composs dun espace de travail en mmoire form de 3 segments : la pile, les donnes et le code et dun contexte.

Cours systme dexploitation 2

Page 1

Figure 2 : Les segments dun processus.

Le code correspond aux instructions, en langage dassemblage, du programme excuter. La zone de donnes contient les variables globales ou statiques du programme ainsi que les allocations dynamiques de mmoire. Enfin, les appels de fonctions, avec leurs paramtres et leurs variables locales, viennent sempiler sur la pile. Les zones de pile et de donnes ont des frontires mobiles qui croissent en sens inverse lors de lexcution du programme. 1- tats d'un processus Lorsqu'un processus s'excute, il change d'tat, comme on peut le voir sur la figure 3. Il peut se trouver alors dans l'un des trois tats principaux : lu : en cours d'excution. Prt : en attente du processeur. Bloqu : en attente d'un vnement.

Initialement, un processus est l'tat prt. Il passe l'tat excution lorsque le processeur entame son excution. Un processus passe de l'tat excution l'tat prt ou lorsqu'il est suspendu provisoirement pour permettre l'excution d'un autre processus. Il passe de l'tat excution l'tat bloqu s'il ne peut plus poursuivre son excution (demande d'une E/S). Il se met alors en attente d'un vnement (fin de l'E/S). Lorsque l'vnement survient, il redevient prt.

Cours systme dexploitation 2

Page 2

Figure 2 : les tats d'un processus.

2- Table des processus Pour grer les processus, le systme d'exploitation sauvegarde plusieurs informations dans des structures de donnes. Il existe une table pour contenir les informations concernant tous les processus crs. Il y a une entre par processus dans la table, appele le Bloc de Contrle de Processus(PCB). Chaque entre de la table PCB comporte des informations sur : Le pid du processus. L'tat du processus. Son compteur ordinal (adresse de la prochaine instruction devant tre excute par ce processus). Son allocation mmoire. Les fichiers ouverts. Les valeurs contenues dans les registres du processeur. Tout ce qui doit tre sauvegard lorsque l'excution d'un processus est suspendue.

3- Changement de contexte dun processus Une des principales raison pour justifier l'existence des blocs de contrle des processus est que dans un systme multiprogramm on a souvent besoin de redonner le contrle du CPU un autre processus. Il faut donc mmoriser toutes les informations ncessaires pour pouvoir

Cours systme dexploitation 2

Page 3

ventuellement relancer le processus courant dans le mme tat. Par exemple, il faut absolument se rappeler quelle instruction il est rendu. 4- Cration et terminaison dun processus Le systme d'exploitation fournit un ensemble d'appels systme qui permettent la cration, la destruction, la communication et la synchronisation des processus. Les processus sont crs et dtruits dynamiquement. Un processus peut crer un ou plusieurs processus fils qui, leur tour, peuvent crer des processus fils sous une forme de structure arborescente. Le processus crateur est appel processus pre. Dans certains systmes, comme MS-DOS, lorsqu'un processus cre un fils, l'excution du processus pre est suspendue jusqu' la terminaison du processus fils. C'est ce qu'on appelle l'excution squentielle. Par contre dans les systmes du type Unix, le pre continue s'excuter en concurrence avec ses fils. C'est ce qu'on appelle excution asynchrone. Un processus fils cr peut partager certaines ressources comme la mmoire ou les fichiers avec son processus pre ou avoir ses propres ressources. Le processus pre peut contrler l'usage des ressources partages et peut avoir une certaine autorit sur ses processus fils. galement, il peut suspendre ou dtruire ses processus fils. Il peut galement se mettre en attente de la fin de l'excution de ses fils. L'espace d'adressage du processus fils est obtenu par duplication de celui du pre. Il peut excuter le mme programme que son pre ou charger un autre programme. Un processus se termine par une demande d'arrt volontaire (appel systme exit()) ou par un arrt forc provoqu par un autre processus (appel systme kill()). Lorsqu'un processus se termine toutes les ressources systmes qui lui ont t alloues sont libres par le systme d'exploitation. II- Les processus sous Unix 1- Cration de processus avec fork() Dans le cas d'Unix, l'appel systme fork() permet de crer des processus fils :
#include <unistd.h> int fork();

fork() est le moyen de crer des processus par duplication d'un processus existant. L'appel systme fork() cre une copie exacte du processus original, comme illustr la figure 5 Mais maintenant il se pose un problme, car les deux processus pre et fils excutent le mme code. Cours systme dexploitation 2 Page 4

Comment distinguer alors le processus pre du processus fils ? Pour rsoudre ce problme, on regarde la valeur de retour de fork(), qui peut tre : 0 pour le processus fils Strictement positive pour le processus pre et qui correspond au pid du processus fils Ngative si la cration de processus a chou, s'il n'y a pas suffisamment d'espace mmoire ou si bien le nombre maximal de crations autorises est atteint. Ce branchement est montr la figure 3. Le pre et le fils ont chacun leur propre image mmoire prive. Aprs l'appel systme fork(), la valeur de i reoit la valeur 0 dans le processus fils mais elle est gale l'identifiant du processus fils (pid) dans le processus pre.

Figure 3 : Processus pre et son fils clon : i=27 aprs l'appel fork() pour le pre et i=0 pour le fils. L'image mmoire est la mme pour tous les deux, notamment le compteur ordinal co.

Cours systme dexploitation 2

Page 5

Figure 4 : cration de processus avec fork().

2- Les appels systme wait(), waitpid() et exit() Ces appels systme permettent au processus pre d'attendre la fin d'un de ses processus fils et de rcuprer son status de fin. Ainsi, un processus peut synchroniser son excution avec la fin de son processus fils en excutant l'appel systme wait(). La syntaxe de l'appel systme est : pid = wait(status) : o pid est l'identifiant du processus fils et status est l'adresse dans l'espace utilisateur d'un entier qui contiendra le status de exit() du processus fils . #include <sys/wait.h> int wait (int *status); int waitpid(int pid, int *status, int options); void exit(int return_code); wait() : Permet un processus pre d'attendre jusqu' ce qu'un processus fils termine. Il retourne l'identifiant du processus fils et son tat de terminaison dans &status. waitpid() : Permet un processus pre d'attendre jusqu' ce que le processus fils numro pid termine. Il retourne l'identifiant du processus fils et son tat de terminaison dans &status. void exit() : Permet de finir volontairement l'excution d'un processus et donne son tat de terminaison. Il faut souligner qu'un processus peut se terminer aussi Cours systme dexploitation 2 Page 6

par un arrt forc provoqu par un autre processus avec l'envoi d'un signal du type kill(). 3- Processus zombie et processus orphelin L'excution asynchrone entre processus pre et fils a certaines consquences. Souvent, le fils d'un processus se termine, mais son pre ne l'attend pas. Le processus fils devient alors un processus zombie, comme illustr la figure 5. Le processus fils existe toujours dans la table des processus, mais il n'utilise plus les ressources.

Figure 5 : Processus zombie : le fils meurt et le pre n'a pas fait wait().

L'excution de l'appel systme wait() ou waitpid() par le processus pre limine le fils de la table des processus. Il peut y avoir aussi des terminaisons prmatures, o le processus parent se termine avant ses processus fils (figure 6). Dans cette situation, ses processus fils sont adopts par le processus INIT dont le pid = 1.

Figure 6 : Processus orphelin : le pre meurt avant le fils, INIT adopte l'enfant.

Cours systme dexploitation 2

Page 7

4- La famille des appels systme exec Un processus fils cr peut remplacer son code de programme par un autre programme. Le systme Unix offre une famille d'appels systme exec qui permettent de changer l'image d'un processus (figure 7). Tous les appels systme exec remplacent le processus courant par un nouveau processus construit partir d'un fichier ordinaire excutable. Les segments de texte et de donnes du processus sont remplacs par ceux du fichier excutable.

Figure 7 : famille des appels exec.

#include <unistd.h> int execl(const char *path, const char *argv, ...); int execv(const char *path, const char *argv[]); int execle(const char *path, const char *argv, const char *envp[]); int execlp(const char *file, const char *argv, ...); int execvp(const char *file, const char *argv[]);

Cours systme dexploitation 2

Page 8

execl() : permet de passer un nombre fix de paramtres au nouveau programme. execv() : permet de passer un nombre libre de paramtres au nouveau programme. execle() : mme fonctionnement qu'execl() avec en plus, un argument envp qui reprsente un pointeur sur un tableau de pointeurs sur des chanes de caractres dfinissant l'environnement. exelp() : Interface et action identiques celles d'execl(), mais la diffrence vient du fait que si le nom du fichier n'est pas un nom complet . par rapport la racine . le systme utilisera le chemin de recherche des commandes . les chemins indiqus par la variable PATH pour trouver dans quel rpertoire se trouve le programme.

exevp() : Interface et action identiques celles d'execv(), mais la diffrence vient du fait que si le nom de fichier n'est pas un nom complet, la commande utilise les rpertoires spcifis dans PATH.

La convention Unix veut que chaque chane ait la forme nom=valeur. Ainsi, les arguments pour execv() peuvent tre passs, par exemple : char *arguments[4] ... arguments[0]="/bin/ls"; arguments[1]="-l"; arguments[2]="/etc"; arguments[3]="NULL"; execv("/bin/ls", arguments); ... Aprs l'excution d'un appel systme de la famille exec(), l'image mmoire d'un processus est crase par la nouvelle image mmoire d'un programme excutable, mais le pid ne change pas. Le contenu du contexte utilisateur qui existait avant l'appel exec() n'est plus accessible. Ces fonctions rendent -1 en cas dchec.

Cours systme dexploitation 2

Page 9

III- Les processus lgers : les threads 1- Introduction Le modle de processus est un programme qui s'excute selon un chemin unique avec un seul compteur ordinal. On dit qu'il a un flot de contrle unique ou un seul thread. De nombreux systmes d'exploitation modernes offrent la possibilit d'associer un mme processus plusieurs chemins d'excution ou multithread (figure 8). Ils permettent ainsi l'excution simultane des parties d'un mme processus. Chaque partie correspond un chemin d'excution du processus. Le processus est vu comme tant un ensemble de ressources (code excutable, segments de donnes, de fichiers, de priphriques, etc.) que ces parties appeles flot de contrle ou processus lgers (threads en anglais) les partagent. Chaque flot de contrle (thread) a cependant, en plus des ressources communes, sa propre zone de donnes ou de variables locales, sa propre pile d'excution, ses propres registres et son propre compteur ordinal.

Figure 8 : Threads vs. Processus.

1- Avantages Comparativement aux processus un flot de contrle unique, un thread ou processus lger avec plusieurs flots de contrle prsente plusieurs avantages, notamment : Ractivit : Le processus lger continue s'excuter mme si certaines de ses parties sont bloques. Cours systme dexploitation 2 Page 10

Partage de ressources. conomie d'espace mmoire et de temps : Par exemple sous Solaris, la cration d'un processus est 30 fois plus lente que celle d'un processus thread. le paralllisme de traitement : trs bien adapts au paralllisme. Ils peuvent sexcuter simultanment sur des machines multiprocesseurs.

2- Threads utilisateur et noyau La majorit des systmes permettent le multi-flot (multithreading). Ils sont offerts soit au niveau utilisateur, soit au niveau noyau. Les threads utilisateur sont supports au-dessus du noyau et sont implants par une bibliothque de threads au niveau utilisateur (par exemple pthread sous Linux ou thread dans Solaris). Ils sont portables sur diffrentes plateformes. Ils sont grs par une application o le blocage du thread peut bloquer le processus complet. Le changement de contexte est rapide. Les threads noyau sont directement supports par le noyau du systme d'exploitation. Le systme d'exploitation se charge de leur gestion et le changement de contexte est lent. 3- Les threads sous Unix Linux ne fait pas de distinction entre les processus et les threads. Un thread est un processus qui partage un certain nombre de ressources avec le processus crateur : l'espace d'adressage, les fichiers ouverts ou autres. Pour la gestion Posix de threads, Linux utilise la bibliothque pthread, qui doit tre appele par l'diteur de liens. a- Cration de threads

int pthread_create (pthread_t *thread , pthread_attr_t *attr, void *nomfonction, void *arg );
Le service pthread_create() cre un processus lger qui excute la fonction nomfonction avec l'argument arg et les attributs attr. Les attributs permettent de spcifier la taille de la pile, la priorit, la politique de planification, etc. Il y a plusieurs formes de modification des attributs. b- Suspension de threads

int pthread_join(pthread_t *thid, void **valeur_de_retour);


Cours systme dexploitation 2 Page 11

pthread_join() suspend l'excution d'un processus lger jusqu' ce que le processus lger avec l'identificateur thid termine. Il retourne l'tat de terminaison du processus lger. c- Terminaison de threads

void pthread_exit(void *valeur_de_retour);


pthread_exit() permet un processus lger de terminer son excution, en retournant l'tat de terminaison.

Cours systme dexploitation 2

Page 12

Synchronisation des processus


Dans un systme d'exploitation multiprogramm en temps partag, plusieurs processus s'excutent en pseudo-parallle ou en parallle et partagent des objets (mmoires, imprimantes, etc.). Le partage d'objets sans prcaution particulire peut conduire des rsultats imprvisibles. La solution au problme s'appelle synchronisation des processus.

I- Introduction
Considrons par exemple une application bancaire Les oprations sont : versement dargent: account = account + val retrait dargent: account = account val

account = account + val : load(register1, account) add (register1, val) store (account, register1)

account = account montant : val= (-montant) load(register2 , account) add(register2 , val) store(account , register2)

Si les oprations crdit et dbit sont excutes par des processus concurrents, les instructions en langage machine peuvent tre entrelaces. Lentrelacement dpend de lordonnancement des processus (scheduling). Cours systme dexploitation 2 Page 13

Les oprations suivantes : account = account + val; account = account - val; doivent tre excutes en exclusion mutuelle Sections critiques Section critique : Ensemble de suites d'instructions qui oprent sur un ou plusieurs objets critiques et qui peuvent produire des rsultats imprvisibles lorsqu'elles sont excutes simultanment par des processus diffrents. Lexcution de deux SC appartenant des ensembles diffrents et ne partagent pas de variables ne pose aucun problme Les SC doivent tre excuts en Exclusion Mutuelle : une SC ne peut tre commence que si aucune autre SC du mme ensemble nest en cours dexcution; Avant dexcuter une SC, un processus doit sassurer quaucun autre processus nest en train dexcuter une SC du mme ensemble. Dans le cas contraire, il ne devra pas progresser, tant que lautre processus naura pas termin sa SC; Ncessit de dfinir un protocole dentre en SC et un protocole de sortie de SC Protocole d entre en SC: ensemble d instructions qui permet cette vrification et la non progression ventuelle; Protocole de sortie de SC: ensemble dinstructions qui permet un processus ayant termin sa SC davertir dautres processus en attente que la voie est libre Dbut Section non Critique Cours systme dexploitation 2 Page 14

protocole d entre SC protocole de sortie Section non critique Fin. Pour assurer alors une coopration correcte et efficace entre les processus on distingue deux types de solutions : Solutions matrielle ou solution logicielle. Dans ce chapitre on va voir masquage des interruptions(solution matrielle ) et les smaphores (solution logicielle). II- Masquage des interruptions Avant d'entrer dans une section critique, le processus masque les interruptions. Il les restaure la fin de la section critique. Il ne peut tre alors suspendu durant l'excution de la section critique. Cependant cette solution est dangereuse, car si le processus, pour une raison ou pour une autre, ne restaure pas les interruptions la sortie de la section critique, ce serait la fin du systme. La solution n'assure pas l'exclusion mutuelle, si le systme n'est pas monoprocesseur car le masquage des interruptions concernera uniquement le processeur qui a demand l'interdiction. Les autres processus excuts par un autre processeur pourront donc accder aux objets partags. III- Exclusion mutuelle par attente active 1- Les variables de verrouillage Une autre tentative pour assurer l'exclusion mutuelle est d'utiliser une variable de verrouillage partage verrou, unique, initialise 0. Pour rentrer en section critique (voir algorithme de verrouillage), un processus doit tester la valeur du verrou. Si elle est gale 0, le processus modifie la valeur du verrou (verrou 1) et excute sa section critique. la fin de la section critique, il remet le verrou 0. Sinon, il attend (par une attente active) que le verrou devienne gal 0, c'est--dire : while(verrou!=0);

Cours systme dexploitation 2

Page 15

Algorithme verrouillage Algorithm 1 Verrouillage While( verrou !=0) do ; // Attente active end while verrou1 Section_critique() ; verrou0 Problmes Cette mthode n'assure pas l'exclusion mutuelle : Supposons qu'un processus est suspendu juste aprs avoir lu la valeur du verrou qui est gal 0. Ensuite, un autre processus est lu. Ce dernier teste le verrou qui est toujours gal 0, met verrou 1 et entre dans sa section critique. Ce processus est suspendu avant de quitter la section critique. Le premier processus est alors ractiv, il entre dans sa section critique et met le verrou 1. Les deux processus sont en mme temps en section critique. Ainsi cet algorithme n'est pas correct. On voit ainsi qu'il est indispensable dans l'nonc du problme de prciser quelles sont les actions atomiques, c'est--dire celles qui sont non divisibles. Si on possde sous forme hardware une instruction test and set qui sans tre interrompue lit une variable, vrifie si elle est gale 0 et dans ce cas transforme sa valeur en 1, alors il est facile de rsoudre le problme de l'exclusion mutuelle en utilisant un verrou. Toutefois on n'a pas toujours disponible ce type d'instruction, et il faut alors trouver une solution logicielle. 2- L'alternance Une autre proposition consiste utiliser une variable tour qui mmorise le tour du processus qui doit entrer en section critique. tour est initialise 0. // Processus P1 while (1) { // attente active while (tour !=0) ; Section_critique() ; tour = 1 ; Section_noncritique() ; ... Cours systme dexploitation 2 Page 16

} // Processus P2 while (1) { // attente active while (tour !=1) ; Section_critique() ; tour = 0 ; Section_noncritique() ; ... } Supposons maintenant que le processus P1 lit la valeur de tour qui vaut 0 et entre dans sa section critique. Il est suspendu et P2 est excut. P2 teste la valeur de tour qui est toujours gale 0. Il entre donc dans une boucle en attendant que tour prenne la valeur 1. Il est suspendu et P1 est lu de nouveau. P1 quitte sa section critique, met tour 1 et entame sa section non critique. Il est suspendu et P2 est excut. P2 excute rapidement sa section critique, tour = 0 et sa section non critique. Il teste tour qui vaut 0. Il attend que tour prenne la valeur 1. Problme : On peut vrifier assez facilement que deux processus ne peuvent entrer en section critique en mme temps, toutefois le problme n'est pas vraiment rsolu car il est possible qu'un des deux processus ait plus souvent besoin d'entrer en section critique que l'autre ; l'algorithme lui fera attendre son tour bien que la section critique ne soit pas utilise. Un processus peut tre bloqu par un processus qui n'est pas en section critique. 3- Solution de Peterson La solution de Peterson se base sur l'utilisation de deux fonctions : entrer_region(); quitter_region(); Chaque processus doit, avant d'entrer dans sa section critique appeler la fonction entrer_region() en lui fournissant en paramtre son numro de processus. Cet appel le fera attendre si ncessaire jusqu' ce qu'il n'y ait plus de risque. A la fin de la section critique, le processus doit appeler quitter_region() pour indiquer qu'il quitte sa section critique et pour autoriser l'accs aux autres processus.

Cours systme dexploitation 2

Page 17

4- L'instruction TSL Les ordinateurs multiprocesseurs ont une instruction atomique indivisible appele TSL (Test and Set Lock). L'instruction TSL excute en un seul cycle, de manire indivisible, le chargement d'un mot mmoire dans un registre et le rangement d'une valeur non nulle l'adresse du mot charg. Lorsqu'un processeur excute l'instruction TSL, il verrouille le bus de donnes pour empcher les autres processeurs d'accder la mmoire pendant la dure de l'opration. Cette instruction peut tre utilise pour tablir et supprimer des verrous (assurer l'exclusion mutuelle). 5- Commentaires sur l'attente active L'attente active se traduit dans une consommation du temps UCT, et un processus en attente active peut rester en permanence dans une boucle infinie. Par exemple, supposons que : Deux processus H et B, tels que H est plus prioritaire que B partagent un objet commun. Les rgles d'ordonnancement font que H sera excut ds qu'il se trouve dans l'tat prt. Pendant que H tait en E/S, le processus B est entr dans sa section critique. Le processus H est redevenu prt avant que B ait quitt sa section critique. Le processus B est ensuite suspendu et le processus H est lu. H effectue alors une attente active et B ne peut tre slectionn puisque H est plus prioritaire. Conclusion ? Le processus B ne peut plus sortir de sa section critique et H boucle indfiniment. Une dernire question est de vrifier qu'il y a un minimum d'quit entre les deux processus, c'est--dire que l'un d'entre eux ne peut pas attendre indfiniment son tour d'accs la section critique alors que l'autre y accde un nombre infini de fois. Cette question est plus difficile, de mme que la gnralisation de la solution un nombre quelconque de processus. IV- Primitives SLEEP et WAKEUP SLEEP() est un appel systme qui suspend l'appelant en attendant qu'un autre le rveille. WAKEUP(processus) est un appel systme qui rveille un processus. Par exemple, un processus Cours systme dexploitation 2 Page 18

H qui veut entrer dans sa section critique est suspendu si un autre processus B est dj dans sa section critique. Le processus H sera rveill par le processus B, lorsqu'il quitte la section critique. Problme : Si les tests et les mises jour des conditions d'entre en section critique ne sont pas excuts en exclusion mutuelle, des problmes peuvent survenir. Si le signal mis par WAKEUP() arrive avant que le destinataire ne soit endormi, le processus peut dormir pour toujours. V- Les smaphores Pour contrler les accs un objet partag, E. W. Dijkstra suggra en 1965 l'emploi d'un nouveau type de variables appeles les smaphores. Un smaphore est un compteur entier qui dsigne le nombre d'autorisations d'accs une section critique. Il a donc un nom et une valeur initiale, par exemple semaphore S = 10. Les smaphores sont manipuls au moyen des oprations P ou wait et V ou signal. L'opration P(S) dcrmente la valeur du smaphore S si cette dernire est suprieure 0. Sinon le processus appelant est mis en attente. Le test du smaphore, le changement de sa valeur et la mise en attente ventuelle sont effectus en une seule opration atomique indivisible. L'opration V(S) incrmente la valeur du smaphore S, si aucun processus n'est bloqu par l'opration P(S). Sinon, l'un d'entre eux sera choisi et redeviendra prt. V est aussi une opration indivisible. P (sma) correspond donc une prise de ressource et V (sma) une libration de ressource. Les smaphores permettent de raliser des exclusions mutuelles, comme illustr la figure 1.

FIG. 1 : Exclusion mutuelle avec des smaphores.

Cours systme dexploitation 2

Page 19

La figure 2 montre l'exclusion mutuelle d'une petite section critique a++.

FIG. 2 : Exclusion mutuelle d'une section critique compose d'une variable a.

1- Services Posix sur les smaphores Le systme d'exploitation Linux permet de crer et d'utiliser les smaphores dfinis par le standard Posix. Les services Posix de manipulation des smaphores se trouvent dans la librairie <semaphore.h>. Le type smaphore est dsign par le type sem_t. int sem_init(sem_t *sem, int pshared, unsigned int valeur)

Initialisation d'un smaphore sem est un pointeur sur le smaphore initialiser ; valeur est la valeur initiale du smaphore ; pshared indique si le smaphore est local au processus pshared=0 ou partag entre le pre et le fils pshared0. Actuellement Linux ne supporte pas les smaphores partags. int sem_wait(sem_t *sem) est quivalente l'opration P : retourne toujours 0. int sem_post(sem_t *sem) est quivalente l'opration V : retourne 0 en cas de succs ou -1 autrement. int sem_getvalue (sem_t* nom, int * sval); rcuprer la valeur d'un smaphore : il retourne toujours 0.

int sem_destroy (sem_t* nom) ; dtruire un smaphore. Retourne -1 s'il y a encore des waits. 2- Problme du producteur et du consommateur Dans le problme du producteur et du consommateur deux processus partagent une mmoire tampon de taille fixe. L'un d'entre eux, le producteur, met des informations dans la mmoire tampon, et l'autre, les retire. Le producteur peut produire uniquement si le tampon n'est pas Cours systme dexploitation 2 Page 20

plein. Le producteur doit tre bloqu tant et aussi longtemps que le tampon est plein. Le consommateur peut retirer un objet du tampon uniquement si le tampon n'est pas vide. Le consommateur doit tre bloqu tant et aussi longtemps que le tampon est vide. Les processus producteur et consommateur doivent accder de manire exclusive au tampon, le temps dune lecture ou dune criture. Un smaphore dexclusion mutuelle est donc ncessaire. Dautre part, on peut considrer que les ressources du processus producteur sont les emplacements vides du tampon, alors que les emplacements pleins sont les ressources du processus consommateur. Au dpart, le tampon tant vide, les ressources de consommation sont nulles, alors que les ressources de production correspondent la taille du tampon. On obtient le programme suivant : #define N 100 sma mutex = 1; /* taille du tampon */ /* sma dexclusion mutuelle. */

sma production = N; /* sma places vides */ sma consommation = 0; void consommateur() { while (true) { P(consommation); P(mutex); vider_case(); V(mutex); V(production); } } void producteur() { while (true) { P(production); P(mutex); remplir_case(); Cours systme dexploitation 2 Page 21 /* une place vide en moins */ /* section critique */ /* fin section critique */ /* une place vide en plus */ /* une place pleine en moins */ /* section critique */ /* sma places pleines */

V(mutex); V(consommation); } } 3- Problme des philosophes

/* fin section critique */ /* une place pleine en plus */

Il s'agit d'un problme thorique trs intressant propos et rsolu aussi par Dijkstra. Cinq philosophes sont assis autour d'une table. Sur la table, il y a alternativement cinq plats de spaghettis et cinq fourchettes (figure 3). Un philosophe passe son temps manger et penser. Pour manger son plat de spaghettis, un philosophe a besoin de deux fourchettes qui sont de part et d'autre de son plat. crire un programme qui permette chaque philosophe de se livrer ses activits (penser et manger) sans jamais tre bloqu.

FIG. 3 : Problme des philosophes.

Il est important de signaler que si tous les philosophes prennent en mme temps chacun une fourchette, aucun d'entre eux ne pourra prendre l'autre fourchette (situation d'interblocage). Pour viter cette situation, un philosophe ne prend jamais une seule fourchette. Les fourchettes sont les objets partags. L'accs et l'utilisation d'une fourchette doit se faire en exclusion 1mutuelle. On utilisera le smaphore mutex pour raliser l'exclusion mutuelle. Exemple 4. Une solution au problme des philosophes. N=5 fourch [N] = {1, 1, 1, 1, 1 } ; //1=libre

Cours systme dexploitation 2

Page 22

//fonction philosophe(i) G ((N+i-1)MOD N) //numro des philosophes de 0 4 //penser P (mutex) //accs en exclusion mutuelle aux fourchettes Si (fourch [G]=1 ET fourch [ i ]=1) // il y a des fourchettes libres fourch [G] = 0 fourch [ i ] = 0 V (mutex) //librer laccs aux fourchettes // manger // librer les fourchettes aprs avoir terminer de manger P(mutex) fourch [G] = 1 ; fourch [ i ] = 1 ; //le philosophe a fini de manger V (mutex ) Sinon //pas des fourchettes libre V (mutex ) //librer laccs aux fourchettes Fin si
__

Problme : Cette solution rsout le problme d'interblocage. Mais, un philosophe peut mourir de faim car il ne pourra jamais obtenir les fourchettes ncessaires pour manger (problme de famine et d'quit). Pour viter le problme de famine il faut garantir que si un processus demande d'entrer en section critique, il obtient satisfaction au bout d'un temps fini. Dans le cas des philosophes, le problme de famine peut tre vit, en ajoutant N smaphores (un smaphore pour chaque philosophe). Les smaphores sont initialiss 0. Lorsqu'un philosophe i ne parvient pas prendre les fourchettes, il se met en attente (P(S[i]). Lorsqu'un philosophe termine de manger, il vrifie si ses

Cours systme dexploitation 2

Page 23

voisins sont en attente. Si c'est le cas, il rveille les voisins qui peuvent manger en appelant l'opration V. On distingue trois tats pour les philosophes : penser, manger et faim. 4- Problme des rdacteurs et des lecteurs Ce problme modlise les accs une base de donnes. Un ensemble de processus tente constamment d'accder la base de donnes soit pour crire, soit pour lire des informations. Pour assurer une certaine cohrence des donnes de la base, il faut interdire l'accs (en lecture et en criture) tous les processus, si un processus est en train de modifier la base (accde la base en mode criture). Par contre, plusieurs processus peuvent accder la base, en mme temps, en mode lecture. Les rdacteurs reprsentent les processus qui demandent des accs en criture la base de donnes. Les lecteurs reprsentent les processus qui demandent des accs en lecture la base de donnes (figure 4). Pour contrler les accs la base, on a besoin de connatre le nombre de lecteurs (NbL) qui sont en train de lire. Le compteur NbL est un objet partag par tous les lecteurs. L'accs ce compteur doit tre exclusif (smaphore mutex). Un lecteur peut accder la base, s'il y a dj un lecteur qui accde la base (NbL>0) ou aucun rdacteur n'est en train d'utiliser la base. Un rdacteur peut accder la base, si elle n'est pas utilise par les autres (un accs exclusif la base). Pour assurer cet accs exclusif, on utilise un autre smaphore : Redact.

FIG. 4 : Problme des lecteurs et crivains.

Des algorithmes adquats pour le lecteur() et le redacteur() sont les suivants : NbL_0 // Nb Lecteurs semaphore Redact // crivain semaphore Mutex // accs la base Cours systme dexploitation 2 Page 24

//lecteur :
repeat P(Mutex) if (NbL == 0) then P(Redact) // Premier lecteur empche criture end if NbLNbL + 1 V(Mutex) // lecture de la base // fin de l'accs la base P(Mutex) NbLNbL - 1 if (NbL == 0) then V(Redact) // Dernier lecteur habilite l'criture end if V(Mutex) until TRUE

//redacteur :
repeat P(Redact) // Modifier les donnes de la base V(Redact) until TRUE

Cours systme dexploitation 2

Page 25

VI- Interblocages 1- Les processus et les ressources L'excution d'un processus ncessite un ensemble de ressources (mmoire principale, disques, fichiers, priphriques, etc.) qui lui sont attribues par le systme d'exploitation. L'utilisation d'une ressource passe par les tapes suivantes : Demande de la ressource : Si l'on ne peut pas satisfaire la demande il faut attendre. La demande sera mise dans une table d'attente des ressources. Utilisation de la ressource : Le processus peut utiliser la ressource. Libration de la ressource : Le processus libre la ressource demande.

Lorsqu'un processus demande un accs exclusif une ressource dj alloue un autre processus, le systme d'exploitation dcide de le mettre en attente jusqu' ce que la ressource demande devienne disponible ou lui retourner un message indiquant que la ressource n'est pas disponible : ressayer plus tard. 2- Dfinition d'un interblocage Des problmes peuvent survenir, lorsque les processus obtiennent des accs exclusifs aux ressources. Par exemple, un processus P1 dtient une ressource R1 et attend une autre ressource R2 qui est utilise par un autre processus P2; le processus P2 dtient la ressource R2 et attend la ressource R1. On a une situation d'interblocage (deadlock en anglais) car P1 attend P2 et P2 attend P1. Les deux processus vont attendre indfiniment comme montr sur la figure 5.

FIG. 5 : Situation d'interblocage de deux processus.

Cours systme dexploitation 2

Page 26

En gnral, un ensemble de processus est en interblocage si chaque processus attend la libration d'une ressource qui est alloue un autre processus de l'ensemble. Comme tous les processus sont en attente, aucun ne pourra s'excuter et donc librer les ressources demandes par les autres. Ils attendront tous indfiniment. 3- Exemples dinterblocages : Accs aux priphriques. Supposons que deux processus A et B veulent imprimer, en utilisant la mme imprimante, un fichier stock sur une bande magntique. La taille de ce fichier est suprieure la capacit du disque. Chaque processus a besoin d'un accs exclusif au drouleur et l'imprimante simultanment. On a une situation d'interblocage si : Le processus A utilise l'imprimante et demande l'accs au drouleur. Le processus B dtient le drouleur de bande et demande l'imprimante.

Accs une base de donnes. Supposons deux processus A et B qui demandent des accs exclusifs aux enregistrements d'une base de donnes. On arrive une situation d'interblocage si : Le processus A a verrouill l'enregistrement R1 et demande l'accs l'enregistrement R2 Le processus B a verrouill l'enregistrement R2 et demande l'accs l'enregistrement R1 Circulation routire. Considrons deux routes double sens qui se croisent comme dans la figure 6, o la circulation est impossible. Un problme d'interblocage y est prsent.

FIG. 6 : Problme de circulation routire.

Cours systme dexploitation 2

Page 27

4- Conditions ncessaires pour l'interblocage Pour qu'une situation d'interblocage ait lieu, les quatre conditions suivantes doivent tre remplies (Conditions de Coffman) : L'exclusion mutuelle. A un instant prcis, une ressource est alloue un seul processus. La dtention et l'attente. Les processus qui dtiennent des ressources peuvent en demander d'autres. Pas de premption. Les ressources alloues un processus sont libres uniquement par le processus. L'attente circulaire. Il existe une chane de deux ou plus processus de telle manire que chaque processus dans la chane requiert une ressource alloue au processus suivant dans la chane. Par exemple, dans le problme de circulation de la figure 6 le trafic est impossible. On observe que les quatre conditions d'interblocage sont bien remplies : Exclusion mutuelle : Seulement une voiture occupe un endroit particulier e la route un instant donn. Dtention et attente : Aucun voiture ne peut faire marche arrire. Pas de premption : On ne permet pas une voiture de pousser une autre voiture en dehors de la route. Attente circulaire : Chaque coin de la rue contient des voitures dont le mouvement dpend des voitures qui bloquent la prochaine intersection.

Cours systme dexploitation 2

Page 28

5- Traitement des interblocages On distingue quatre approches pour rsoudre le problme : Ignorer compltement les problmes : On peut faire l'autruche et ignorer les possibilits d'interblocages. Cette stratgie est celle de la plupart des systmes d'exploitation courants car le prix payer pour les viter est lev. La dtection et La reprise des interblocages : On tente de traiter les interblocages, en dtectant les processus inter-bloqus et en les liminant. Lorsque le systme dtecte un interblocage, il doit le supprimer, ce qui se traduit gnralement par la ralisation de l'une des oprations suivantes : Retirer temporairement une ressource un processus pour l'attribuer un autre. Restaurer un tat antrieur (retour en arrire) et viter de retomber dans la mme situation. Supprimer un ou plusieurs processus.

L'vitement des interblocages : En allouant dynamiquement les ressources avec prcaution. Le systme d'exploitation peut suspendre le processus qui demande une allocation de ressource s'il constate que cette allocation peut conduire un interblocage. Il lui attribuera la ressource lorsqu'il n'y aura plus de risque. La prvention des interblocages : En empchant l'apparition de l'une des quatre conditions de leur existence.

Cours systme dexploitation 2

Page 29

Communication entre les processus


Les processus cooprent souvent pour traiter un mme problme. Ces processus s'excutent en parallle sur un mme ordinateur (monoprocesseur ou multiprocesseurs) ou bien sur des ordinateurs diffrents. Ils doivent alors s'changer des informations (communication interprocessus). Il existe plusieurs moyens de communication interprocessus. Nous pouvons citer, entre autres, les variables communes, les fichiers communs, les signaux, les messages, les tubes de communication, les sockets et la mmoire partage.

I- Les signaux Les interruptions logicielles ou signaux sont utilises par le systme d'exploitation pour aviser les processus utilisateurs de l'occurrence d'un vnement important. De nombreuses erreurs dtectes par le matriel, comme l'excution d'une instruction non autorise (une division par 0, par exemple) ou l'emploi d'une adresse non valide, sont converties en signaux qui sont envoys au processus fautif. Ce mcanisme permet un processus de ragir cet vnement sans tre oblig d'en tester en permanence l'arrive. Le principe est a priori simple : un processus peut envoyer sous certaines conditions un signal un autre processus (ou lui-mme). Un signal peut tre imagin comme une sorte dimpulsion qui oblige le processus cible prendre immdiatement (aux dlais dus lordonnancement prs) une mesure spcifique. Le destinataire peut soit ignorer le signal, soit le capturer (cest--dire drouter provisoirement son excution vers une routine particulire quon nomme gestionnaire de signaux), soit laisser le systme traiter le signal avec un comportement par dfaut. Tous les signaux ont une routine de service, ou une action par dfaut. Cette action peut tre du type : A : terminaison du processus Page 30

Cours systme dexploitation 2

B : ignorer le signal C : Crer un fichier core D : Stopper le processus E : La procdure de service ne peut pas tre modifie F : Le signal ne peut pas tre ignor

Chaque signal est identifi au moyen d'un numro entier positif. Le tableau 1 dcrit les signaux les plus importants.

Tableau 1 : Quelques signaux Unix.

Dans le cas du systme Unix/Linux, un processus utilisateur peut galement envoyer un signal un autre processus. Les deux processus appartiennent au mme propritaire, ou bien le processus metteur du signal est le super-utilisateur. Les services Posix de gestion des signaux utilisent la bibliothque <signal.h>. II- Tubes de communication Les tubes de communication ou pipes permettent deux ou plusieurs processus d'changer des informations. On distingue deux types de tubes : les tubes sans nom (unamed pipe ) et les tubes nomms (named pipe ). Les tubes sont des liaisons unidirectionnelles de communication. La communication bidirectionnelle entre processus est possible en utilisant deux tubes : un pour chaque sens de communication. 1- Tubes sans nom

Cours systme dexploitation 2

Page 31

La taille maximale d'un tube sans nom varie d'une version une autre d'Unix, mais elle est approximativement gale 4 Ko. Les tubes sans nom peuvent tre crs par le shell ou par l'appel systme pipe(). Les tubes sans nom du shell sont crs par l'oprateur binaire | qui dirige la sortie standard d'un processus vers l'entre standard d'un autre processus. Les tubes de communication du shell sont supports par toutes les versions d'Unix. Exemple : La commande shell : who | wc l cre deux processus qui s'excutent en parallle et qui sont relis par un tube de communication pipe (figure 1). Elle dtermine le nombre d'utilisateurs connects au systme en appelant who, puis en comptant les lignes avec wc :

FIG. 1 : Processus en parallle relis par un tube de communication.

Le premier processus ralise la commande who. Le second processus excute la commande wc -l. Les rsultats rcuprs sur la sortie standard du premier processus sont dirigs vers l'entre standard du deuxime processus via le tube de communication qui les relie. Le processus ralisant la commande who ajoute dans le tube une ligne d'information par utilisateur du systme. Le processus ralisant la commande wc -l rcupre ces lignes d'information pour en calculer le nombre total. Le rsultat est affich l'cran. Les deux processus s'excutent en parallle, les sorties du premier processus sont stockes sur le tube de communication. Lorsque le tube devient plein, le premier processus est suspendu jusqu' ce qu'il y ait libration de l'espace ncessaire pour stocker une ligne d'information. De faon similaire, lorsque le tube devient vide, le second processus est suspendu jusqu' ce qu'il y ait au moins une ligne d'information sur le tube. Cration d'un tube sans nom Un tube de communication sans nom est cr par l'appel systme pipe, auquel on passe un tableau de deux entiers : int pipe(int descripteur[2]);

Cours systme dexploitation 2

Page 32

Au retour de l'appel systme pipe(), un tube aura t cr, et les deux positions du tableau pass en paramtre contiennent deux descripteurs de fichiers. Dans le cas du tube on a besoin de deux descripteurs : le descripteur pour les lectures du tube et le descripteur pour les critures dans le tube. L'accs au tube se fait via les descripteurs. Le descripteur de l'accs en lecture se retrouvera la position 0 du tableau pass en paramtre, alors que le descripteur de l'accs en criture se retrouvera la position 1. Seul le processus crateur du tube et ses descendants (ses fils) peuvent accder au tube. Si le systme ne peut pas crer de tube pour manque d'espace, l'appel systme pipe() retourne la valeur -1, sinon il retourne la valeur 0. Exemple : Les dclarations suivantes crent le tube montr sur la figure 2 : int fd[2]; pipe(fd); Les tubes sans nom sont, en gnral, utiliss pour la communication entre un processus pre et ses processus fils, avec un d'entre eux qui crit sur le tube, appel processus crivain, et l'autre qui lit partir du tube, appel processus lecteur.

FIG. 2 : Pipe de Lecture/criture.

La squence d'vnements pour une telle communication est comme suit : Le processus pre cre un tube de communication sans nom en utilisant l'appel systme pipe() Le processus pre cre un ou plusieurs fils en utilisant l'appel systme fork() Le processus crivain ferme l'accs en lecture du tube De mme, le processus lecteur ferme l'accs en criture du tube Page 33

Cours systme dexploitation 2

Les processus communiquent en utilisant les appels systme write() et read() Chaque processus ferme son accs au tube lorsqu'il veut mettre fin la communication via le tube

2- Tubes de communication nomms Linux supporte un autre type de tubes de communication, beaucoup plus performants. Il sagit des tubes nomms (named pipes). Les tubes de communication nomms fonctionnent aussi comme des files du type FIFO (First In First Out). Ils sont plus intressants que les tubes sans nom car ils offrent, en plus, les avantages suivants : Ils ont chacun un nom qui existe dans le systme de fichiers (une entre dans la Table des fichiers). Ils sont considrs comme des fichiers spciaux. Ils peuvent tre utiliss par des processus indpendants, condition qu'ils s'excutent sur une mme machine. Ils existeront jusqu' ce qu'ils soient supprims explicitement. Ils sont de capacit plus grande, d'environ 40 Ko.

Ainsi, deux processus sans relation parent-enfant peuvent changer des donnes au moyen des tubes nomms. Les tubes de communication nomms sont crs par la commande shell mkfifo ou par l'appel systme mkfifo() : III- Les messages Les messages forment un mode de communication privilgi entre les processus. Ils sont utiliss dans le systme pdagogique Minix de Tanenbaum. Ils sont au cur de Mach quon prsente comme un successeur possible dUnix et qui a inspir Windows NT pour certaines parties. Par ailleurs, ils sadaptent trs bien une architecture rpartie et leur mode de fonctionnement est voisin des changes de donnes sur un rseau. Les communications de messages se font travers deux oprations fondamentales : envoie(message) et reois(message). (send et receive). Les messages sont de tailles variables ou Cours systme dexploitation 2 Page 34

fixes. Les oprations denvoi et de rception peuvent tre soit directes entre les processus, soit indirectes par lintermdiaire dune bote aux lettres. Les communications directes doivent identifier le processus, par un n et une machine, par exemple. On aura alors : envoie(Proc, Message) et reois(Proc, Message). Dans ce cas la communication est tablie entre deux processus uniquement, par un lien relativement rigide et bidirectionnel. On peut rendre les liaisons plus souples en laissant vide lidentit du processus dans la fonction reois. Les communications peuvent tre indirectes grce lutilisation dune bote aux lettres (un port dans la terminologie des rseaux). Les liens peuvent alors unir plus de deux processus du moment quils partagent la mme bote aux lettres. On devra nanmoins rsoudre un certain nombre de problmes qui peuvent se poser, par exemple, si deux processus essayent de recevoir simultanment le contenu dune mme bote. Les communications se font de manire synchrone ou asynchrone. Le synchronisme peut se reprsenter par la capacit dun tampon de rception. Si le tampon na pas de capacit, lmetteur doit attendre que le rcepteur lise le message pour pouvoir continuer. Les deux processus se synchronisent sur ce transfert et on parle alors dun rendez-vous . Deux processus asynchrones : P et Q, peuvent aussi communiquer de cette manire en mettant en uvre un mcanisme dacquittement :
P envoie(Q, message) reois(Q, message) Q reois(P, message) envoie(P, acquittement)

Tableau 2 : Les fonctions de messages.

IV- La mmoire partage On peut concevoir des applications qui communiquent travers un segment de mmoire partage. Le principe est le mme que pour un change dinformations entre deux processus par un fichier. Dans le cas dune zone de mmoire partage, on devra dclarer une zone com mune par une fonction spcifique, car la zone mmoire dun processus est protge.

Cours systme dexploitation 2

Page 35

Le systme Unix fournit les primitives permettant de partager la mmoire. NT aussi sous le nom de fichiers mapps en mmoire. Ces mcanismes, bien que trs rapides, prsentent linconvnient dtre difficilement adaptables aux rseaux. Pour les communications locales, la vitesse est sans doute semblable celle de la communication par un fichier cause de la mmoire cache. Lorsquil a besoin de partager un espace mmoire, le programmeur prfrera utiliser des threads. V- Les Sockets Les tubes de communication permettent d'tablir une communication unidirectionnelle entre deux processus d'une mme machine. Le systme Unix/Linux permet la communication entre processus s'excutant sur des machines diffrentes au moyen de sockets. Les sockets ou prises sont les mcanismes traditionnels de communication interprocessus du systme Unix. Elles permettent la communication entre processus s'excutant sur des machines diffrentes connectes par un rseau de communication. Par exemple, l'utilitaire rlogin qui permet un utilisateur d'une machine de se connecter une autre machine, est ralis au moyen de sockets. Les sockets sont galement utiliss pour imprimer un fichier se trouvant sur une autre machine et pour transfrer un fichier d'une machine autre.

Cours systme dexploitation 2

Page 36