chap3 semaphores moniteurs posix

Upload: ahmed-ben-amor

Post on 15-Jul-2015

192 views

Category:

Documents


0 download

TRANSCRIPT

Synchronisation laide des Smaphores Synchronisation laide des Smaphores et Moniteurs Posix et Moniteurs PosixSamia Bouzefrane Matre de Confrences CEDRIC CNAM [email protected] http://cedric.cnam.fr/~bouzefra

1

[email protected] - CEDRIC ( CNAM) -

Sommaire Sommaire

Synchronisation en C/Posix Les smaphores Posix Les variables condition Posix Exemples dutilisation

2

[email protected] - CEDRIC ( CNAM) -

Mcanismes tudis Mcanismes tudisMutex Posix (smaphore binaire) Smaphores Posix Moniteurs Posix : variables conditionnelles associes aux Mutex Nous n'abordons pas lutilisation de tubes ("pipe") lutilisation de sockets (API TCP) lutilisation des smaphores la Unix (tableau de smaphores) (voir Livre de Systmes dexploitation- exercices en C/Posix et Java, de Samia Bouzefrane, dition Dunod 2003)

3

[email protected] - CEDRIC ( CNAM) -

Gestion des Mutex Gestion des Mutex

Un Mutex est un smaphore binaire pouvant prendre un des deux tats "lock" (verrouill) ou "unlock" (dverrouill): valeur de smaphore 1 ou 0

Un Mutex ne peut tre partag que par des threads dun mme processus

Un Mutex ne peut tre verrouill que par une seule thread la fois.

Une thread qui tente de verrouiller un Mutex dj verrouill est suspendu jusqu' ce que le Mutex soit dverrouill.

4

[email protected] - CEDRIC ( CNAM) -

Dclaration et initialisation d'un Mutex Dclaration et initialisation d'un Mutex Un mutex est une variable de type thread_mutex_t Il existe une constante PTHREAD_MUTEX_INITIALIZER de ce type permettant une dclaration avec initialisation statique du mutex (avec les valeurs de comportement par dfaut)pthread_mutex_t monMutex = THREAD_MUTEX_INITIALIZER;

Un mutex peut galement tre initialis par un appel de la primitiveint pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *mutexattr);

avec une initialisation par dfaut lorsque mutexattr vaut NULL ex : pthread_mutex_init(&monMutex, NULL);5 [email protected] - CEDRIC ( CNAM) -

Prise (verrouillage) d'un mutex Prise (verrouillage) d'un mutex Un mutex peut tre verrouill par la primitiveint pthread_mutex_lock(pthread_mutex_t *mutex);

Si le mutex est dverrouill il devient verrouill

Si le mutex est dj verrouill par une autre thread la tentative de verrouillage suspend l'appelant jusqu' ce que le mutex soit dverrouill.

6

[email protected] - CEDRIC ( CNAM) -

Relchement (dverrouillage) d'un mutex Relchement (dverrouillage) d'un mutex Un mutex peut tre dverrouill par la primitiveint pthread_mutex_unlock(pthread_mutex_t *mutex);

Si le mutex est dj dverrouill, cet appel n'a aucun effet (comportement par dfaut)

Si le mutex est verrouill, une des threads en attente obtient le mutex (qui reprend alors l'tat verrouill) et cette thread redevient active (elle n'est plus bloque)

L'opration est toujours non bloquante pour l'appelant7 [email protected] - CEDRIC ( CNAM) -

Exemple d'utilisation de mutex Exemple d'utilisation de mutex#define N 10 /* Nb de cases du tampon */

pthread_mutex_t monMutex = PTHREAD_MUTEX_INITIALIZER; int tampon[N];

