TD2 Programmation concurrentielle



Documents pareils
Threads. Threads. USTL routier 1

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

Synchro et Threads Java TM

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

Corrigé des exercices sur les références

Un ordonnanceur stupide

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

Introduction : les processus. Introduction : les threads. Plan

Projet de programmation (IK3) : TP n 1 Correction

Notion de thread (1/2)

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

TD3: tableaux avancées, première classe et chaînes

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

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

Programmation par les Objets en Java

INITIATION AU LANGAGE JAVA

TD/TP PAC - Programmation n 3

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

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Package Java.util Classe générique

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Problèmes liés à la concurrence

Remote Method Invocation Les classes implémentant Serializable

TD/TP PAC - Programmation n 3

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

TP1 : Initiation à Java et Eclipse

Introduction à la programmation concurrente

Développement Logiciel

Java Licence Professionnelle CISII,

Objets et Programmation. origine des langages orientés-objet

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

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Premiers Pas en Programmation Objet : les Classes et les Objets

Applet pour visualiser les variables «automate» notifiées

Auto-évaluation Programmation en Java

OpenPaaS Le réseau social d'entreprise

Programmation Par Objets

Une introduction à Java

Projet gestion d'objets dupliqués

Par Laurent DESECHALLIERS. Mastère Spécialisé en Management de Projets en Milieu Industriel. CESI de Rouen Promotion 2002/2003.

Calcul Parallèle. Cours 5 - JAVA RMI

Corrigés des premiers exercices sur les classes

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

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

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

Programmer en JAVA. par Tama

Composants Logiciels. Le modèle de composant de CORBA. Plan

IFT287 Exploitation de base de données relationnelles et orientées objet. Laboratoire Mon premier programme Java en Eclipse

ACTIVITÉ DE PROGRAMMATION

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

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

Chapitre 10. Les interfaces Comparable et Comparator 1

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

as Architecture des Systèmes d Information

Programme Compte bancaire (code)

2. Comprendre les définitions de classes

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

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

TP, première séquence d exercices.

Plan du cours. Historique du langage Nouveautés de Java 7

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

Utiliser Java sans BlueJ

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

Flux de données Lecture/Ecriture Fichiers

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Généralités sur le Langage Java et éléments syntaxiques.

PIGOURIER Vincent ANNEE SPECIALE 99/00 RAPPORT DE PROJET : LES THREADS JAVA. Responsable : Serge Rouveyrol

[APPLICATON REPARTIE DE VENTE AUX ENCHERES]

THE LAW SOCIETY OF UPPER CANADA BY-LAW 19 [HANDLING OF MONEY AND OTHER PROPERTY] MOTION TO BE MOVED AT THE MEETING OF CONVOCATION ON JANUARY 24, 2002

Dis papa, c est quoi un bus logiciel réparti?

Cheque Holding Policy Disclosure (Banks) Regulations. Règlement sur la communication de la politique de retenue de chèques (banques) CONSOLIDATION

La JVM. La machine virtuelle Java. La JVM. La JVM

Langage Java. Classe de première SI

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Remote Method Invocation (RMI)

Design patterns. Design patterns - définition. Design patterns - avantages

Tp 1 correction. Structures de données (IF2)

RMI le langage Java XII-1 JMF

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

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

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

Alfstore workflow framework Spécification technique

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

Exercices sur les interfaces

Java Licence Professionnelle CISII,

PROGRAMMATION PAR OBJETS

Instructions Mozilla Thunderbird Page 1

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

Java RMI. Arnaud Labourel Courriel: Université de Provence. 8 mars 2011

Initiation à JAVA et à la programmation objet.

LOG4430 : Architecture logicielle et conception avancée

CLIM/GTP/27/8 ANNEX III/ANNEXE III. Category 1 New indications/ 1 re catégorie Nouvelles indications

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

Transcription:

