1x1 - fil - Université Lille 1
Transcription
1x1 - fil - Université Lille 1
Synchronisation de processus Énoncé du problème Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs Synchronisation de processus Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs V-2 (24-02-2012) Licence miage — Université Lille 1 Pour toutes remarques : [email protected] Semestre 6 — 2012-2013 www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Effet de l’ordonnancement Énoncé du problème Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs Le segment de code d’un processus est constitué de plusieurs instructions. Par exemple, on peut considérer un processus A dont les instructions constituant le code seraient : IA1 IA3 IA4 IA5 IA6 IA7 ... et un processus B avec comme code les instructions : IB1 IB2 IB3 IB4 IB5 IB6 IB7 ... Du fait d’interruption et d’attente d’entrée-sortie, le processeur exécute les instructions par intermittence : IB1 V75 (24-02-2012) IA2 IA1 IA2 IB2 IB3 IB4 IA3 ... www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Énoncé du problème Section critique Solutions partielles Problèmes classiques Problème de concurrence Considérons une ressource — ici une variable int cpt=2000 — que l’on désire mettre à 1000 en utilisant 2 processus (qui sont supposés se partager la ressource) : Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs EA1 EA2 EA3 EA4 processus A charger(varA2,1000) charger(varA1,cpt) resA=add(varA1,varA2) ranger(resA,cpt) EB1 EB2 EB3 EB4 processus B charger(varB2,2000) charger(varB1,cpt) resB=sub(varB1,varB2) ranger(resB,cpt) Supposons que l’on ait la succession d’actions : EB1, EB2, EA1, EA2, EA3, EA4, EB3, EB4, le résultat de cette séquence est cpt=0. Supposons que l’on ait la succession d’actions : EB1, EA1, EA2, EB2, EA3, EB3, EB4, EA4, cette fois le résultat de cette séquence est cpt=3000. V75 (24-02-2012) www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Notion de section critique : définition Énoncé du problème Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs La mise-à-jour de cpt doit s’effectuer à l’exclusion de toute autre action : il s’agit d’une section critique. Un seul processus à la fois peut modifier cpt ; l’autre doit attendre que le processus en cours ait fini. De plus, ces opérations ne peuvent se faire dans n’importe quel ordre. Peut importe l’ordre dans lequel se font les instructions EA1 et EB1 ; ces instructions ne font pas partie de la section critique. SCA = EA2, EA3, EA4 forment la section critique du processus A. SCB = EB2, EB3, EB4 forment la section critique du processus B. Problème : comment coordonner ces sections critiques ? Solution : exclusion mutuelle. Il nous suffit d’exclure l’exécution d’une section critique par un processus pendant qu’un autre peut effectuer cette exécution. V75 (24-02-2012) www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Énoncé du problème Solution logiciel (fausse puis vrai) : utilisation d’un verrou Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs V75 (24-02-2012) On peut mettre un verrou sur la ressource. Il s’agit d’une variable partagée par tous les processus. Un processus doit tester ce verrou avant d’entrer en section critique : I si le verrou est à 0, le processus le met à 1 et entre dans la section critique ; I Si le verrou est à 1, le processus attend qu’il soit à 0 pour s’emparer de la ressource. Problème : si un processus voit le verrou à 0 et s’endort avant de le mettre à 1, un autre processus peut se mettre sur les rangs et lui ravir la ressource. Lors du réveil du premier processus, celui-ci croit la ressource à sa disposition et entre en section critique alors que le second processus y est déjà. Le verrou constitue une ressource partagée. www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Illustration Énoncé du problème Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs Sémaphore Considérons l’utilisation d’un seul booléen initialisé à vrai (C := vrai) qui est une ressource partagée par deux processus : Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs V75 (24-02-2012) EA1 EA11 EA12 SCA EA5 processus A charger(varA2,1000) tant que non C attendre C := faux Section Critique C := vrai EB1 EB11 EB12 SCB EB5 processus B charger(varB2,2000) tant que non C attendre C := faux Section Critique C := vrai www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Énoncé du problème Solution logiciel correcte : algorithme de Deckker Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois On peut assurer l’alternance grâce à une variable tour commune à tous les processus et initialisée à 0. Si tour est égal à i alors le processus i est autorisé à exécuter sa section critique. Les autres processus font une boucle basée sur un test sur tour et attendent que leur tour arrive. Pour le processus i, on a donc Compléments Implantation des sémaphores Sémaphores et threads Moniteurs while(1){ while(tour!=i) ; /* attendre */ section_critique() ; tour = i + 1 ; section_non_critique() ; } Combinaison du verrou et du tour : on peut combiner ces deux approches. V75 (24-02-2012) www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Énoncé du problème Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs Comme précédemment, les processus A et B doivent partager des variables qu’il faut initialiser comme suit : int c[2]; int tour; c[0] = FALSE; c[1] = FALSE; tour = 0; On considère que i est associé au processus courant et j à l’autre c[i] = TRUE; tour = j; while ((c[j]) && (tour == j)) {}; Section critique c[i] = FALSE; Inconvénient : même si le processus ne fait rien, il monopolise le processeur. On peut aussi empêcher les interruptions afin de monopoliser le processeur physiquement. V75 (24-02-2012) www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Philosophes chinois Énoncé du problème Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs Description du problème : cinq philosophes chinois sont assis autour d’une table ronde. Chacun d’eux a devant lui un plat. Une baguette sépare deux assiettes mitoyennes. Un philosophe partage son temps entre deux actions : manger et penser. Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs Lorsqu’un philosophe a faim, il tente de s’emparer de deux baguettes ; s’il les obtient il mange un certain temps avant de reposer ces baguettes et de se remettre à penser. Conséquence de la loi de Murphy : un philosophe peut ne jamais avoir deux baguettes ; chaque philosophe peut en avoir une. Objectif : organiser le comportement de chaque philosophe pour éviter les privations et les blocages. V75 (24-02-2012) www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Producteur – consommateur Énoncé du problème Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs Dans ce problème, il existe des produits et des cases. Chaques cases pouvant contenir un produit. De plus, I un producteur dispose de deux primitives : produire(produit) et deposer(case,produit). Il ne peut déposer son produit que si la case correspondante n’est pas pleine ; I un consommateur dispose de deux primitives : consommer(produit) et retirer(case,produit). Le consommateur ne peut consommer que si la case est pleine. Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs Les deux processus ne doivent pas accéder en même temps au tampon. Conséquences de la loi de Murphy : le producteur peut déposer un produit alors que le consommateur n’a pas retiré le précédent ou retirer un produit alors que le producteur n’a rien déposé. Objectif : organiser les comportements des deux partenaires. V75 (24-02-2012) www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Rédacteurs – lecteurs Énoncé du problème Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs V75 (24-02-2012) Ce problème modélise les accès à une base de données : un ensemble de processus tente constamment d’accéder à la base de données soit pour écrire, soit pour lire des informations. Afin d’assurer une certaine cohérence des données de la base, il faut interdire l’accès (en lecture et en écriture) à l’ensemble des processus, si un processus est en train de modifier la base (accède à la base en mode écriture). Par contre, plusieurs processus peuvent accéder à la base, en même temps, en mode lecture. Dans ce cadre : I les rédacteurs représentent les processus qui demandent des accès en écriture à la base de données ; I les lecteurs représentent les processus qui demandent des accès en lecture à la base de données. www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Définition et utilisation des sémaphores Énoncé du problème Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs En 1965, Dijkstra introduit la notion de sémaphore ; cette structure de donnée est composée : I d’un compteur pouvant prendre des valeurs entières (négatives, positives ou nulles) ; Sémaphore I Solution aux problèmes classiques I d’une liste de processus en attente ; deux primitives atomiques manipulant le sémaphore : Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs wait décrémente le compteur associé au sémaphore. Si sa valeur est négative, le processus se bloque dans la file d’attente ; signal incrémente le compteur associé au sémaphore. Si le compteur est négatif ou nul, un processus est choisi dans la file d’attente est devient actif. Plusieurs terminologies sont utilisées : wait signal down up P V Ces opérations sont ininterruptibles et ont lieu séquentiellement. V75 (24-02-2012) www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Exclusion mutuelle Énoncé du problème Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs l’accès à une ressource unique (fichier, variable, imprimante, etc). Le sémaphore s est initialisé à 1. Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs V75 (24-02-2012) Utilisation : Chaque processus a une section critique où il utilise la ressource. Dans ce cas, chacun peut utiliser le sémaphore comme suit : wait(s) Section critique signal(s) www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Synchronisation Énoncé du problème Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs Dans ce cas, un processus doit en attendre un autre pour continuer (ou commencer) son exécution. Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Le sémaphore s est initialisé à 0. Utilisation : dans le cas de deux processus, le sémaphore est manipulé comme suit : Compléments Implantation des sémaphores Sémaphores et threads Moniteurs V75 (24-02-2012) Processus 1 Section critique signal(s) // réveil processus 2 Processus 2 wait(s) // attente processus 1 Section critique www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Énoncé du problème Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs V75 (24-02-2012) Les rendez-vous Le rendez-vous est une généralisation de la synchronisation. Un processus RDV doit attendre que n autres processus soient parvenus à un endroit précis pour poursuivre son exécution. Ceci fait, les autres processus poursuivent eux aussi leurs exécutions. On utilise : I un sémaphore Ssync initialisé à 0 I un sémaphore mutex initialisé à 1 I un sémaphore Sattend initialisé à 0 I un entier nb initialisé à 0 (une ressource partagée). Il ne reste plus qu’à programmer les processus : Processus i ... P(mutex) ; nb = nb + 1 ; si nb = n alors V(Ssync) ; nb = 0 ; V(mutex) ; P(Sattend) ; ... Processus RdV ... ... P(Ssync) ; V(Sattend, n) ; ... ... ... www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Énoncé du problème Section critique Solutions partielles Problèmes classiques Le problème d’interblocage Supposons que SemA et SemB soient deux sémaphores d’exclusion mutuelle initialisés à 1 et que l’on dispose d’au moins deux processus : Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs Processus i P(semA) ; P(semB) ; Section critique V(semB) ; V(semA) ; Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Processus j P(semB) ; P(semA) ; Section critique V(semA) ; V(semB) ; Compléments Implantation des sémaphores Sémaphores et threads Moniteurs Il y a interblocage en programmant le problème des philosophes par : penser(); P(fourchette P(fourchette manger(); V(fourchette V(fourchette V75 (24-02-2012) i); (i+1) mod 5); i); (i+1) mod 5); www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Énoncé du problème Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs V75 (24-02-2012) Il existe deux remèdes différents pour s’affranchir des interblocages : 1. Prévention : I I exécuter les P() toujours dans le même ordre ; déclarer quelles sont les ressources que l’on va utiliser et utiliser un algorithme qui en tient compte. 2. Détection–Guérison : 2.1 construire le graphe des conflits (périodiquement) ; 2.2 si un circuit est trouvé alors il y a interblocage ; 2.3 tuer un processus puis effectuer les V() manquants. www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Producteur – consommateur Énoncé du problème Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs V75 (24-02-2012) #define N 100 /* nombre de places dans le tampon */ semaphore_t mutex=sema_init(1); /* contr\^ole d acc\‘es au tampon */ semaphore_t vide =sema_init(N); /* nb de places libres */ semaphore_t plein=sema_init(0); /* nb de places occup\’ees */ void producteur (void) { objet_t objet ; while (TRUE) { produire_objet (&objet) ; /* produire l’objet suivant down (&vide) ; /* d\’ec. nb places libres down (&mutex) ; /* entr\’ee en section critique mettre_objet (objet) ; /* mettre l’objet dans le tampon up (&mutex) ; /* sortie de section critique up (&plein) ; /* inc. nb places occup\’ees } } */ */ */ */ */ */ www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Énoncé du problème Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs V75 (24-02-2012) void consommateur (void) { objet_t objet ; while (TRUE) { down (&plein) ; /* d\’ec. nb emplacements occup\’es down (&mutex) ; /* entr\’ee section critique retirer_objet (&objet) ; /* retire un objet du tampon up (&mutex) ; /* sortie de la section critique up (&vide) ; /* inc. nb emplacements libres utiliser_objet (objet) ; /* utiliser l’objet } } */ */ */ */ */ */ www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Énoncé du problème Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs Lecteurs – rédacteurs Pour contrôler les accès à la base, on doit connaı̂tre le nombre nbl de lecteur en train de lire. unsigned int nbl = 0 ; /* c’est une ressource partag\’ee */ semaphore_t mutex=sema_init(1);/* contr\^ole d acc\‘es \‘a la base */ semaphore_t redac=sema_init(1);/* contr\^ole d acc\‘es \’ecrivain */ void lecteur (void) { do{ down(mutex) ; if(!nbl) down(redac);/* le premier lecteur emp\^eche l’\’ecriture * nbl++ ; up(mutex) ; LectureDeLaBase() ; down(mutex) ; nbl-- ; if(!nbl) up(redac);/* le dernier lecteur autorise l’\’ecriture */ up(mutex) ; } while(1) ; } void redacteur(void){ do{down(redac); ModificationDeLaBase(); up(redac);} while(1); } V75 (24-02-2012) www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Philosophes chinois Énoncé du problème Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs #define #define #define #define #define #define N 5 GAUCHE(i-1)%N DROITE(i+1)%N penser 0 faim 1 manger 2 /* nombre de philosophes */ /* on construit un tore */ /* les actions du philosophe */ Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs V75 (24-02-2012) typedef int semaphore ; int etat[N] ; /* on suppose ce tableau initialis\’e */ semaphore mutex = 1 ; /* s\’emaphore d’exclusion mutelle */ semaphore s[N] ; /* un s\’emaphore est attach\’e \‘a chaque philosope, il est initialis\’e \‘a 0 */ void philosophe(int i){ while(1){ penser() ; prendre_baguettes(i) ; manger(); poser_baguettes(i) ; } } www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Énoncé du problème Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs V75 (24-02-2012) void test(int i) { if ( etat[i] == faim && etat[GAUCHE(i)] != manger && etat[DROITE(i)] != manger ){ etat[i] = manger ; up(s[i]) ; } } void prendre_baguettes(int i) { down (&mutex) ; etat[i] = faim ; test(i) ; up(&mutex) ; down(s[i]); } | | | | | | | | void poser_baguettes(int i) { down(&mutex) ; etat[i] = penser ; test(GAUCHE(i)) ; test(DROITE(i)) ; up(&mutex) ; } www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Énoncé du problème Primitive de manipulation des sémaphores (System V) Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs V75 (24-02-2012) Un sémaphore est implanté dans linux par la structure de donnée ci-contre. Un tableau de valeurs est associé au sémaphore ainsi qu’une file d’attente sem queue. sem undo permet de rétablir le sémaphore au cas ou le processus le manipulant est corrompu. www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Énoncé du problème La primitive semget d’obtention de sémaphore Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs #include <sys/types.h> #include <sys/ipc.h> key_t ftok(const char *pathname, int proj_id); #include <sys/sem.h> int semget(key_t key, int nsems, int semflg); La fonction ftok retourne une clef — supposée unique — construite à partir d’un chemin d’accès et d’un entier. Cette clef est associée à une ressource et permet de la désigner. La fonction semget retourne l’identificateur d’un tableau de nsems valeurs associées au sémaphore lui même associé à la clef key. Une structure de données associée à un sémaphore est créée si le drapeau semflg est IPC CREAT et qu’aucun sémaphore n’est associé à la clef key. V75 (24-02-2012) www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Énoncé du problème La primitive semctl de contrôle de sémaphore Section critique Solutions partielles Problèmes classiques #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semctl(int semid, int semnum, int cmd, union semun arg); union semun { int val; unsigned short *array ; struct semid_ds *buf; struct seminfo *__buf; } ; Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs V75 (24-02-2012) L’entier cmd détermine l’action de la fonction semctl suivant les valeurs : I IPC STAT copie les informations du semaphore dans arg.buf ; I IPC SET affecte les informations du semaphore à partir de arg.buf ; I IPC RMID détruit le sémaphore. www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Énoncé du problème La primitive semop de manipulation de sémaphore Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs #include<sys/types.h> /* semid~: identificateur du s\’emaphore */ #include<sys/ipc.h> /* nsops~: nb d’\’el\’ements du tableau de s\ #include<sys/sem.h> int semop(int semid, struct sembuf *sops, unsigned nsops); Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs struct sembuf{ unsigned short int sem_num; short int sem_op; short int sem_flg; }; L’action de l’appel semop dépend du champs sem op. S’il est : I I I V75 (24-02-2012) /* semaphore number */ /* semaphore operation */ /* operation flag */ strictement positif : une opération up est exécutée sur le sémaphore ; strictement négatif : une opération down est exécutée sur le sémaphore ; nul : une opération d’attente est exécutée et se termine quand l’ensemble des sémaphores désignés par dipc sont nul. www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Énoncé du problème Sémaphores de processus léger (sémaphore POSIX) Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs La gestion des sémaphores conformémant à la norme POSIX se fait par l’intermédiaire des appels : #include <semaphore.h> int sem_init(sem_t *sem, int pshared, unsigned int value); int sem_wait(sem_t * sem); int sem_trywait(sem_t * sem); int sem_post(sem_t * sem); int sem_getvalue(sem_t * sem, int * sval); int sem_destroy(sem_t * sem); Ces appels ne s’appliquent qu’aux processus légers (threads) et ne peuvent donc pas servir à la communication de processus lourd. V75 (24-02-2012) www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Énoncé du problème Autres méthodes de synchronisation que les sémaphores : moniteurs et compteurs Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Au lieu de se servir de sémaphore, on peut regrouper l’ensemble des sections critiques d’un Problème dans un module nommé moniteur. Ce moniteur est un ensemble de fonctions, de variables et de structures de données qui permettent de manipuler une ressource. Les processus peuvent appeler les fonctions du moniteur mais ne peuvent accéder à sa structure interne. Compléments Implantation des sémaphores Sémaphores et threads Moniteurs Pour assurer l’exclusion mutuelle, il suffit qu’à tout moment, il n’y ait qu’un processus actif utilisant le moniteur. Pour ce faire, si un processus actif utilise le moniteur, un processus appelant le moniteur est bloqué. Lorsque le processus actif quitte le moniteur, il le libère. Les moniteurs existent dans les langages orientés objet (JAVA, C++). V75 (24-02-2012) www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Compteurs d’événements Énoncé du problème Section critique Solutions partielles Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs Un compteur peut être associé à un événement et indiqué le nombre d’occurrences de cet événement. Ce compteur peut servir à synchroniser des processus : un processus attend jusqu’à ce qu’une valeur du compteur soit atteinte. Trois opérations doivent être définies pour chaque compteur : I eval(cpt) donne la valeur du compteur cpt ; I inc(int *cpt) incrémente la valeur de cpt. Attention, l’exécution de cette fonction ne doit pas être interrompue ; I wait(cpt,val) attend que cpt dépasse la valeur val. Un compteur d’événement peut être utilisé dans le problème du producteur — consommateur. V75 (24-02-2012) www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf Synchronisation de processus Énoncé du problème Section critique Solutions partielles Une solution du problème des producteurs et consommateurs par compteur d’événement Problèmes classiques Philosophes chinois Producteur – consommateur Rédacteurs – lecteurs #define N 100 /* taille du tampon i.e. nb de cases */ int in = 0 ; /* incr\’ement\’e par le producteur */ int out = 0 ; /* incr\’ement\’e par le consommateur */ Sémaphore Solution aux problèmes classiques Producteur – consommateur Lecteurs – rédacteurs Philosophes chinois Compléments Implantation des sémaphores Sémaphores et threads Moniteurs V75 (24-02-2012) void producteur (void){ | void consommateur (void){ int objet, sequence=0, pos=0 ; | int objet, sequence=0, pos=0 ; while(1){ | while(1){ objet++ ; | sequence++ ; sequence++ ; | /* attendre que le tampon /* attendre que le tampon | devienne non vide */ devienne non plein */ | wait(in,sequence) ; wait(out, sequence-N) ; | objet = tampon[pos] tampon[pos] = objet ; | /* incr\’ementer le compteur pos = (pos+1)%N ; | de retraits */ /* incr\’ementer le nombre | inc(&out) ; de d\’ep\^ots */ | printf("objet consomm\\’e [%d]: inc(&int) ; | pos, objet) ; } | pos = (pos+1)%N ; } | } | } www.fil.univ-lille1.fr/˜sedoglav/OS/Cours07.pdf