12
20/01/2014 1 1 COURS SYSTEMES DEXPLOITATION -Communication et synchronisation interprocessus- Pr. K. ZINEDINE E-mail : [email protected] 2 Communication et Synchronisation Interprocessus

ch3 communication synchro processus.pdf

Embed Size (px)

Citation preview

  • 20/01/2014

    1

    1

    COURSSYSTEMES DEXPLOITATION

    -Communication et synchronisation interprocessus-

    Pr. K. ZINEDINE E-mail : [email protected]

    2

    Communication et Synchronisation Interprocessus

  • 20/01/2014

    2

    33

    Les processus cooprent souvent pour traiter un mme problme.

    Ces processus s'excutent en parallle sur un mme ordinateur (monoprocesseurou 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 et les tubes de communication

    Introduction

    444

    Les processus partagent un ensemble de donnes communes qui sont soit enmmoire (variables ou segments de donnes) soit sur disque (fichiers).

    Chaque processus peut accder en lecture ou en criture cet ensemble dedonnes appel espace de donnes commun.

    Des problmes peuvent se poser lorsque plusieurs processus essayentd'accder en mme temps un espace commun.

    Si deux processus ou plus lisent ou crivent des donnes partages, le rsultatdpend de l'ordonnancement des processus.

    C'est ce qu'on appelle des accs concurrents.

    Variables et fichiers communs

  • 20/01/2014

    3

    555

    Supposons deux processus qui partagent une variable v. Le premier processus incrmente de 1 la valeur de v alors que l'autre la

    dcrmente de 1. La valeur initiale de v=1. P1 : v=++; P2 : v=--;

    Supposons que les processus P1 et P2 s'excutent en temps partag. Le processus P1 est en cours d'excution. Il est suspendu juste aprs l'excution de l'instruction incrmenter v . Le processus P2 est lu et excute les instructions charger v ,

    dcrmenter v et sauvegarde v . Le processus P2 se termine avec v = 0. Le processus P1 est ensuite lu et excute l'instruction store v et donc v=2.

    Variables et fichiers communs

    666

    Pour viter de tels problmes, il est ncessaire de contrler les accsconcurrents des objets communs.

    Nous verrons plus tard des solutions qui permettent de rsoudre les conflitsd'accs des objets communs.

    On prsentera deux moyens de communication interprocessus offerts par lesystme Unix/Linux : les signaux et les envois de messages par le biais detubes

    Variables et fichiers communs

  • 20/01/2014

    4

    777

    Les interruptions logicielles ou signaux sont utilises par le systmed'exploitation pour aviser les processus utilisateurs de l'occurrence d'unvnement important.

    De nombreuses erreurs dtectes par le matriel, comme l'excution d'uneinstruction non autorise (une division par 0, par exemple) ou l'emploi d'uneadresse non valide, sont converties en signaux qui sont envoys au processusfautif.

    Ce mcanisme permet un processus de ragir cet vnement sans treoblig d'en tester en permanence l'arrive.

    Les processus peuvent indiquer au systme ce qui doit se passer la rceptiond'un signal.

    On peut ainsi ignorer le signal, ou bien le prendre en compte, ou encore laisserle systme d'exploitation appliquer le comportement par dfaut, qui en gnralconsiste tuer le processus.

    Les signaux

    888

    Si un processus choisit de prendre en compte les signaux qu'il reoit, il doitalors spcifier la procdure de gestion de signal.

    Quand un signal arrive, la procdure associe est excute.

    A la fin de l'excution de la procdure, le processus s'excute partir del'instruction qui suit celle durant laquelle l'interruption a eu lieu.

    En rsum: les signaux sont utiliss pour tablir une communication minimaleentre processus, une communication avec le monde extrieur et faire la gestiondes erreurs.

    Les signaux

  • 20/01/2014

    5

    999

    Un processus peut :

    Ignorer le signal.

    Appeler une routine de traitement fournie par le noyau. Cette procdure provoque normalement la mort du processus. Dans certains cas, elle provoque la cration d'un fichier core, qui contient

    le contexte du processus avant de recevoir le signal.

    Appeler une procdure spcifique cre par le programmeur : Tous lessignaux ne permettent pas ce type d'action.

    Les signaux

    101010

    Tous les signaux ont une routine de service, ou une action par dfaut. Cetteaction peut tre du type :A : terminaison du processusB : ignorer le signalC : Crer un fichier coreD : Stopper le processusE : La procdure de service ne peut pas tre modifieF : Le signal ne peut pas tre ignor

    Chaque signal est identifi au moyen d'un numro entier positif

    Les signaux

    Signal Numro Type Description

    SIGKILL 9 AEF Termine l'excution du processus

    SIGSTOP 19 DEF Stoppe le processus

    SIGCONT 18 Continue l'excution du processus

    SIGCHID 17 B Un processus fils a fini

    SIGUSR1 10 A Signal d'utilisateur

    SIGUSR2 10 A Signal d'utilisateur

  • 20/01/2014

    6

    111111

    Dans le cas du systme Unix/Linux, un processus utilisateur peut galementenvoyer un signal un autre processus.

    Les deux processus appartiennent au mme propritaire, ou bien le processusmetteur du signal est le super-utilisateur.

    Les services Posix de gestion des signaux utilisent la bibliothque .

    Service des signaux

    12

    kill() L'envoi d'un signal peut se faire avec l'appel systme kill() :

    #include #include int kill(pid t pid, int signal);

    kill() envoi le signal numro signal un processus identifi par son pid. En cas d'erreur il retourne -1, et 0 autrement. pid peut prendre comme valeurs :

    Si pid > 0 : processus pid. Si pid = 0 : groupe de l'metteur. Si pid =-1 : tous les processus (seulement root peut le

    faire). Si pid < 0 : au groupe gid = |pid|

    Service des signaux

  • 20/01/2014

    7

    131313

    Le programme signaux-0.c montre l'utilisation du masquage des signaux.

    Service des signaux Exemple

    # include < stdio.h># include < signal.h># include < unistd.h>void sighandler ( int signum) ;int main ( void ){char buffer [256] ;if ( signal (SIGTERM,&sighandler) == SIG_ERR )

    {printf ( "Ne peut pas manipuler le signal \n" ) ;return 1 ;

    }while ( 1 )

    {fgets ( buffer , sizeof ( buffer ) , stdin ) ;printf (" Input : %s " , buffer ) ;

    }return 0 ;}

    void sighandler ( int signum){printf ( Signal SIGTERMintercept \n" ) ;}

    14

    Service des signaux Exemple

    On teste l'excution de signaux-0.c dans deux terminaux, afin de montrer lemasquage de signaux et d'essayer de tuer le processus.

    D'abord, excution sur un terminal :gcc -o signal-0 signal-0.c./signal-0

    SalutInput: SalutAbgrcdyuroInput: Abgrcdyurols -lInput: ls -lwhoInput: who...

    Sur un autre terminal, on excute la commande: kill SIGKILL npid

  • 20/01/2014

    8

    15151515

    Les appel systme sleep() et pause() peuvent tre utiles lorsqu'on travaille avecdes signaux.

    Un processus peut se mettre en veille et attendre l'arrive d'un signal particulierpour excuter le gestionnaire, ou bien l'metteur utilise sleep() pour sesynchroniser avec le rcepteur.

    pause() permet que le processus passe l'tat suspendu.

    Il va quitter cet tat au moment de recevoir un signal.

    Aprs avoir reu le signal, le processus recevra un traitement adquat associau signal et continuera son excution l'instruction qui suit pause(). Il retournetoujours la valeur -1.

    Cet appel fournit une alternative l'attente active. Cd au lieu d'excuter uneboucle inutile en attente d'un signal, le processus bloquera jusqu' ce qu'unsignal lui soit transmis.

    Service des signaux: sleep() et pause()

    16161616

    Un autre mcanisme de communication entre processus est l'change demessages.

    Chaque message vhicule des donnes.

    Un processus peut envoyer un message un autre processus se trouvant sur lamme machine ou sur des machines diffrentes.

    Unix offre plusieurs mcanismes de communication pour l'envoie de messages:les tubes de communication, sans nom, nomms et les sockets.

    Les messages

  • 20/01/2014

    9

    1717171717

    Les tubes de communication ou pipes permettent deux ou plusieursprocessus d'changer des informations.

    On distingue deux types de tubes : les tubes sans nom (unamed pipe ) les tubes nomms (named pipe)

    Tubes de communication

    who pipe Wc -l

    18

    Tubes sans noms

    Les tubes sans nom sont des liaisons unidirectionnelles de communication.

    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 systmepipe().

    Les tubes sans nom du shell sont crs par l'oprateur binaire | qui dirige lasortie standard d'un processus vers l'entre standard d'un autre processus.

    Les tubes de communication du shell sont supports par toutes les versionsd'Unix.

  • 20/01/2014

    10

    19

    Tubes sans noms

    La commande shell who | wc l cre deux processus qui s'excutent enparallle et qui sont relis par un tube de communication pipe

    Le premier processus ralise la commande who, alors que le second excute lacommande wc -l.

    Le processus ralisant la commande who ajoute dans le tube une ligned'information par utilisateur du systme.

    Le processus ralisant la commande wc -l rcupre ces lignes d'informationpour en calculer le nombre total

    Les deux processus s'excutent en parallle

    Lorsque le tube devient plein, le premier processus est suspendu jusqu' cequ'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 estsuspendu jusqu' ce qu'il y ait au moins une ligne d'information sur le tube.

    20

    Cration dun tube sans noms

    Un tube de communication sans nom est cr par l'appel systme pipe, auquelon passe un tableau de deux entiers : int pipe(int descripteur[2]);

    Au retour de l'appel systme pipe(), un tube aura t cr, et les deux positionsdu tableau pass en paramtre contiennent deux descripteurs de fichiers.

    on peut considrer un descripteur comme une valeur entire que le systmed'exploitation utilise pour accder un fichier.

    Dans le cas du tube, on a besoin de deux descripteurs : le descripteur pour leslectures du tube et le descripteur pour les critures dans le tube.

    Le descripteur de l'accs en lecture se retrouvera la position 0 du tableaupass 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 accderau tube.

    Si le systme ne peut pas crer de tube pour manque d'espace, l'appel systmepipe() retourne la valeur -1, sinon il retourne la valeur 0.

  • 20/01/2014

    11

    21

    Cration dun tube sans noms

    Les tubes sans nom sont, en gnral, utiliss pour la communication entre unprocessus 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 processuslecteur

    La squence d'vnements pour une telle communication est comme suit :.

    22

    Cration dun tube sans noms

    Le processus pre cre un tube de communication sans nom en utilisant l'appelsystme 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

    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

  • 20/01/2014

    12

    23

    Cration dun tube sans nomsExemple: Dans le programme pipe.c le processus pre cre un tube de communication

    pour communiquer avec son processus fils. La communication est unidirectionnelle du processus ls vers le processus pre

    # include < sys/types.h> // types# include < unistd.h> // fork , pipe , read , write , close# include < stdio.h># define R 0# define W 1int main ( ){ int fd[2] ; char message [100]; // pour rcup. un msgint nboctets ; Char * phrase = "message envoy au pre par le fils "

    pipe ( fd ) ; // creation d' un tube sans nomif ( fork ()==0 ) // cration d' un processus fils{ // Le fils ferme le descripteur non utilise de lecture

    close (fd[R]) ;// dpt dans le tube du message

    Write ( fd[W] , phrase, strlen ( phrase ) + 1 ) ;// fermeture du descripteur d ' ecritureclose (fd[W]) ;}

    else{// Le pere ferme le descripteur non utilis d' ecritureclose ( fd [W] ) ;// extraction du message du tubenboctets = read ( fd [R ] , message , 100 ) ;printf ( " Lecture %d octets : % s\n" , nboctets , message ) ;// fermeture du descripteur de lectureclose (fd[R]) ;}return 0 ;}

    24

    Cration dun tube sans noms - ExempleExemple: gcc o pipe pipe.c ./pipe

    Sortie: Lecture 35 octets : message envoy au pre par le fils