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



Documents pareils
Introduction à la programmation concurrente

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

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

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

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

Introduction : les processus. Introduction : les threads. Plan

Problèmes liés à la concurrence

Notion de thread (1/2)

Synchro et Threads Java TM

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

INITIATION AU LANGAGE JAVA

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

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

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

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

LOG4430 : Architecture et conception avancée

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

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

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

Threads. Threads. USTL routier 1

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

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

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

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

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

IRL : Simulation distribuée pour les systèmes embarqués

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

Java - la plateforme

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

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Projet gestion d'objets dupliqués

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

Conditions : stage indemnisé, aide au logement possible, transport CEA en Ile-de-France gratuit.

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

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

Programmation Par Objets

Génie Logiciel avec Ada. 4 février 2013

Programmer en JAVA. par Tama

Développement Logiciel

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

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

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

TD2 Programmation concurrentielle

Performances de la programmation multi-thread

Une introduction à Java

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

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

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

Remote Method Invocation Les classes implémentant Serializable

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

Conception de circuits numériques et architecture des ordinateurs

Introduction aux Machines Virtuelles avec VMKit

Auto-évaluation Programmation en Java

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

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

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

Corrigé des exercices sur les références

Un ordonnanceur stupide

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

Ordonnancement temps réel

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Processus! programme. DIMA, Systèmes Centralisés (Ph. Mauran) " Processus = suite d'actions = suite d'états obtenus = trace

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Programmation Orientée Objet Java

Machines virtuelles. Brique ASC. Samuel Tardieu Samuel Tardieu (ENST) Machines virtuelles 1 / 40

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

Java Licence Professionnelle CISII,

Modèle à composants. Daniel Hagimont. IRIT/ENSEEIHT 2 rue Charles Camichel - BP TOULOUSE CEDEX 7. Remerciements

Chapitre 10. Les interfaces Comparable et Comparator 1

TD/TP PAC - Programmation n 3

4. Groupement d objets

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

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

Alfresco Guide Utilisateur

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

Programmation d Applications Concurrentes et Distribuées (INF431)

INF 321 : mémento de la syntaxe de Java

TP1 : Initiation à Java et Eclipse

TP3 : Creation de tables 1 seance

Machines Virtuelles. et bazard autour. Rémi Forax

2 Chapitre 1 Introduction

Etude de l ENT de l Université de Paris 5. Mise en place d outils de suivi de la charge de l ENT (monitoring)

Java 1.5 : principales nouveautés

GOL-502 Industrie de services. Travaux Pratique / Devoir #7

Héritage presque multiple en Java (1/2)

Introduction à la Programmation Parallèle: MPI

Université Bordeaux 1, Licence Semestre 3 - Algorithmes et struct...

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données

La Programmation Orientée Agent Les Agents Réactifs

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

Présentation. Au programme. Fonctionnement. A l issue de ce module vous devriez...

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

I. Introduction aux fonctions : les fonctions standards

Chapitre 2. Classes et objets

Une introduction à la technologie EJB (2/3)

Le modèle de sécurité windows

Langage Java. Classe de première SI

Transcription:

Exercices INF5171 : série #3 (Automne 2012) 1. Un moniteur pour gérer des ressources Le moniteur MPD 1 présente une première version d'un moniteur, exprimé en pseudo-mpd, pour gérer des ressources le nombre de ressources à gérer est spécié au moment de la création du moniteur. Le désavantage de cette version est qu'un thread pourrait tenter de libérer des ressources... qu'il n'a pas obtenues, par exemple : OK : obtenir( 4 );...; liberer( 3 );...; liberer( 1 ); Pas OK : obtenir( 4 );...; liberer( 3 );...; liberer( 2 ); Le moniteur MPD 2 présente une deuxième version, qui permet cette fois d'assurer qu'un thread ne libère pas incorrectement des ressources qu'il n'a pas acquises. Pour simplier, on utilise simplement une assertion pour vérier que le Permis obtenu possède encore les ressources allouées. L'interface Java 1 dénit un type GestionnaireRessources pour lequel nous examinerons diérentes mises en oeuvre. a. La classe Java 1 présente un squelette pour une classe GestionnaireMoniteur qui met en oeuvre l'interface GestionnaireRessources en utilisant uniquement les primitives du langage Java mot-clé synchronized, méthodes wait et notifyall. b. La classe Java 2 présente un squelette pour une classe GestionnaireSem qui met en oeuvre l'interface GestionnaireRessources en utilisant la classe Semaphore dénie dans la bibliothèque java.util.concurrent. c. La classe Java 3 présente un squelette pour une classe GestionnaireCond qui met en oeuvre l'interface GestionnaireRessources en utilisant l'interface et les classes Lock, ReentrantLock et Condition de la bibliothèque java.util.concurrent. Complétez chacune de ces classes. 1

