Communication interprocessus

Slides:



Advertisements
Présentations similaires
ORTHOGRAM PM 3 ou 4 Ecrire: « a » ou « à » Référentiel page 6
Advertisements

LES NOMBRES PREMIERS ET COMPOSÉS
[number 1-100].
Module Systèmes d’exploitation
Qualité du Premier Billot. 2 3 Défauts reliés à labattage.
Synchronisation de Processus
Licence pro MPCQ : Cours
Rappels C.
Portée des variables VBA & Excel
Fonctions & procédures
Synchronisation des processus père - fils
Module Systèmes d’exploitation
Module Systèmes dexploitation Chapitre 6 Communication Interprocessus Partie III École Normale Supérieure Tétouan Département Informatique
GEF 435 Principes des systèmes d’exploitation
GEF 435 Principes des systèmes d’exploitation
GEF 435 Principes des systèmes dexploitation Communication Interprocessus (CIP) II (Tanenbaum 2.3)
GEF 435 Principes des systèmes dexploitation Communication Interprocessus (CIP) III (Tanenbaum 2.3)
1 UMLV 1. Introduction 2. Hachage ouvert 3. Hachage fermé 4. Implémentation des fonctions Méthodes de hachage.
Cours n°2M2. IST-IE (S. Sidhom) UE 303 Promo. M2 IST-IE 2005/06 Conception dun système d'information multimédia Architecture trois-tiers : PHP/MySQL &
Chapitre 3 Coopération et synchronisation par variables partagées
Chapitre 2 Processus & Threads
Exécutif Temps réel. Limitation des système classiques Rappels Mise en œuvre lourde des communications entre processus Problème de prédictibilité avec.
Les éléments de mémorisation
Chap. 1 Structures séquentielles : listes linéaires
ESIEE Paris © Denis BUREAU I N Initiation à la programmation avec le langage Java.
Jc/md/lp-01/05Trains_presentation1 Threads et Synchronisation Application train Présentation.
Jc/md/lp-01/05Trains_corrigé1 Threads et Synchronisation Application train Corrigé
User management pour les entreprises et les organisations Auteur / section: Gestion des accès.
Mr: Lamloum Med LES NOMBRES PREMIERS ET COMPOSÉS Mr: Lamloum Med.
Récursivité.
Rappel sur la synchronisation des processus
Olivier DERUELLE Erwan FOUYER Maxime JOUIN Rodolphe LOUE
Synchronisation et communication entre processus
II. Chaînage, SDD séquentielles
Processus et threads.
1 SERVICE PUBLIC DE LEMPLOI REGION ILE DE France Tableau de bord Juillet- Août 2007.
Titre : Implémentation des éléments finis sous Matlab
Segments de mémoire partagée
Configuration de Windows Server 2008 Active Directory
Académie de Créteil - B.C Quest-ce quune Inscription 1)1 action + 1 stagiaire + 1 client 2)Parcours individuel (avec son Prix de Vente) 3)Un financement.
Projet poker 1/56. Introduction Présentation de léquipe Cadre du projet Enjeux Choix du sujet 2.
LES NOMBRES PREMIERS ET COMPOSÉS
EPID-CPI-ISAIP Philippe Bancquart - mise à jour 24/02/ page 1 Cours de CPI Philippe Bancquart CPI 2005.
5.1 URDL22005 Systèmes dexploitation Threads Vue dEnsemble Modèles de Multithreading Problèmes des Threads Pthreads Threads Windows XP Threads Linux Threads.
Les pointeurs Enormément utilisé en C/C++ ! Pourquoi? A quoi ça sert?
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
66 Utilisation des classes et des objets. 6-2 Objectifs A la fin de ce cours, vous serez capables de : Créer de nouvelles classes à laide de Eclipse Utiliser.
Module 51 Module 5 - Synchronisation de Processus (ou threads, ou fils ou tâches) Module 5 - Synchronisation de Processus (ou threads, ou fils ou tâches)
Représentation des systèmes dynamiques dans l’espace d’état
Représentation des systèmes dynamiques dans l’espace d’état
Représentation des systèmes dynamiques dans l’espace d’état
DUMP GAUCHE INTERFERENCES AVEC BOITIERS IFS D.G. – Le – 1/56.
Programmation concurrente
1 Licence dinformatique Algorithmique des graphes Problèmes dordonnancement. Utilisation de ce document strictement réservée aux étudiants de l IFSIC dans.
COURS DE PROGRAMMATION ORIENTEE OBJET :
Programme de baccalauréat en informatique Programmation Orientée Objets IFT Thierry EUDE Module 6. Gestion des erreurs et des exceptions : Fonctionnement.
Chapitre 6 : Synchronisation des processus et des fils
Synchronisation Classique
Systèmes d’exploitation
Structures des données
Traitement de différentes préoccupations Le 28 octobre et 4 novembre 2010.
LES PILES ET FILES.
et quelques rappels sur certains éléments du langage C
Gestion de processus Corrigé TD 1 EFREI I
Les Chiffres Prêts?
Travailler avec des processus
NOTIONS DE BASE DES SYSTÈMES TEMPS-RÉEL Sujets Concepts de processus/thread concurrents –Windows NT et la programmation temps réel Lectures: Chapitres.
Interactions entre Processus
Pthread Ordonnancement. #define _MULTI_THREADED #include #ifndef _CHECK_H #define _CHECK_H /* headers used by a majority of the example program */ #include.
Processus et threads.
Transcription de la présentation:

