Vous êtes sur la page 1sur 7

Chapitre 4.

4. Processus et smaphores
4.1. Introduction
Dans un systme dexploitation, il y a de nombreux processus concurrents qui dsirent accder aux ressources de lordinateur (UC, mmoire, fichiers, priphriques). Si la ressource nest pas disponible, il faut bloquer le processus jusqu ce quelle le soit. On dfinit : Processus actif Processus prt Processus bloqu Il sexcute en UC Il a toutes ses ressources sauf lUC Il lui manque une (ou plusieurs) ressource pour continuer son excution Ressource critique Un seul processus peut y accder Exclusion mutuelle 2 processus voulant accder une ressource critique sont en exclusion mutuelle : lun ou lautre, mais pas les deux

4.2. Exclusion mutuelle et smaphores


4.2.1. Dfinitions
Un smaphore est une variable accessible seulement laide des oprations P (Proberen : tester) et V (Verhogen : incrmenter) suivantes : P(S) Puis-je ? S= S1; si S < 0 alors Le processus ralisant P(S) est bloqu dans une file dattente spcifique de chaque smaphore V(S) vas-y S= S+1 si S >= 0 alors un des processus de la file dattente est dbloqu Seul P peut bloquer un processus, V nest jamais bloquant.

4.2.2. Ralisation doprations P et V avec des tubes


On peut raliser les oprations P et V laide dun tube Unix contenant des jetons. Un jeton est reprsent par un caractre quelconque. Le smaphore est initialis avec un certain

Prof. C.EL AMRANI

Programmation systme sous UNIX

Chapitre 6. Processus et smaphores

nombre de jetons. Une opration P consiste prendre un jeton (ici lire un caractre du tube read), si le tube est vide, le processus est bloqu en attente dun jeton. Une opration V consiste ajouter un jeton (ici crire un caractre dans le tube write). Ainsi on dfinit pour les exemples suivants : fonction Initsem fonction P fonction V type Semaphore cre un smaphore et linitialise avec N jetons (N caractres a) lit un caractre a du tube ou bloque le processus faisant P si le tube est vide (read est bloquant) crit un caractre a dans le tube correspond au double descripteur dun tube anonyme

tubesem.h est len-tte du module sur les smaphores : ( sauver dans /usr/include) #include<unistd.h> /* read, write */ #include<sys/types.h> /* pid_t */ #include<sys/wait.h> /* wait */ typedef int Semaphore [2] ; void Initsem(Semaphore S, int N); void P(Semaphore S); void V(Semaphore S); void attente(int N); void message(int i, char* s); tubesem.c est le corps du module sur les smaphores, constitu de smaphores avec tubes anonymes P et V : #include<stdio.h> #include<stdlib.h> #include"tubesem.h" /* initialiser le semaphore S */ void Initsem(Semaphore S, int N) { int i ; char c='a'; pipe(S); for(i=1;i<=N;i++)write(S[1],&c,1); } /* P sur le semaphore S, prendre un jeton 'a' */ void P (Semaphore S) { char c; read(S[0],&c,1); } /* V sur le semaphore S, remettre un jeton 'a' */ void V (Semaphore S)

Prof. C.EL AMRANI

Programmation systme sous UNIX

Chapitre 6. Processus et smaphores

{ char c='a'; write(S[1],&c,1); } /* Attendre un nombre aleatoire de secondes entre 0 et N-1*/ void attente(int N) { sleep(rand() % N); } /* Ecrire un message s dans la i eme colonne, la premiere colonne a le numero 1 */ void message(int i, char* s) { #define colonne 20 int Nb, j ; Nb=(i-1)*colonne; for(j=0; j<Nb; j++) putchar(' '); printf("%s\n" ,s); fflush(stdout); } Le problme de laccs en exclusion mutuelle une variable partage peut tre rsolu en initialisant un smaphore 1 (un jeton est disponible) La section critique est encadre par P et V. Si le jeton est disponible, le processus entre dans la section critique. Si le jeton est pris par un autre processus, le processus faisant P est bloqu jusqu ce que le jeton soit remis par le processus lutilisant lors de la sortie de sa section critique. S : Smaphore initialis 1 N : variable commune aux deux processus p1 et p2 processus p1 P(S) ; N=N+1; V(S) ; processus p2 P(S) ; N=N+1; V(S) ;

La variable N ne peut tre modifi que par un seul processus la fois (p1 ou p2).

4.2.3. Exemple du carrefour routier


On peut simuler la procdure que doit suivre une voiture un carrefour routier : sengager dans le carrefour si aucune voiture ny est engage, sinon attendre que le carrefour soit libre. Il y a donc exclusion mutuelle pour la traverse du carrefour.

Prof. C.EL AMRANI

Programmation systme sous UNIX

Chapitre 6. Processus et smaphores

Exclusion mutuelle dans un carrefour La simulation du carrefour routier peut se faire en utilisant le module tubesem.h , et en crant des processus voiture laide de lappel systme fork (). La fonction voiture () a pour effet de crer un nouveau processus chaque appel. tubesem.c #include<stdio.h> #include<stdlib.h> #include"tubesem.h" Semaphore C; main() { int i ; void voiture(int,int); printf("\n%20s%20s%20s\n","VOITURE 1","VOITURE 2","VOITURE 3"); Initsem(C,1); voiture(1,3); voiture(2,1); voiture(3,3); for(i=1;i<=3;i++)wait(0); } /* inclure ici les dfinitions des fonctions: Initsem, P, V, attente et message donnes plus haut */ void voiture(int n,int duree) { if(fork()==0) { attente(duree); message(n,"Arrivee"); Prof. C.EL AMRANI Programmation systme sous UNIX

Chapitre 6. Processus et smaphores

P(C); message(n,"Traversee"); attente(duree); message(n,"Depart"); V(C); exit(0); } } Rsultat : ./tubesem VOITURE 1 VOITURE 2 Arrivee Traversee Depart VOITURE 3