Moniteur MPD 1 Une première version d'un moniteur pour gérer des ressources. monitor GestionnaireRessources op obtenir( int n ); op liberer( int n ); body GestionnaireRessources( int nbressources ) cond attente; int nbdisponibles = nbressources; proc obtenir( n ) assert( 1 <= n & n <= nbressources ); while ( n > nbdisponibles ) wait(attente); nbdisponibles -= n; proc liberer( n ) assert( 1 <= n ); nbdisponibles += n; signal_all( attente ); end 2

Moniteur MPD 2 Une deuxième version d'un moniteur pour gérer des ressources. monitor GestionnaireRessources type Permis; # Type prive, opaque. op obtenir( int n ) returns Permis p op liberer( Permis p, int n ); body GestionnaireRessources( int nbressources ) type Permis = ptr int; cond attente; int nbdisponibles = nbressources; proc obtenir( n ) returns p assert( 1 <= n & n <= nbressources ); end while ( n > nbdisponibles ) wait(attente); nbdisponibles -= n; p = new(int); p^ = n; proc liberer( p, n ) assert( 1 <= n & n <= p^ ); nbdisponibles += n; p^ -= n; signal_all( attente ); Interface Java 1 Interface GestionnaireRessources. interface GestionnaireRessources public Permis obtenir( int n ); void liberer( Permis p, int n ); 3

Classe Java 1 Classe GestionnaireMoniteur. class GestionnaireMoniteur implements GestionnaireRessources private int nbressources; private int nbdisponibles; GestionnaireMoniteur( int nbressources ) this.nbressources = nbressources; this.nbdisponibles = nbressources; class PermisPrive implements Permis private int qte; PermisPrive( int n ) this.qte = n; public int quantite() return qte; synchronized public Permis obtenir( int n ) assert( 1 <= n && n <= nbressources ); synchronized public void liberer( Permis p, int n ) assert( 1 <= n && n <= p.quantite() ); 4

Classe Java 2 Classe GestionnaireSem. import java.util.concurrent.*; class GestionnaireSem implements GestionnaireRessources Semaphore sem; private int nbressources; GestionnaireSem( int nbressources ) this.nbressources = nbressources; this.sem = new Semaphore( nbressources ); class PermisPrive implements Permis private int qte; PermisPrive( int n ) this.qte = n; public int quantite() return qte; public Permis obtenir( int n ) assert( 1 <= n && n <= nbressources ); public void liberer( Permis p, int n ) assert( 1 <= n && n <= p.quantite() ); 5

Classe Java 3 Classe GestionnaireCond. import java.util.concurrent.locks.*; class GestionnaireCond implements GestionnaireRessources Lock mutex = new ReentrantLock(); Condition disponible = mutex.newcondition(); private int nbressources; private int nbdisponibles; GestionnaireCond( int nbressources ) this.nbressources = nbressources; this.nbdisponibles = nbressources; class PermisPrive implements Permis private int qte; PermisPrive( int n ) this.qte = n; public int quantite() return qte; public Permis obtenir( int n ) assert( 1 <= n && n <= nbressources ); public void liberer( Permis p, int n ) assert( 1 <= n && n <= p.quantite() ); 6

