Problèmes liés à la concurrence

Documents pareils
Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Introduction à la programmation concurrente

4. Outils pour la synchronisation F. Boyer, Laboratoire Lig

Les processus légers : threads. Système L3, /31

Cours de Systèmes d Exploitation

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

On appelle variable condition une var qui peut être testée et

4. Outils pour la synchronisation F. Boyer, Laboratoire Sardes

Synchro et Threads Java TM

Introduction : les processus. Introduction : les threads. Plan

Exercices INF5171 : série #3 (Automne 2012)

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

INTRODUCTION À LA PROGRAMMATION CONCURRENTE

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Un ordonnanceur stupide

LOG4430 : Architecture et conception avancée

Introduction aux systèmes temps réel. Iulian Ober IRIT

École Polytechnique de Montréal. Département de Génie Informatique et Génie Logiciel. Cours INF2610. Contrôle périodique.

Cours 2: Exclusion Mutuelle entre processus (lourds, ou légers -- threads)

Threads. Threads. USTL routier 1

Exécutif temps réel Pierre-Yves Duval (cppm)

INITIATION AU LANGAGE JAVA

Programmer en JAVA. par Tama

Java Licence Professionnelle CISII,

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Ordonnancement temps réel

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Une introduction à la technologie EJB (2/3)

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Conception des systèmes répartis

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Projet de programmation (IK3) : TP n 1 Correction

ACTIVITÉ DE PROGRAMMATION

Développement Logiciel


TD2 Programmation concurrentielle

TD2/TME2 : Ordonnanceur et Threads (POSIX et fair)

Package Java.util Classe générique

NIVEAU D'INTERVENTION DE LA PROGRAMMATION CONCURRENTE

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Systèmes d exploitation Gestion de processus

Programmation d Applications Concurrentes et Distribuées (INF431)

Notion de thread (1/2)

Noyau de concurrence par moniteur pour Java ou C# pour une autre sémantique plus fiable et plus performante

Sixième partie. Programmation multi-activités Java & Posix Threads. Généralités Java Threads POSIX Threads Autres approches

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

M2-Images. Rendu Temps Réel - OpenGL 4 et compute shaders. J.C. Iehl. December 18, 2013

Programmation C++ (débutant)/instructions for, while et do...while

Initiation au HPC - Généralités

Utilisation d objets : String et ArrayList

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Projet gestion d'objets dupliqués

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Les Threads. Sommaire. 1 Les Threads

1 Mesure de la performance d un système temps réel : la gigue

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

DAns un système d exploitation multiprogrammé en temps partagé, plusieurs

Cours d algorithmique pour la classe de 2nde

Gestion distribuée (par sockets) de banque en Java

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Gestion des processus

Cours 1 : La compilation

Programme Compte bancaire (code)

Temps Réel. Jérôme Pouiller Septembre 2011

Développement d un logiciel de messagerie instantanée avec Dotnet (version simplifiée)

Introduction à la Programmation Parallèle: MPI

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Cours Programmation Système

Java Licence Professionnelle CISII,

Apprendre la Programmation Orientée Objet avec le langage Java (avec exercices pratiques et corrigés)

Performances de la programmation multi-thread

Support de cours système d exploitation

Programmation Orientée Objet - Licence TIS CM8/9. Rappel sur la séance précédente. Lancelot Pecquet Lancelot.Pecquet@math.univ-poitiers.

Introduction au langage C

Métriques de performance pour les algorithmes et programmes parallèles

Une introduction à Java

NFP 121. Java et les Threads. Présentation : Thierry Escalarasse Mai 2007

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Ensimag 1ère année Algorithmique 1 Examen 2ième session 24 juin Algorithmique 1

Les transactions 1/46. I même en cas de panne logicielle ou matérielle. I Concept de transaction. I Gestion de la concurrence : les solutions

Programmation système en C/C++

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

REALISATION d'un. ORDONNANCEUR à ECHEANCES

Le langage C. Séance n 4

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Le prototype de la fonction main()

Examen Médian - 1 heure 30

Chapitre VI- La validation de la composition.

Auto-évaluation Programmation en Java

Chapitre 2. Les processus. 2.1 Introduction. 2.2 les différents états d un processus

Programmation avec des objets : Cours 7. Menu du jour

Cours Bases de données 2ème année IUT

Chapitre 10. Les interfaces Comparable et Comparator 1

Travaux Pratiques de Commande par ordinateur 1 TRAVAUX PRATIQUES

Transcription:

ENS Cachan

