LOG4430 : Architecture et conception avancée



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

Introduction à la programmation concurrente

Introduction : les processus. Introduction : les threads. Plan

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

Programmer en JAVA. par Tama

Threads. Threads. USTL routier 1

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

Problèmes liés à la concurrence

INITIATION AU LANGAGE JAVA

Projet gestion d'objets dupliqués

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

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Synchro et Threads Java TM

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

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

Notion de thread (1/2)

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

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

Patrons de Conception (Design Patterns)

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

Projet Active Object

Un ordonnanceur stupide

Remote Method Invocation Les classes implémentant Serializable

Cours 1: Java et les objets

2 Chapitre 1 Introduction

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

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

Programmation MacOSX / ios

as Architecture des Systèmes d Information

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

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)

Cours de Systèmes d Exploitation

WEA Un Gérant d'objets Persistants pour des environnements distribués

TP1 : Initiation à Java et Eclipse

NFP111 Systèmes et Applications Réparties

Module BDR Master d Informatique (SAR)

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

Chapitre VI- La validation de la composition.

Vulgarisation Java EE Java EE, c est quoi?

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

Types d applications pour la persistance. Outils de développement. Base de données préexistante? 3 modèles. Variantes avec passerelles

LOG4430 : Architecture logicielle et conception avancée

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

Implémentation des SGBD

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

La technologie Java Card TM

INTERSYSTEMS CACHÉ COMME ALTERNATIVE AUX BASES DE DONNÉES RÉSIDENTES EN MÉMOIRE

Principes. 2A-SI 3 Prog. réseau et systèmes distribués 3. 3 Programmation en CORBA. Programmation en Corba. Stéphane Vialle

IFT Systèmes d exploitation - TP n 1-20%

Conception des systèmes répartis

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

Une introduction à la technologie EJB (2/3)

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

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

Prototype de canal caché dans le DNS

Calcul Parallèle. Cours 5 - JAVA RMI

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Initiation à JAVA et à la programmation objet.

SGBDR. Systèmes de Gestion de Bases de Données (Relationnelles)

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

Solutions de gestion de la sécurité Livre blanc

Introduction à la Programmation Parallèle: MPI

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

GEI 465 : Systèmes répartis

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

11 Février 2014 Paris nidays.fr. ni.com

FAMILLE EMC VPLEX. Disponibilité continue et mobilité des données dans et entre les datacenters

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Java - RMI Remote Method Invocation. Java - RMI

Gestion des transactions et accès concurrents dans les bases de données relationnelles

Fiche Technique. Cisco Security Agent

FAMILLE EMC VPLEX. Disponibilité continue et mobilité des données dans et entre les datacenters AVANTAGES

2. MAQUETTAGE DES SOLUTIONS CONSTRUCTIVES. 2.2 Architecture fonctionnelle d un système communicant.

Chapitre I Notions de base et outils de travail

Une introduction à Java

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

CORBA haute performance

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

Environnements de développement (intégrés)

LOG4430 : Architecture logicielle et conception avancée

TD2 Programmation concurrentielle

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

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

Institut Supérieure Aux Etudes Technologiques De Nabeul. Département Informatique

Le langage C. Séance n 4

Premiers Pas en Programmation Objet : les Classes et les Objets

VMWare Infrastructure 3

Architecture et Extensions d ArcGIS Server

Performances. Gestion des serveurs (2/2) Clustering. Grid Computing

Plan. Patrons de conception. Motivations. Design Pattern : principe. Philippe Collet

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

Initiation au HPC - Généralités

RMI le langage Java XII-1 JMF

IFIPS 5 / Nouvelles Architectures Logicielles Projet : Bus de web services avec «moteur» BPEL

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

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

Messagerie asynchrone et Services Web

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

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

Transcription:

LOG4430 : Architecture et conception avancée Abdou Maiga Patrons pour la conception d applications distribuées Département de génie informatique et de génie logiciel École Polytechnique de Montréal Guéhéneuc, 2010; Khomh, 2010

Conception d applications distribuées Patrons pour la synchronisation Scoped Locking Double-checked Locking Optimization Strategized Locking Thread-Safe Interface Patrons pour la configuration d accès simultanés Active Object Monitor Object Half-sync/Half-async Leader/Follower Thread-specific Storage 2/65