2. Un moniteur pour gérer des piles L'interface Java 2 dénit un type Pile pour lequel nous examinerons diérentes mises en oeuvre sous forme de moniteur. Comme pour l'exercice précédent, la description initiale du moniteur sera donnée par un monitor exprimé en pseudo-mpd. On dit d'un type de données modélisant une forme de collection un regroupement d'éléments du même type, par exemple, ensembles, séquences, piles qu'il permet de dénir des collections bornées lorsqu'il existe une limite a priori sur le nombre d'éléments que peut contenir la collection, limite généralement spéciée au moment de la création de la collection. Lorsqu'aucune limite n'existe a priori (sauf, évidemment, l'espace mémoire disponible sur la machine ;), on dit alors que le type permet de dénir des collections non bornées. Le moniteur MPD 3 présente un moniteur MPD pour gérer des piles non bornées pouvant être utilisées par des threads. Lorsqu'un thread tente d'obtenir un élément de la pile avec depiler et que la pile est vide, alors le thread bloque jusqu'à ce qu'un élément soit empilé. Comme il n'y a pas de limite sur le nombre d'éléments pouvant être empilés, alors l'opération empiler ne bloque jamais. Quant au moniteur MPD 4, il présente un moniteur MPD pour gérer des piles bornées. Comme pour les piles non bornées, un thread qui tente d'obtenir un élément lorsque la pile est vide bloque jusqu'à ce qu'un élément soit empilé. Par contre, Comme il y a une limite sur le nombre d'éléments pouvant être empilés, alors un thread qui tente d'empiler alors que la pile est pleine va bloquer, jusqu'à ce qu'un élément ait été retiré. Remarques : De telles piles pourraient être utilisées pour mettre en oeuvre un sac de tâches avec une stratégie LIFO. Pour être complet, il aurait aussi été préférable de dénir une opération pour déterminer si la pile est vide, ou encore pour tenter de dépiler et ne pas bloquer si elle est vide. Toutefois, pour simplier l'exemple, seules les opérations empiler et depiler seront examinées. Un certain nombre de squelettes de classe vous sont fournis, que vous devez compléter : a. La classe Java 4 présente un squelette pour une classe PileNonBornee qui met en oeuvre l'interface Pile avec des piles non bornées et ce en utilisant uniquement les primitives du langage Java mot-clé synchronized, méthodes wait et notifyall. b. La classe Java 5 présente un squelette pour une classe PileBornee qui met en oeuvre l'interface Pile avec des piles bornées et ce en utilisant l'interface et les classes Lock, ReentrantLock et Condition de la bibliothèque java.util.concurrent. c. La classe Java 6 présente un squelette pour une classe PileBornee qui met en oeuvre l'interface Pile avec des piles bornées et ce en utilisant les Semaphores de la bibliothèque java.util.concurrent. pile-bornee-sem.java d. La classe Java 7 présente un squelette pour une classe PileBornee qui met en oeuvre l'interface Pile avec des piles bornées et ce en utilisant uniquement les primitives du langage Java mot-clé synchronized, méthodes wait et notifyall. Remarque : Malheureusement, cette classe ne fonctionnera pas, à moins d'introduire des classes auxiliaires complexes... Pourquoi? 7

Interface Java 2 Interface Pile. interface Pile void empiler( int v ); int depiler(); Moniteur MPD 3 Un moniteur pour gérer une PileNonBornee. monitor PileNonBornee # Pile non bornee: empiler ne bloque jamais. op empiler( int elem ); # depiler bloque si la pile est vide. op depiler() returns int sommet; body PileNonBornee() cond pasvide; int elems[0:*]; int nbelements = 0; # Illegal... mais pour simplifier la presentation # Represente un tableau <<non-borne>> (sic). # Borne a 0 pour faciliter la correspondance avec Java. proc empiler( elem ) elems[nbelements++] = elem; signal(pasvide); proc depiler() returns sommet while ( nbelements == 0 ) wait(pasvide); sommet = elems[--nbelements]; end 8

Moniteur MPD 4 Un moniteur pour gérer une PileBornee. monitor PileBornee # Pile bornee: empiler bloque si la pile est pleine. op empiler( int elem ); # depiler bloque si la pile est vide. op depiler() returns int sommet; body PileBornee( int taillemax ) cond paspleine; cond pasvide; int elems[0:taillemax-1]; int nbelements = 0; proc empiler( int elem ) while( nbelements == taillemax ) wait(paspleine); elems[nbelements++] = elem; signal(pasvide); proc depiler() returns sommet while ( nbelements == 0 ) wait(pasvide); sommet = elems[--nbelements]; signal(paspleine); end 9

Classe Java 4 Classe PileNonBornee. import java.util.vector; class PileNonBornee implements Pile private Vector<Integer> elems; PileNonBornee() this.elems = new Vector<Integer>(); synchronized public void empiler( int elem ) synchronized public int depiler() 10

Classe Java 5 Classe PileBornee. import java.util.concurrent.locks.*; class PileBornee implements Pile private int elems[]; private int nbelements; Lock mutex = new ReentrantLock(); Condition paspleine = mutex.newcondition(); Condition pasvide = mutex.newcondition(); PileBornee( int taillemax ) this.elems = new int[taillemax]; this.nbelements = 0; public void empiler( int elem ) public int depiler() 11

Classe Java 6 Classe PileBorneeSem. import java.util.concurrent.*; class PileBorneeSem implements Pile private int elems[]; private int nbelements; Semaphore mutex = new Semaphore( 1 ); Semaphore semnboccupes; Semaphore semnblibres; private void P( Semaphore sem ) try sem.acquire(); catch( Exception e ) private void V( Semaphore sem ) sem.release(); PileBorneeSem( int taillemax ) this.elems = new int[taillemax]; this.nbelements = 0; this.semnboccupes = new Semaphore( 0 ); this.semnblibres = new Semaphore( taillemax ); public void empiler( int elem ) public int depiler() 12

Classe Java 7 Classe PileBorneePasok. class PileBorneePasok implements Pile private int elems[]; private int nbelements; Object paspleine = new Object(); Object pasvide = new Object(); PileBorneePasok( int taillemax ) this.elems = new int[taillemax]; this.nbelements = 0; synchronized public void empiler( int elem ) synchronized public int depiler() 13