Communication interprocessus Trois points importants: Comment partager les ressources? Concurrence pour l'utilisation des ressources Synchronisation

Conditions de concurrence Deux processus veulent accéder à la mémoire partagée en même temps. Par exemple: Les processus A et B veulent utiliser la file d’impression. A voit que la prochaine case disponible est 7 puis est remplacé par B B voit que la prochaine case disponible est 7, y place le nom de son fichier, puis est remplacé par A A place le nom de son fichier dans une case qu’il croit libre écrasant le nom donné par B

Sections Critiques (1) L’exclusion mutuelle est une méthode qui permet de s’assurer que si un processus utilise une variable ou un fichier partagé, les autres processus seront exclus de la même activité. Une section critique (ou région critique) est la partie du programme à partir de laquelle on accède à la mémoire partagée.

Sections Critiques (2) Quatre conditions pour obtenir l'exclusion mutuelle: Un seul processus à la fois dans la section critique Aucune supposition sur le nombre et la vitesse des CPUs Aucun processus hors de la section critique ne peut bloquer un autre processus. Aucun processus ne doit attendre indéfiniment pour entrer en section critique.

Exclusion mutuelle à l'aide des sections critiques.

Solutions à l’exclusion mutuelle Désactivation des interruption: Instruction disable On ne peut pas permettre aux usagers d’utiliser une telle instruction Variable de verrou Un processus peut entrer seulement si VERROU=0 Il met alors VERROU=1 pour empêcher les autres processus d’entrer Cette solution ne fonctionne pas!

Proposition de solution au problème de la section critique Alternance stricte Proposition de solution au problème de la section critique (a) Processus 0. (b) Processus 1.

Solution de Peterson (1981) #define FALSE 0 #define TRUE 1 #define N 2 /* nombre de processus */ int turn;  /* à qui le tour ? */ int interested[N];  /* toutes valeurs initialement 0 (FALSE) */ void enter_region(int i) { /* le processus est 0 ou 1 */ int other;  /* nombre des autres processus */ other = 1 - i;  /* l’opposé du processus */ interested[i] = TRUE;  /* montre que i est intéressé */ turn = i;  /* au tour de i */ while (turn == i && interested[other] == TRUE) ; /* instruction null */  } void leave_region(int i) { /* i: processus qui quitte */ interested[process] = FALSE;  /* indique le départ de la section critique */