Arrivee Traversee Arrivee Depart Traversee Depart ./tubesem VOITURE 1 Arrivee Traversee Depart Traversee Arrivee Depart Traversee Depart Remarque : Si on veut autoriser la traverse du carrefour par deux voitures simultanment, il faut initialiser le smaphore C 2 (il contient 2 jetons). Exemple : ./tubesem (avec C initialis 2) VOITURE 1 VOITURE 2 VOITURE 3 Arrivee Traversee Arrivee Traversee Depart Arrivee Traversee Depart Depart Prof. C.EL AMRANI Programmation systme sous UNIX

VOITURE 2

VOITURE 3

Arrivee

Chapitre 6. Processus et smaphores

4.3.3. Exemple du producteur-consommateur


Un exemple courant de synchronisation entre processus concerne la communication de donnes dans une zone de mmoire partage. Un mme zone de mmoire est accessible par deux processus, lun fournit les valeurs (processus producteur), et lautre les utilise (processus consommateur). Les deux processus doivent se synchroniser. Le consommateur ne peut pas exploiter la valeur si celle-ci nest pas disponible. Le producteur ne doit pas produire une nouvelle valeur si la prcdente na pas t exploite. Ainsi pour une zone mmoire commune une place : message S1 S2 Variable commune aux 2 processus Smaphore initialis 1 Smaphore initialis 0 processus consommateur Puis-je consommer ? P(S2)

processus producteur Puis-je produire P(S1) ;

Dposer les donnes dans message ; Consommer les donnes dans message ; Vas-y consommes V(S2) ; Vas-y produis P(S1) ;

Le consommateur attend le producteur. Le producteur attend que le message soit consomm avant de produire un nouveau message. Il y a bien synchronisation des deux processus. Pour une zone commune N places, il suffit dinitialiser le smaphore S1 N (linitialisation de S2 est maintenue 0). La zone est une rserve de N lments, le producteur est charg de la remplir ; il est bloqu si la rserve est pleine. Le consommateur prend les lments dans la rserve ; il est bloqu si la rserve est vide.

4.4. Interblocage (deadlock)


Certaines synchronisation peuvent conduire un interblocage des processus lorsquun processus attend des ressources utilises par un autre processus et vice versa. Soient les processus p1 et p2 tel que : p1 possde la Ressource 1 Ressource1 p2 attend la Ressource1 S1 S2 Smaphore initialis 1 Smaphore initialis 1 Programmation systme sous UNIX p2 p1 p1 attend la Ressource 2 Ressource2 p2 possde la Ressource2

Prof. C.EL AMRANI

Chapitre 6. Processus et smaphores

processus p1 P(S1) ; (A) P(S2) ; V(S2) ; V(S1) ;

processus p2 P(S2) ; (B) P(S1) ; V(S1) ; V(S2) ;

p1 possde Ressource1 et attend Ressource2. p2 possde Ressource2 et attend Ressource1. Dans ce cas les deux processus sont ternellement bloques. p1 est bloqu sur S2 et est interrompu en (A). p2 est bloqu sur S1 et est interrompu en (B). Chaque processus attend que lautre libre la ressource dont il a besoin. On peut viter les problmes dinterblocage en imposant un ordre dans lattribution des ressources. Sur lexemple ci-dessus, lordre dabord S1, puis ensuite S2 pour tous les processus, ne peut conduire un interblocage.

Prof. C.EL AMRANI

Programmation systme sous UNIX