Patrons pour la synchronisation Scoped Locking Assure qu un jeton (lock) soit obtenu en entrant un bloc de contrôle (scope) et soit rendu automatiquement en en sortant Double-checked Locking Optimization Réduit les couts de verrouillages en évaluant d abord une condition de verrouillage de façon non sure Strategized Locking Stratégie de verrouillage des composants réutilisables Thread-safe Interface Assure que les appels de méthodes intra-composants évitent les inter-blocages (deadlocks) 3/65

Patrons pour la synchronisation Le point focal des patrons suivant le patron de conception Singleton 4/65

Exemple courant // Single-threaded version class Foo { private static Helper helper = null; public static Helper gethelper() { if (helper == null) { } helper = new Helper(); } return helper; } // Other functions and members... Voir http://en.wikipedia.org/wiki/double-checked_locking 5/65

Scoped Locking Contexte Un programme concurrent contenant des données partagées qui sont accédées concurremment par plusieurs fils d exécution Problème Les jetons doivent toujours être obtenus et rendus correctement quand le flot de contrôle entre et quitte une section critique Voir http://www.cs.wustl.edu/~schmidt/pdf/scopedlocking.pdf 6/65

Scoped Locking Problème (suite) Il est difficile de suivre tous les points de sorti du flot de contrôle à cause des return, break, continue et des exceptions non-attrapées Note Différents langages de programmation amènent à différentes solutions 7/65

Scoped Locking for C++ Solution for C++ Définir une classe de garde dont Le constructeur obtient le jeton Le destructeur rend le jeton automatiquement Implantation Thread_Mutex lock_; Thread_Mutex_Guard guard (lock_); 8/65

Scoped Locking for C++ Bénéfices Augmentation de la robustesse Empêche les oublis de rendre le jeton Réduction de l effort de maintenance Une seule implantation Possibilité de sous-classes 9/65

Scoped Locking for C++ Limitations Possibilité d un inter-blocage en cas d appels de méthodes récursifs Thread-safe Interface Impossibilité d implantation Utilise les destructeurs de C++ Impossible en Java! Avertissements intempestifs du compilateur La variable locale gard n est pas utilisée 10/65

Scoped Locking for C++ Utilisations connues Adaptive Communication Environment (ACE) Ce patron est utilisé extensivement dans ce kit de programmation Threads.h++ Cette bibliothèque défini un ensemble de classes de gardes modélisées suivant ce patron Java! Le langage Java définit le «synchronized block» qui implémente cet idiome 11/65

Scoped Locking for Java Solution for Java Le langage introduit le mot-clé synchronized dont l implantation est basée sur ce patron // Multi-threaded but expansive version class Foo { private Helper helper = null; public synchronized Helper gethelper() { if (helper == null) { helper = new Helper(); } return helper; 12/65

Scoped Locking for Java Limitations Le cout d un appel à une méthode «synchronisée» peut être 100 celui à une méthode «normale» 13/65

Double-checked Locking Optimization Contexte Un programme concurrent contenant des données partagées qui sont accédées concurremment par plusieurs fils d exécution 14/65

Double-checked Locking Optimization Problèmes En C++ : relations entre ordre d exécution des instructions, séquence de points d exécution, optimisation des compilateurs et du matériel En Java : le cout d un appel à une méthode «synchronisée» peut être 100 celui à une méthode «normale» 15/65

Double-checked Locking Optimization for Java Solution pour Java Combinaison de synchronized et volatile synchronized méthodes et instructions pour empêcher deux fils d exécution d accéder à la même méthode / bloc d instructions en même temps volatile variables sont lues/modifiées directement, sans qu un cache ne soit maintenu dans les fils d exécution ; leur lecture et écriture est «comme» dans un bloc synchronisé Voir http://en.wikipedia.org/wiki/double-checked_locking 16/65

Double-checked Locking Optimization for Java Solution (partielle et incorrecte) pour Java // Multi-threaded but incorrect version class Foo { private Helper helper = null; public synchronized Helper gethelper() { if (helper == null) { synchronized(this) { if (helper == null) { helper = new Helper(); } } } return helper; 17/65

Double-checked Locking Optimization for Java Solution (complète et correcte) pour Java // Multi-threaded and correct version class Foo { private volatile Helper helper = null; public synchronized Helper gethelper() { if (helper == null) { synchronized(this) { if (helper == null) { helper = new Helper(); } } } return helper; 18/65

Double-checked Locking Optimization for Java Bénéfices Réduit les surcouts lors de l initialisation fainéante et d accès multiples 19/65