Solution de Peterson (n processus) // Il y a n processus. Chaque processus doit franchir n-1 niveaux // avant d'accéder à la section critique. int interested[n] // interested[i]=j si le processus i est intéressé a passer au niveau j int turn [n-1] // turn[j]=i si c'est au tour du processus i de passer au niveau j void enter_region(int i) { // Le processus i veut entrer en section critique for j=1 to n-1 do interested[i]=j turn[j]=i L: for k=1 to i-1, i+1 to n if ( (turn[j]==i) and (interested[k]j) ) goto L } void leave_region(int i) { // Le processus i sort de la section critique interested[i]=0;

L'instruction TSL (Test and Set Lock) TSL R, LOCK est une opération atomique équivalente à: R=LOCK LOCK=1 enter_region: TSL REGISTER,LOCK | copie lock dans le registre et le définit à 1 CMP REGISTER,#0 | lock était-il à 0 ? JNE enter_region | s'il n’était pas à 0, boucle RET | retourne à l’appelant ; entre en section critique leave_region: MOVE LOCK,#0 | stocke un 0 dans lock RET | retourne à l’appelant

L'instruction XCHG (Intel x86) XCHG R, LOCK échange le contenu de R et LOCK Cette instruction peut facilement remplacer TSL enter_region: MOVE REGISTER, #1 | Mettre 1 dans REGISTER XCHG REGISTER,LOCK | Échanger REGISTER et LOCK CMP REGISTER,#0 | lock était-il à 0 ? JNE enter_region | s'il n’était pas à 0, boucle RET | retourne à l’appelant ; entre en section critique leave_region: MOVE LOCK,#0 | stocke un 0 dans lock RET | retourne à l’appelant

Opérations Sleep et Wakeup (1) Alternative aux solutions par attente active vues jusqu’à présent. Ex. Problème du producteur-consommateur #define N 100 /* nombre de connecteurs dans le tampon */ int count = 0;  /* nombre d’éléments dans le tampon */ void producteur(void) { int item; while (TRUE) { item = produire_item( );  /* génère l’élément suivant */ if (count == N) sleep( );  /* si le tampon est plein, entre en sommeil */ ajouter_item(item);  /* place l’élément dans le tampon */ count = count + 1;  /* incrémente le décompte des éléments dans le tampon */ if (count == 1) wakeup(consommateur);  /* le tampon était vide ? */ }