TD2 Programmation concurrentielle Développement Logiciel (L2-S4) Lundi 10 février 2014 Exercice 1 (Au bar...) Trois clients se trouvent au bar. Il est tard, ils sont fatigués, et ils s endorment sur le bar. Chacun se réveille après s être brièvement assoupi pendant une durée aléatoire comprise entre 0 et 1000 millisecondes (que vous pouvez obtenir avec Thread.sleep((int)(Math.random()*1000))). Au réveil, chaque client demande ce qu il veut : un Java (beurk), un Expresso (miam) ou un Cappucino (miam miam). Et parce qu il est si fatigué, il s assoupit à nouveau pour une durée aléatoire entre 0 et 1000 millisecondes. Malheureusement, le serveur s est également assoupi, et chaque client va abandonner le bar, profondément frustré, à la cinquième demande. Le compte-rendu d une soirée se présente de la manière suivante : Java! Cappuccino! Java!! Cappuccino!! Espresso! Cappuccino!!! Java!!! Cappuccino!!!! Espresso!! Cappuccino!!!!! Java!!!! Espresso!!! Espresso!!!! Java!!!!! Espresso!!!!! Ecrivez un programme qui modélise ces clients (fatigués et assoiffés) et le serveur (peu coopératif). Solution : Client.java package bar; class Client extends Thread { String text; 1

public Client(String text) { this.text = text; public void run() { for(int i = 0; i < 5; i++) { sleep((int)(math.random()*1000)); this.text = this.text + "!"; System.out.println(text); Client.java package bar; public class Bar { public static void main(string args[]) { Client java, espresso, capuccino; java = new Client("Java"); espresso = new Client("Espresso"); capuccino = new Client("Cappuccino"); java.start(); espresso.start(); capuccino.start(); 2

Exercice 2 (Une banque pas très fiable...) Une banque très (trop) simple à été implémentée avec la classe suivante : class SimpleBank { static int[] account = {30, 50, 100; public void transfer(int from, int to, int amount) { int namount; namount = account[from]; namount -= amount; //... difficult task of non-deterministic length account[from] = namount; namount = account[to]; namount += amount; account[to] = namount; public void balance() { for(int i = 0; i < account.length; i++) System.out.println("Account "+ i +": " + account[i]); Des employés qui travaillent dans la banque (une autre classe Employee). Le travail d un employé consiste à transférer une somme d argent amount du compte from vers le compte to. 1. Définissez ces deux classes, ainsi qu une classe SimpleBankDemo (contenant la méthode main) qui crée la banque avec trois employés et qui organise un transfert cyclique de 20 EUR entre les différents comptes de la banque (chaque employé est responsable pour le transfert entre deux comptes particuliers). 2. Réalisez trois différentes exécutions de SimpleBankDemo.main, et observez les différentes balances résultant de cette implémentation. 3. Que constatez-vous? Comment corriger ce problème? Solution : SimpleBank.java class SimpleBank { static int[] account = {30, 50, 100; public void transfer(int from, int to, int amount) { int namount; namount = account[from]; namount -= amount; 3

// race condition, since new amount is not yet booked Thread.sleep((int)Math.random()*1000); account[from] = namount; namount = account[to]; namount += amount; // dito account[to] = namount; public void balance() { for(int i = 0; i < account.length; i++) System.out.println("Account "+ i +": " + account[i]); Employee.java class Employee extends Thread { SimpleBank bank; int from, to, amt; public Employee(SimpleBank bank, int from, int to, int amount) { this.bank = bank; this.from = from; this.to = to; this.amt = amount; public void run() { // do money transfer bank.transfer(from, to, amt); // print balance System.out.println(""); bank.balance(); SimpleBankDemo.java public class SimpleBankDemo { public static void main(string[] args) { Employee A1, A2, A3; SimpleBank b = new SimpleBank(); 4

System.out.println("Before:"); b.balance(); // A cyclic transfer of 20 bucks... A1 = new Employee(b, 0, 1, 20); A2 = new Employee(b, 1, 2, 20); A3 = new Employee(b, 2, 0, 20); A1.start(); A2.start(); A3.start(); Traces : Before: Account 0: 10 Account 1: 70 Account 2: 100 Account 0: 10 Account 1: 30 Account 2: 120 Account 0: 30 Account 1: 30 Account 2: 80 Before: Account 0: 10 Account 1: 70 Account 2: 100 Before: Account 0: 30 Account 1: 30 Account 2: 120 Account 0: 50 Account 1: 30 Account 2: 80 Account 0: 10 Account 1: 50 Account 2: 80 Traces : Reparation : Soit introduction d un LOCK-object qui met la section critique l intérieur de la methode transfer dans une partie de code non-interlacé : class SimpleBank { static int[] account = {30, 50, 100; final static Object LOCK = new Object(); public void transfer(int from, int to, int amount) { int namount; synchronized(lock) { 5

namount = account[from]; namount -= amount; // race condition, since new amount is not yet booked Thread.sleep((int)Math.random()*1000); account[from] = namount; namount = account[to]; namount += amount; // dito account[to] = namount; public void balance() { for(int i = 0; i < account.length; i++) System.out.println("Account "+ i +": " + account[i]); ou tout simplement : public synchronized void transfer(int from, int to, int amount) { turns the method into a monitor, i.e. some un-interuptable, non-interleaveable atomic instruction sequence! Par contre, la dernière version a l inconvénient suivant : on ne peut pas redéfinir la méthode sans avoir le core globalement atomique... 6

public void balance() { for(int i = 0; i < account.length; i++) System.out.println("Account "+ i +": " + account[i]); ou tout simplement : public synchronized void transfer(int from, int to, int amount) { turns the method into a monitor, i.e. some un-interuptable, non-interleaveable atomic instruction sequence! Par contre, la dernière version a l inconvénient suivant : on ne peut pas redéfinir la méthode sans Exercice 3 (Les 5 philosophes...) avoir le core globalement atomique... Dans la programmation concurrentielle, une fois le problème de l accès synchronisé aux ressources (attributs, listes, etc.) résolu, d autres problèmes surgissent. En voici un exemple Exercise 3 (Les 5 philosophes...) classique : Dans la programmation concurrentielle, une fois le problème de l accès synchronisé sur des ressources est résolu, il y d autres problèmes. Regardez cette exemple classique : Cinq philosophes alternativement pensent et mangent. Pour manger, un philosophe doit acquérir deux fourchettes : celui de sa gauche et de sa droite. Pour des raisons de précarité, il n y a que 5 fourchettes, une entre chaque philosophe... Cinq philosophes alternativement pensent et mangent. Pour manger, un philosophe doit acquérier deux fourchettes : celui de sa gauche et de sa droite. Pour de raisons de la précarité, il n y a que 5 fourchettes, une entre chaque philosophe... Essayez une solution qui au moins synchronise l accès au fourchettes... Par exemple, on peu observer la trace : Proposez une solution qui synchronise l accès aux fourchettes en implémentant une classe Fork (fourchette en français) et une classe Philosopher (philosophe en français). La classe Fork devra avoir une méthode permettant à une instance de Philosopher de saisir la fourchette. Une classe PhilosopherDemo mettra en œuvre ces classes dans sa méthode main en créant 5 instances de Fork et 5 instances de Philosopher. There they go... Philosopher 0 starts thinking. Philosopher 1 starts thinking. Philosopher 2 starts thinking. Philosopher 3 starts thinking. Philosopher 4 starts thinking. Philosopher 0 starts eating. Fork 0 grabbed by philo 0. Voici un exemple du résultat d exécution : There they go... Philosopher 0 starts thinking. Philosopher 1 starts thinking. Philosopher 2 starts thinking. Philosopher 3 starts thinking. Philosopher 4 starts thinking. Philosopher 0 starts eating. Fork 0 grabbed by philo 0. Fork 1 grabbed by philo 0. Philosopher 1 starts eating. Philosopher 2 starts eating. Fork 2 grabbed by philo 2. Fork 3 grabbed by philo 2. Philosopher 3 starts eating. Fork 0 released by philo 0. Fork 1 released by philo 0. Philosopher 0 starts thinking. 6 Que constatez-vous? Comment s appelle ce phénomène et comment l expliquez-vous? Solution : 7

Fork : public class Fork { final Object LOCK = new Object(); private boolean status = false; /* ungrabbed */ private int id; public Fork(int id) { this.id = id; public void grab(int philoid) { synchronized(lock) { while (status) {LOCK.wait(); status=true; System.out.println("Fork "+id+" grabbed by philo "+philoid+"."); public void release(int philoid) { synchronized(lock) { if (!status) {System.out.println("Program Error: Release of Fork not grabbed!"); System status=false; System.out.println("Fork "+id+" released by philo "+philoid+"."); LOCK.notifyAll(); /* necessary since two neighbors may wait, so all philosophers holding a lock must be informed... */ Philosopher : public class Philosopher extends Thread{ private int id; private Fork [] forks; public Philosopher(int id,fork[] forks){ this.id = id; this.forks = forks; public void run() { while(true){ // THINK System.out.println("Philosopher "+id+" starts thinking."); Thread.sleep((int)Math.random()*10000); 8

System.out.println("Philosopher "+id+" starts eating."); forks[id].grab(id); forks[(id+1) % 5].grab(id); // EAT Thread.sleep((int)Math.random()*10000); forks[id].release(id); forks[(id+1) % 5].release(id); PhilosopherDemo : public class PhilosopherDemo { public static void main(string[] args) { final Fork [] forks = {new Fork(0), new Fork(1), new Fork(2), new Fork(3), new Fork(4); // Creation of Philosophers Philosopher A0 = new Philosopher(0, forks); Philosopher A1 = new Philosopher(1, forks); Philosopher A2 = new Philosopher(2, forks); Philosopher A3 = new Philosopher(3, forks); Philosopher A4 = new Philosopher(4, forks); System.out.println("There they go..."); A0.start(); A1.start(); A2.start(); A3.start(); A4.start(); Le problème qu on observe, sooner or later, s appelle blocage. 9