Double-checked Locking Optimization for C++ Solution pour C++ pinstance = new Singleton; Allouer une zone mémoire pour l objet Singleton Construire l objet dans la zone mémoire allouée Faire pointer pinstance sur la zone mémoire Voir http://www.drdobbs.com/184405726 20/65

Double-checked Locking Optimization for C++ class Singleton { public: static volatile Singleton* volatile instance(); private: // one more volatile added static volatile Singleton* volatile pinstance; }; // from the implementation file volatile Singleton* volatile Singleton::pInstance = 0; volatile Singleton* volatile Singleton::instance() { if (pinstance == 0) { Lock lock; if (pinstance == 0) { // one more volatile added volatile Singleton* volatile temp = new volatile Singleton; pinstance = temp; } } return pinstance; Voir http://www.drdobbs.com/184405726 } 21/65

Double-checked Locking Optimization for C++ Bénéfices Prévient plus ou moins le reordonnancement des instructions par le compilateur Réduit les surcouts lors de l initialisation fainéante et d accès multiples Limitations Multi-processeurs Possibilité d erreur lies a la portabilité sur des plateforme avec pointeur non atomique Optimisations Un Singleton par fil d exécution? 22/65

Strategized Locking Contexte Un programme dans lequel des composants réutilisables doivent être accéder concurremment par plus d un fil d exécution Problème Difficile d ajuster le mécanisme de concurrence quand il est code «en dur» Difficile de maintenir et d améliorer les implantations Voir http://www.cs.wustl.edu/~schmidt/pdf/locking-patterns.pdf 23/65

Strategized Locking Solutions Externaliser les mécanismes d acquisition et relâche du jeton 24/65

Strategized Locking Implantation Définir l interface du composant et son implantation (sans synchronisation) Choisir la stratégie de synchronisation, a l aide Du polymorphisme (C++ et Java) Des types paramétrés Définir une famille de stratégies Penser en particulier au verrou «null» 25/65

Strategized Locking for Java Implantation «À la main» Avec l interface Lock ReentrantLock ReentrantReadWriteLock.ReadLock ReentrantReadWriteLock.WriteLock // Multi-threaded version with Lock class Foo { private volatile Helper helper = null; public synchronized Helper gethelper() { if (helper == null) { final Lock l = l.lock(); try { if (helper == null) { helper = new Helper(); } } finally { l.unlock(); } } return helper; 26/65

Strategized Locking for C++ Implantation polymorphique «À la main» avec le patron Pont (Bridge) class File_Cache { public: // Constructor File_Cache (Lock lock): lock_(lock) {} // A method. const char *find(const char *pathname) { // Use the Scoped Locking idiom to // acquire and release the <lock_> Guard<Lock> guard(lock_); // Implement the find() method. } //... private: // The polymorphic locking object. Lock lock_; // Other File_Cache members and methods //... class Lockable { public: // Acquire the lock. virtual int acquire(void) = 0; // Release the lock. virtual int release(void) = 0; //... }; class Lock { public: // Constructor stores a reference // to the base class. Lock (Lockable &l): lock_(l) {}; // Acquire the lock by forwarding to // the polymorphic acquire() method. int acquire (void) { lock_.acquire(); } // Release the lock by forwarding to the // polymorphic release() method. int release (void) { lock_.release(); } private: // Maintain a reference to the lock. Lockable &lock_; }; class Thread_Mutex_Lockable : public Lockable { public: 27/65

Strategized Locking for C++ Implantation polymorphique La classe Lock qui fait le point entre un client et un objet Lockable est importante pour utiliser Lock comme un objet et donc pouvoir utiliser le patron Scoped Locking 28/65

Strategized Locking for C++ Implantation avec types paramétrés Similaire à l approche polymorphique À préférer si le mécanisme de verrouillage est connu à la compilation template <class LOCK> class File_Cache { public: const char *find(const char *pathname) { // Use the Scoped Locking idiom to // acquire and release the <lock_> Guard<LOCK> guard(lock_); // Implement the find() method. } //... private: // The polymorphic locking object. LOCK lock_; // Other File_Cache members and methods //... 29/65

Strategized Locking Pattern Exemple: classe Sensor http://www.codeproject.com/kb/architecture/strategizedlocking.aspx 30/65

Strategized Locking Bénéfices Meilleur flexibilité et possibilité d ajustement pour des raisons des performances Effort de maintenance réduit Limitations La version types paramétrés expose la stratégies de verrouillage au code client Certains compilateurs gèrent mal les types paramétrés 31/65

Thread-safe Interface Contexte Composants dans un programme avec de multiple fils d exécution et des appels de méthodes intra-composants Problèmes Éviter les inter-blocages dus à des appels de méthodes intra-composants Éviter les surcouts de synchronisation pour les appels de méthodes intra-composants 32/65

Thread-safe Interface Solution Vérification de la synchronisation pour toutes les méthodes publique de l interface Confiance en la sureté vis-à-vis des fils d exécution des implantations des méthodes privées 33/65

Thread-safe Interface Implantation Séparer méthodes publiques et synchronisation d une part et implantation d autre part template <class LOCK> class File_Cache { public: // Return a pointer to the memory-mapped // file associated with <pathname>, adding // it to the cache if it does not exist. const char *find(const char *pathname) { // Use the Scoped Locking idiom to // acquire and release the <lock_>. Guard<LOCK> guard(lock_); return find_i(pathname); } // Add <pathname> to the file cache. void bind(const char *pathname) { // Use the Scoped Locking idiom to // acquire and release the <lock_>. Guard<LOCK> guard(lock_); bind_i(pathname); } private: // The strategized locking object. LOCK lock_; // The following implementation methods do not // acquire or release <lock_> and perform their // work without calling any interface methods. const char *find_i (const char *pathname) { const char *file_pointer = check_cache_i (pathname);... 34/65

Thread-safe Interface Utilisations connues java.util.hashtable put(object key, Object value) Protégé pour la synchronisation rehash() Pas protégé pour la synchronisation Le pourrait mais réduction des performances (Il n y aurait pas d inter-blocage parce que les verrous de Java sont réentrants) 35/65

Thread-safe Interface Bénéfices Robustesse améliorée Performances améliorées Limitations Indirections additionnelles Plus de méthodes 36/65

Patrons pour la configuration d accès simultanés Active Object Découpler invocation et exécution des méthodes Monitor Object Assurer qu une seule méthode sur un objet à un moment donné dans le temps Half-sync/Half-async Séparer les accès synchrones et asynchrones aux entrées sorties Leader/Follower Partager des sources d événements entre de multiples fils d exécution Thread-specific Storage Permettre le partage de données entre fils d exécution sans encourir les surcouts de synchronisation 37/65

Active Object Contexte Un client invoque des méthodes sur des objets qui s exécutent dans différents fils d exécution Problème Méthodes invoquées sur une objet ne devraient pas bloquer les autres méthodes du même objet L accès synchronisé aux objets partagés devrait être simple Le programme devrait utiliser au mieux les possibilités de parallèlisation de la plateforme Voir http://www.cs.wustl.edu/~schmidt/pdf/act-obj.pdf 38/65

Active Object Solution Method Request : passer le contexte à un mandataire (Proxy) et garder les appels Activation Queue : garder un tampon limité de Method Request et découpler le fil d exécution du client de celui du servant Scheduler : décider quelle Method Request exécuter dans un fil d exécution séparé Future : mémoriser et donner accès aux résultats de Method Requests 39/65

Active Object Implantation 40/65

Active Object Utilisations connues CORBA ORBs ACE Des implémentations réutilisables de Method Request, Activation Queue, et Future sont disponibles Siemens MedCom 41/65

Active Object Bénéfices Amélioration et simplification de la concurrence Utilisation transparente du parallélisme Différence dans l ordre d invocation et d exécution des méthodes Limitations Surcouts en performance Débogage plus compliqué 42/65

Monitor Object Contexte Programme dans lequel de multiples fils d exécution accèdent à des objets simultanément Problèmes Les méthodes d un objet sont synchronisées Les objets, par leurs clients, sont responsables de la synchronisation de leurs méthodes Les objets exécutent leurs méthodes de façon coopérative Voir http://www.cs.wustl.edu/~schmidt/pdf/monitor.pdf 43/65

Monitor Object Solution Synchroniser toutes les méthodes de l objet Assurer qu une seule méthode synchronisée s exécute sur un objet à la fois 44/65

Monitor Object Implantation 45/65

Monitor Object Utilisations connues Dijkstra/Hoare Monitors La fonctionnalité monitors encapsule les fonctions et leurs variables internes dans un thread-safe module Tout objets Java wait() notify() notifyall() ACE Gateways 46/65

Monitor Object Bénéfices Synchronisation simplifiée Ordonnancement coopératifs de l exécution des méthodes synchronisées Limitations Couplage fort entre fonctionnalités et mécanismes de synchronisation d un objet «Lockout» en cas d objets moniteurs imbriqués 47/65

Half-sync/Half-async Contexte Synchronisation entre processus de bas et de haut niveau, par exemple dans un noyau Linux BSD lors de la réception de paquets depuis des ports d entrée sortie Problème Besoin de simplifier l implantation Besoin de performances Voir http://www.cs.wustl.edu/~schmidt/pdf/plop-95.pdf 48/65

Half-sync/Half-async Solution Couche synchrone (e.g., processus clients) Transfert des données de façon synchrone à la couche Queueing Layer Active Objects qui peuvent «bloquer» Queueing Layer (e.g., socket) Synchronisation et tampon entre les couches synchrones et asynchrones Événements d entrée sortie mis dans un tampon par les tâches asynchrones/synchrones 49/65

Half-sync/Half-async Solution Couche asynchrone (e.g., noyau Linux BSD) Gère les événements de bas niveau Objets passifs qui ne peuvent pas bloquer Sources d événement (e.g., interface réseau) Génèrent des événements reçus par la couche asynchrone 50/65

Half-sync/Half-async Implantation 51/65

Half-sync/Half-async Bénéfices Simplification des tâches de haut niveau car programmation synchrones Possibilité d avoir des politiques de synchronisation propre à chaque couches Communication entre couche localisée dans un seul point Performances améliorées sur des systèmes avec plusieurs processeurs 52/65

Half-sync/Half-async Limitations Surcout lors du passage d une couche a une autre a cause de la copie des données et du changement de contexte Entrées sorties asynchrones ne sont pas disponibles pour les tâches de haut niveau 53/65

Leader/Follower Contexte Un programme dans lequel des événements doivent être partagés et traites par de multiples fils d exécution qui partagent ces événements Problème Démultiplier événements et fil d exécution Minimiser le surcout du à la concurrence Empêcher les situation de compétition (race conditions) sur les sources d événements Voir http://www.cs.wustl.edu/~schmidt/pdf/lf-plopd.pdf 54/65

Leader/Follower Solution Avoir un ensemble de fil d exécution À tout moment, un seul fil, le Leader, attend qu un événement se produise dans un ensemble de sources Quand un événement survient, le Leader promeut un nouveau fil et traite l événement Le nouveau Leader peut s exécuter pendant que l exécution du précédent se poursuit 55/65

Leader/Follower Implantation 56/65

Leader/Follower Implantation 57/65

Leader/Follower Utilisations connues CORBA ORBs Serveur Web JAWS Arrêt de taxis à l aéroport 58/65

Leader/Follower Bénéfices Amélioration des performances Simplification de la programmation Limitations Complexification de l implantation Manque de flexibilité Goulot d étranglement au niveau des entrées sorties réseaux 59/65

Thread-specific Storage Contexte Un programme dans lequel de multiples fil d exécution affecte une valeur a une variable globale qui est plus tard utilisée dans un test Problème Un fil d exécution affecte une valeur, un autre la change, le premier l utilise dans un test Éviter le surcoût du blocage de la variable Voir http://www.cs.wustl.edu/~schmidt/pdf/tss-pattern.pdf 60/65

Thread-specific Storage Solution Un fil d exécution du programme utilise des TS Object Proxies pour accéder au TS Objects qui sont stockés dans une collection TS Objects Collection propre a chaque fil TS Object Proxy définit l interface des TS Objects, un Proxy par type de TS Objects TS Objects sont les instances particulières à un fil d exécution d un objet spécifique au fil TS Objects Collection collecte les TS Objects 61/65

Thread-specific Storage Implantation 62/65

Thread-specific Storage Utilisations connues Le mécanisme errno dans les systèmes d exploitation supportant POSIX et l API de fil d exécution de Solaris Les fenêtres dans Win32 appartiennent chacune à un fil d exécution qui utilise une queue d événements stockée dans un TSS 63/65

Thread-specific Storage Bénéfices Efficacité Simplicité d utilisation Limitations Encourage l utilisation de variables globales Rend plus difficile la compréhension 64/65

Voir aussi http://java.sun.com/j2se/1.5.0/docs/api/java/ util/concurrent/locks/lock.html http://www2.research.att.com/~bs/bs_faq2.ht ml#finally 65/65