Process Synchronisation
Process Synchronisation
Process Synchronisation
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
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)
{ 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).
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
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
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.
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.