void Deposer(int m){ pthread_mutex_lock(&mutex); // dposer m dans tampon; On verrouille le Mutex : accs exclusif pthread_mutex_unlock(&mutex); } On dverrouille le Mutex

8

[email protected] - CEDRIC ( CNAM) -

Gestion des smaphores Posix Gestion des smaphores Posix Un smaphore Posix est un smaphore compte pouvant tre partag par plusieurs threads de plusieurs processus

Le compteur associ un smaphore peut donc prendre des valeurs plus grande que 1 (contrairement un mutex)

La prise d'un smaphore dont le compteur est ngatif ou nul bloque l'appelant.

Il ne faut pas confondre les smaphores Posix avec les smaphores Unix qui sont en fait des tableaux de smaphores (non tudis ici).

9

[email protected] - CEDRIC ( CNAM) -

Rappel du concept de smaphore Rappel du concept de smaphoreUn smaphore s : {Val(s): valeur qui doit toujours tre initialise, File(s): file dattente qui va contenir les processus bloqus sur ce smaphore } La valeur initiale dun smaphore ne doit jamais tre ngative. Primitive P(s): Debut Val(s) = Val(s) -1; Si Val(s) < 0 Alors Mettre le processus actif dans la file File(s); Fin Primitive V(s): Debut Val(s) = Val(s) +1; Si Val(s) 0 Alors /* il y a au moins un processus bloqu dans File(s) */ Sortir un processus de la file File(s); Fin10 [email protected] - CEDRIC ( CNAM) -

Cration //Initialisation d'un smaphore Posix Cration Initialisation d'un smaphore Posix

Les prototypes des fonctions et les types sont dfinis dans semaphore.h Un smaphore est une variable de type sem_t Il est initialis par un appel la primitive : int sem_init(sem_t *sem, int pshared, unsigned int valeur); si "phsahed" vaut 0 le smaphore ne peut pas tre partag entre threads de diffrents processus (partage uniquement au sein d'un mme processus) valeur dfinit la valeur initiale de ce smaphore (positive ou nulle)

11

[email protected] - CEDRIC ( CNAM) -

Prise //Relchement d'un smaphore Posix Prise Relchement d'un smaphore Posix

Les deux oprations P et V sont implmentes par P : V : int sem_wait(sem_t *sem); int sem_post(sem_t *sem);

avec les mmes comportements que les primitives gnriques P et V

Il existe galement une version non bloquante de la primitive P : int sem_trywait(sem_t *sem); qui retourne 0 lorsque la prise est possible (et non bloquante) et qui retourne EAGAIN sinon (dans le cas o l'appel normal serait bloquant)

12

[email protected] - CEDRIC ( CNAM) -

Lecture de la valeur d'un smaphore Posix Lecture de la valeur d'un smaphore Posix La primitive int sem_getvalue(sem_t *sem, int *sval); qui retourne dans sval la valeur courante du smaphore sem

La primitive int sem_destroy(sem_t *sem); qui permet de librer les ressources associes au smaphore sem

13

[email protected] - CEDRIC ( CNAM) -

Smaphores vs Mutex Smaphores vs Mutex Les Mutex constituent un cas particulier de smaphores Posix. Les Mutex correspondent des smaphores binaires. Avantages de Mutex Les primitives de manipulation de Mutex servent uniquement implmenter une exclusion mutuelle. Les primitives de manipulation de Mutex sont faciles utiliser.

Avantages smaphores Posix Les smaphores Posix implmentent nimporte quel type de synchronisation entre les threads dun mme processus (en plus de lexclusion mutuelle).

14

[email protected] - CEDRIC ( CNAM) -

Exemple du Prod/Cons avec les Smaphores Posix Exemple du Prod/Cons avec les Smaphores Posix

/* prodconsThread.c avec des threads*/ #include #include #include #include

#define Ncases 10

/* nbr de cases du tampon */

int Tampon[Ncases]; sem_t Snvide, Snplein;

/* Tampon a N cases*/ /* les semaphores */

15

[email protected] - CEDRIC ( CNAM) -

Exemple du Prod/Cons /Suite Exemple du Prod/Cons /Suitevoid *Producteur(void) { int i, queue=0, MessProd; srand(pthread_self()); for(i=0; i