Bienvenue sur le site de l'UE

Programmation Objet Concurrente

Master 1 informatique - Semestre 1 - Année 2018-2019


Responsable: Rémi MORIN: remi.morin(at)univ-amu.fr

Résumé

Depuis la généralisation des architectures multi-coeurs, la programmation parallèle est devenue incontournable pour développer des applications exploitant pleinement les capacités de traitement offertes par les ordinateurs actuels. Elle est aussi un moyen de simplifier la structure du logiciel en l'organisant sous la forme de tâches distinctes qui interagissent entre elles afin de répondre aux requêtes de l'utilisateur (ou de l'environnement).
Cette UE présente aux étudiants du M1 les principales difficultés de la programmation multi-thread et les techniques classiques permettant de développer un code correct et performant. Tout d'abord, les instructions de base liées à la classe Thread en Java sont introduites avec les concepts sous-jacents de verrou et de variable de condition. L'effet de ces instructions sur l'état d'un thread est illustré sur des exemples simples s'appuyant sur des diagrammes de séquence. Les notions d'indépendance et d'atomicité permettent ensuite de spécifier précisément les problèmes classiques de synchronisation en séparant le besoin d'exclusion mutuelle des contraintes d'attente particulières. L'approche recommandée pour débuter est celle de la conception et de la programmation de moniteurs (à la Hoare), étudiée sur quelques exemples classiques.
Les outils dédiés à la programmation parallèle en Java sont également présentés en cours et exploités en Travaux Pratiques: locks divers, pools de threads, collections synchronisées ou concurrentes, objets atomiques, etc. Les difficultés propres à la programmation sans verrou sont abordées par une approche systématique illustrée sur quelques exemples simples.
Enfin, un aperçu du modèle mémoire Java permet d'initier les étudiants à la notion de programme «bien synchronisé» et aux risques d'exécutions inconsistantes séquentiellement du fait des optimisations de codes réalisées lors de la compilation ou de l'exécution.

Organisation

Le module consiste en 10h de cours, 8h de TD et 8h de TP.
Un petit projet sous la forme de rendus de TP compte pour 25 % dans la note finale.
Le polycopié du cours, les planches d'exercices et les fichiers sources des Travaux Pratiques sont disponibles ici (accès restreint).

Planning


Cours

TD

TP

Semaine 1

Présentation de l'UE et des MCC
Introduction aux threads en Java:
volatile, synchronized, wait(), notify(), etc.

Premiers programmes multithreads
Fonctionnement des verrous

Mesure d'un gain de performance
Partage dynamique de tâches
États d'un thread

Semaine 2

Indépendence et atomicité
Rappels de techniques de synchronisation:
Moniteurs, sémaphores, etc.

Le dîner des philosophes
et quelques variantes

Blanche-neige équitable
Interruption des nains
La corde des babouins

Semaine 3

Outils concurrents de Java 5:
Verrous, objets atomiques, threadpool
Collections synchronisées et concurrentes

Le repas des sauvages
Recherche de bugs divers

Ajout d'une louche à une marmite
Amélioration d'un buffer circulaire

Semaine 4

Programmation optimiste
Problème ABA

Synchronisation sans verrou

Emploi d'un threadpool
Accélération du tri rapide

Semaine 5

Aperçu du modèle mémoire Java
Consistence séquentielle et garantie DRF

Références bibliographiques

  1. Programmation concurrente en Java, Brian Goetz.
    Pearson, Mai 2009 | ISBN-10: 2-7440-2508-9 | ISBN-13: 978-2-7440-2508-2
  2. The Art of Multiprocessor Programming, Maurice Herlihy, Nir Shavit.
    Morgan Kaufmann Pub, Février 2008 | ISBN-10: 0123705916 | ISBN-13: 978-0123705914