Problématique Difficile de gérer la concurrence : Pas toujours facile d avoir des fonctions réentrantes. Risque de race condition : ex : x :=x+1 x :=x+1 On voudrait des blocs d instructions atomiques. Notion de région critique : enter critic() enter critic() x :=x+1 x :=x+1 exit critic() exit critic() Aujourd hui : comment faire enter critic() et exit critic()?

Problème de l exclusion mutuelle Garantir qu un seul thread est en région critique à la fois. Oui, mais... Quelques contraintes supplémentaires : Eviter un interblocage enter critic1() enter critic2() enter critic2() enter critic1() x :=x+1 x :=x+1 exit critic2() exit critic1() exit critic1() exit critic2() Question Comment éviter simplement ces interblocages de sections critiques répertoriées? Garantir équité, absence de famine si je demande, je pourrai (un jour) rentrer en section critique Notion subtile, quelles conditions sur les autres? Lien avec les jeux : pas de stratégie gagnante, si bloquer l autre=gagner, coalitions possibles,...

La synchronisation par verrou pthread_t tid[3] ; int compteur = 0 ; void *annexe(void *ordre) { int boucle ; for(boucle = 0 ; boucle < 10E30 ; boucle++){ compteur++ ; // section critique ici return NULL ; main() { [...] pthread_create(tid + {0,1,2, NULL, annexe, NULL) ; [...] printf("valeur de compteur à la fin : %d",compteur) ;

La synchronisation par verrou pthread_t tid[3] ; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER ; int compteur = 0 ; void *annexe(void *ordre) { int boucle ; for(boucle = 0 ; boucle < 10E30 ; boucle++){ pthread_mutex_lock(&mutex) ; compteur++ ; // section critique ici pthread_mutex_unlock(&mutex) ; return NULL ; main() { [...] pthread_create(tid + {0,1,2, NULL, annexe, NULL) ; [...] printf("valeur de compteur à la fin : %d",compteur) ;

Un exemple de problème : producteurs/consomateurs Données : un buffer de taille bornée méthodes add et get concurrentes et bloquantes méthode add 1)vérifier que le buffer n est pas plein......sinon attendre. 2) ajouter méthode get 1)vérifier que le buffer n est pas vide......sinon attendre. 2) enlever Analyse : section critique complexe, entrée dépend d une condition