Opérations Sleep et Wakeup (2) void consommateur(void) { int item; while (TRUE) { if (count == 0) sleep( );  /* si le tampon est vide, entre en sommeil */ item = enlever_item( );  /* prélève un élément dans le tampon */ count = count - 1;  /* décrémente le décompte des éléments dans le tampon */ if (count == N - 1) wakeup(producteur);  /* le tampon était plein ? */ utiliser_item(item);  /* utilise l’élément */ } Que se passe-t-il si le producteur fait un wakeup entre le moment ou le consommateur constate que le tampon est vide et celui où il appelle sleep?

Les sémaphores: opérations Up et Down (1) Solution de Dijkstra au problème des wakeup perdus. Un sémaphore est une variable partagée entre plusieurs processus et munie de deux nouvelles instruction atomiques: Down(S): if (S==0) sleep S=S-1 Up(S): S=S+1 if (S==1) wakeup() // si des processus sont endormis sur le // sémaphore S alors l’un d’eux sera réveillé

Les sémaphores Résolution au problème du producteur-consommateur. On utilise trois sémaphores: #define N 100 /* nombre d’emplacements dans le tampon */ typedef int semaphore;  /* les sémaphores sont un type de variable int spécial */ semaphore mutex = 1;  /* contrôle l’accès à la section critique */ semaphore empty = N;  /* compte les emplacements vides dans le tampon */ semaphore full = 0;  /* compte les emplacements pleins */ void producer(void){ int item; while (TRUE) { item = produce_item( ); /* génère quelque chose à placer dans le tampon */ down(&empty);  /* décrémente le décompte des emplacements vides */ down(&mutex);  /* entre en section critique */ insert_item(item);  /* place un nouvel élément dans le tampon */ up(&mutex);  /* quitte la section critique */ up(&full);  /* incrémente le décompte des emplacements pleins */ }

Les sémaphores void consumer(void){ int item; while (TRUE) { down(&full);  /* décrémente le décompte des emplacements pleins */ down(&mutex);  /* entre en section critique */ item = remove_item();  /* prélève un élément dans le tampon */ up(&mutex);  /* quitte la section critique */ up(&empty);  /* incrémente le décompte des emplacements vides */ consume_item(item);  /* fait quelque chose avec l’élément */ }

Sémaphores sur Windows HANDLE WINAPI CreateSemaphore( LPSECURITY_ATTRIBUTES lpsa, LONG lInitialCount, // Nombre de ressources initialement disponibles LONG lMaximumCount, // Nombre maximale de ressources LPCTSTR lpName ); DWORD WINAPI WaitForSingleObject( HANDLE hSemaphore, DWORD dwMilliSeconds // Peut être INFINITE BOOL WINAPI ReleaseSemaphore( LONG lReleaseCount, // Nombre de ressources à remettre LPLONG lpPreviousCount // Reçoit le nombre de ressource actuelle);

Sémaphores sur Solaris #include <semaphore.h> sem_t *sem_open( char* nom, // Le premier caractère du nom doit être '/' int oflag // O_CREAT ou O_CREAT | O_EXCL int mode // bits de permission int valeur // valeur initiale ); int sem_wait(sem_t *psem) int sem_post(sem_t *psem) int sem_init( // sémaphore sans nom sem_t * psem, int pshare, // Si non nul, peut être partagé avec d'autres processus int valeur // NULL = Attributs par défaut );

Sémaphores sur Solaris #include <semaphore.h> main() { sem_t my_semaphore; int rc; rc = sem_init(&my_semaphore, 0, 10); … }

mutex_lock et mutex_unlock Les mutex Les mutex sont des sémaphore qui ne peuvent prendre que la valeur 0 ou 1. Ils servent à réaliser l’exclusion mutuel. Voici comment utiliser l’instruction TSL pour implémenter : mutex_lock et mutex_unlock mutex_lock: TSL REGISTER,MUTEX | copie mutex pour enregistrer et définir mutex à 1 CMP REGISTER,#0 | mutex était-il à 0 ? JZE ok | si oui, il n’était pas verrouillé, donc retourne CALL thread_yield | mutex est occupé ; planifie un autre thread JMP mutex_lock | réessaye plus tard ok: RET | retourne à l’appelant ; entrée en section critique mutex_unlock: MOVE MUTEX,#0 | stocké un 0 dans mutex RET | retourne à l’appelant

Mutex sur Solaris #include <pthread.h> pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; int pthread_ mutex_lock(pthread_mutex_t* pm); int pthread_mutex_unlock(pthread_mutex_t* pm); int pthread_mutex_init( // mutex dynamique pthread_mutex_t * pm, const pthread_mutexattr_t *mattr // NULL = Attributs par défaut );

Mutex sur Windows HANDLE WINAPI CreateMutex ( LPSECURITY_ATTRIBUTES lpma, // Pour nos applications ce paramètre // peut être mis à NULL BOOL bInitialOwner, // True pour créer et posséder le mutex LPTSTR lpName // Nom pour partager le mutex avec d'autres processus // ( Peut être NULL) ); DWORD WINAPI WaitForSingleObject( HANDLE hMutext, DWORD dwMilliSeconds // Peut être INFINITE BOOL WINAPI ReleaseMutex( HANDLE hMutex );

Critical Section sur Windows void WINAPI InitializeCriticalSection( LPCRITICAL_SECTION lpCriticalSection ); void WINAPI EnterCriticalSection( BOOL WINAPI InitializeCriticalSectionAndSpinCount( LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount void WINAPI LeaveCriticalSection(

Critical Section sur Windows // Variable globale CRITICAL_SECTION CriticalSection; DWORD WINAPI ThreadProc( LPVOID lpParameter ){ ... EnterCriticalSection(&CriticalSection); ... // Accès à la ressource partagée. LeaveCriticalSection(&CriticalSection); } void main(){ InitializeCriticalSection(&CriticalSection) ... // Création des threads DeleteCriticalSection(&CriticalSection)

Variables conditionelles Permet à un thread de se bloquer non pas à l’entrée d’une région critique mais en fonction d’une certaine condition définie par la valeur d’une variable. Ex. Plusieurs threads se partage une variable P qu’ils incrémentent à tour de rôle. Un des threads veut se bloquer tant que P n’aura pas pas atteint une certaine valeur.

Variables conditionelles sur Windows Vista VOID WINAPI InitializeConditionVariable PCONDITION_VARIABLE cond ); BOOL WINAPI SleepConditionVariableCS( // De façon atomique, bloque et PCONDITION_VARIABLE cond, // relâche la section critique PCRITICAL_SECTION pcs, DWORD millisecond VOID WINAPI WakeConditionVariable( // Débloque un thread bloqué PCONDITION_VARIABLE cond // sur la variable de condition VOID WINAPI WakeAllConditionVariable( // Débloque tous les threads bloqués PCONDITION_VARIABLE cond // sur la variable de condition

Variables conditionelles sur Solaris pthread-cond_t cond = PTHREAD_COND_INITIALIZER; int pthread_cond_wait( pthread_cond_t *cond, pthread_mutex_t *mutex ); int pthread-cond_signal(pthread_cond_t *cond); int pthread_cond_broadcast(pthread_cond_t *cond); int pthread_cond_init( pthread_cond_t *cond, const pthread_condattr_t *attr );

Les barrières Utilisation des barrières Les processus s'approchent de la barrière Tous les processus sauf un sont bloqués Le dernier processus arrive, libérant les autres

Les barrières sur Solaris int pthread_barrier_init(pthread_barrier_t * barrier, const pthread_barrierattr_t * attr, unsigned count); int pthread_barrier_wait(pthread_barrier_t *barrier); int pthread_barrier_destroy(pthread_barrier_t *barrier);

Passage de messages Deux primitives: Send(destination, &message) Receive(source, &message) En l’absence de message disponible, le récepteur peut se bloquer jusqu’à ce que celui-ci arive.

Le problème du producteur-consommateur avec N messages

File d'attente de message sur Solaris #include <sys/msg.h> int msgget( key_t key, //IPC_PRIVATE ou une valeur de clef valide int msgflg ); // bits de permissison ( &IPC_CREAT pour créer la file) struct msgbuf{long mtype, char* mtext} msg; int msgsnd( int msqid, const void *msgp, //pointeur sur le message size_t msgsz, // taille du message int msgflg); // 0 pour suspendre le thread si la file est pleine int msgrcv( int msqid, void *msgp, size_t msgsz, long int mtype, // premier membre de msgbuf int msgflg); // 0 pour suspendre le thread si la file est vide

Le dîner des philosophes (1) Les philosophes mangent et pensent Mangent avec 2 fourchettes Prennet une seule fourchette à la fois Comment prévenir les interbloquages ?

Le dîner des philosophes (2) Cette solution ne fonctione pas

Le dîner des philosophes (3)

Le dîner des philosophes (4)

Le dîner des philosophes (5)

Le problème des lecteurs et des rédacteurs Permet de modéliser les accès aux bases de données. Un processus qui écrit doit avoir un accès exclusif à la base de données Les processus qui lisent n’ont pas besoin dd’un accès exclusif.

Le problème des lecteurs et des rédacteurs

Le problème des lecteurs et des rédacteurs

Le problème du barbier endormi (1)

Le problème du barbier endormi (2)

Le problème du barbier endormi (3)