Producteurs/consommateurs avec variables de condition int buffersize ; condition notfull, notempty ; mutex m ; Producteur void add(){ if (buffsize==maxbuf) wait(notfull) ; acquire(m) ; buffsize++ ; release(m) ; if (buffsize==1) signal(notempty) Consomateur void get(){ if (buffsize==0) wait(notempty) ; acquire(m) ; buffsize-- ; release(m) ; if (buffsize==maxbuf-1) signal(notfull)

Producteurs/consommateurs avec variables de condition int buffersize ; condition notfull, notempty ; mutex m ; Producteur void add(){ if (buffsize==maxbuf) wait(notfull) ; acquire(m) ; buffsize++ ; release(m) ; if (buffsize==1) signal(notempty) Consomateur void get(){ if (buffsize==0) wait(notempty) ; acquire(m) ; buffsize-- ; release(m) ; if (buffsize==maxbuf-1) signal(notfull) Problème : signal perdu si non attendu famine!

Les sémaphores Problématique Idée : utiliser un entier comme verrou. sémaphore s : entier 0 V(s) : incrémente s. P(s) : décrémente s bloquant. Question Quels sont les affichages possibles pour le programme suivant : init sem(s,2) ; P(s) ;P(s) ; P(s) ; P(s) ; print("a") ; print("b1") ; print("c1") ; print("b2") ; print("c2") ; V(s) ;V(s) ; V(s) ; V(s) ;

Producteurs/consommateurs avec semaphores Semaphores : la solution au signal perdu. semaphore bufferused =0 ; semaphore bufferfree =MAXSIZE ; Producteur void add(){ P(bufferfree) ; V(bufferused) Consomateur void get(){ P(bufferused) ; V(bufferfree)

Moniteurs de Hoare Problématique Définir l exclusion mutuelle dans une construction du programme Un moniteur est une entité qui contient des variables = ressources partagées en accès concurrent des procédures = méthodes en exclusion mutuelles des conditions synchronisation à la charge du compilateur. Un langage qui implémente les moniteurs : JAVA. static class our monitor { private int buff[3] ; public synchronized void rotate left(){wait() ;.. ; public synchronized void rotate right(){wait() ;.. ; public synchronized void set first(int i){buff[0]=i ; notify() public int get first(){..

Moniteurs de Hoare Problématique Définir l exclusion mutuelle dans une construction du programme Un moniteur est une entité qui contient des variables = ressources partagées en accès concurrent des procédures = méthodes en exclusion mutuelles des conditions synchronisation à la charge du compilateur. Un langage qui implémente les moniteurs : JAVA. static class our monitor { private int buff[3] ; public synchronized void rotate left(){wait() ;.. ; public synchronized void rotate right(){wait() ;.. ; public synchronized void set first(int i){buff[0]=i ; notify() public int get first(){..

Moniteurs de Hoare Problématique Définir l exclusion mutuelle dans une construction du programme Un moniteur est une entité qui contient des variables = ressources partagées en accès concurrent des procédures = méthodes en exclusion mutuelles des conditions synchronisation à la charge du compilateur. Un langage qui implémente les moniteurs : JAVA. static class our monitor { private int buff[3] ; public synchronized void rotate left(){wait() ;.. ; public synchronized void rotate right(){wait() ;.. ; public synchronized void set first(int i){buff[0]=i ; notify() public int get first(){..

Moniteurs de Hoare Problématique Définir l exclusion mutuelle dans une construction du programme Un moniteur est une entité qui contient des variables = ressources partagées en accès concurrent des procédures = méthodes en exclusion mutuelles des conditions synchronisation à la charge du compilateur. Un langage qui implémente les moniteurs : JAVA. static class our monitor { private int buff[3] ; public synchronized void rotate left(){wait() ;.. ; public synchronized void rotate right(){wait() ;.. ; public synchronized void set first(int i){buff[0]=i ; notify() public int get first(){..

Producteurs/consomateurs avec un moniteur de Hoare monitor ProdCons condition notfull, notempty ; integer count ; procedure add ; begin if count = N then wait(notfull) ; count := count+1 ; if count = 1 then signal(notempty) end procedure get ; begin if count = 0 then wait(notempty) ; count := count-1 ; if count = N-1 then signal(notfull) end end monitor ; Question Pourquoi cette solution marche, et pas celle avec des conditions?

Sans aide du système, comment écrire une entrée en section critique? Quelques (mauvaises) idées : désactivation des interruptions instruction TSL : enter = while(testandset(v,1)==1) (). exit = v=0 ; alternance stricte : while (v==1) () ; while (v==2) () ; critic1() ; critic2() ; v=2 ; v=1 ; Question En quoi ces solutions ne sont-elles pas complètement satisfaisantes?

Sans aide du système, comment écrire une entrée en section critique? Quelques (mauvaises) idées : désactivation des interruptions sécurité système, multiprocesseur instruction TSL : enter = while(testandset(v,1)==1) (). exit = v=0 ; attente active, multiprocesseur alternance stricte : while (v==1) () ; while (v==2) () ; critic1() ; critic2() ; v=2 ; v=1 ; nb threads connu, équité, attente active, multiprocesseur Question En quoi ces solutions ne sont-elles pas complètement satisfaisantes?

La solution de Peterson Comment faire un verrou sans instruction TSL? int turn ; int interested[2] ; void enter_critic(int pid){ turn = i ; interested[pid] = true ; while((turn==pid)&&(interested[1-pid])) ; void exit_critic(int pid){ interested[pid]=false ; Defaut : attente active, nb threads fixe.

Proble matique Me canismes de synchronisation Quelques proble mes classiques Le dı ner des philosophes Le proble me penser ou manger deux fourchettes pour manger pas de paroles pas d interblocage pas de famine Proble mes lie s a la concurrence

Lecteurs et rédacteurs. Le problème La ressource partagée : un texte. Plusieurs lecteurs peuvent y accéder en même temps. Si un rédacteur y accède, personne d autre n y accède. Pas d interblocage, pas de famine Question Si un lecteur accèdent immédiatement au texte dès qu aucun rédacteur n y accède, où est le problème?

Le coiffeur endormi Le problème Un salon de coiffure Un thread coiffeur Des threads clients Salle d attente avec N chaises Client attend, si pas possible repart Si personne, le coiffeur s endort.

Pour aller plus loin... Comment prouver rigoureusement que des algorithmes multithreads sont corrects? La modélisation par automates : on modélise le programme par un automate (graphe de contrôle), la composition parallèle est le produit asynchrone des automates, on regarde des propriétés sur le langage reconnu (par exemple, pour l équité, on aura souvent une condition de Buchi). Les invariants de resource On doit le préserver entre l entrée et la sortie de section critique. Les interférences et le rely-guarantee On fait l hypothèse de toutes les instructions qui peuvent interférer à tout moment, et on garantit qu on fera au plus telles instructions. Circularité de l implication : x y y x x y