Sémaphores Appliquettes

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

Threads. Threads. USTL routier 1

Problèmes liés à la concurrence

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

Synchro et Threads Java TM

Introduction : les processus. Introduction : les threads. Plan

INITIATION AU LANGAGE JAVA

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Un ordonnanceur stupide

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

Introduction à la programmation concurrente

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

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

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

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

Auto-évaluation Programmation en Java

Notion de thread (1/2)

Programmer en JAVA. par Tama

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

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

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

Programme Compte bancaire (code)

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

Premiers Pas en Programmation Objet : les Classes et les Objets

TD2 Programmation concurrentielle

Une introduction à la technologie EJB (2/3)

RMI le langage Java XII-1 JMF

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

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

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

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

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

Remote Method Invocation Les classes implémentant Serializable

Projet de programmation (IK3) : TP n 1 Correction

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

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

Développement Logiciel

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

Cours de Systèmes d Exploitation

Programmation Par Objets

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

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

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

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

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

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

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

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

Introduction aux Systèmes et aux Réseaux

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

TP1 : Initiation à Java et Eclipse

LOG4430 : Architecture et conception avancée

Programmation Objet Java Correction

Corrigé des exercices sur les références

Calcul Parallèle. Cours 5 - JAVA RMI

TP, première séquence d exercices.

Java 1.5 : principales nouveautés

Remote Method Invocation (RMI)

Introduction au langage Java

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

RN2-Programmation Orientée Objet - JAVA CH 1 Introduction à la POO et Java

PROGRAMMATION PAR OBJETS

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

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

Remote Method Invocation en Java (RMI)

Java Licence Professionnelle CISII,

Programmation avancée et répartie en Java : interfaçage avec d autres langages

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

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

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

Java Licence Professionnelle CISII,

INTRODUCTION À LA PROGRAMMATION CONCURRENTE

Package Java.util Classe générique

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

INF 321 : mémento de la syntaxe de Java

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

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

Solutions du chapitre 4

REALISATION d'un. ORDONNANCEUR à ECHEANCES

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

Bases Java - Eclipse / Netbeans

Java c est quoi? Java. Java. Java : Principe de fonctionnement 31/01/ Vue générale 2 - Mon premier programme 3 - Types de Programme Java

Projet gestion d'objets dupliqués

Langage Java. Classe de première SI

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

Java DataBaseConnectivity

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

Programmation d Applications Concurrentes et Distribuées (INF431)

ACTIVITÉ DE PROGRAMMATION

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Bases du langage. Historique Applications et applets Éléments de base du langage Classes et objets Les exceptions

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

Web Tier : déploiement de servlets

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

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

F. Barthélemy. 17 mai 2005

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Chapitre 10. Les interfaces Comparable et Comparator 1

Conventions d écriture et outils de mise au point

Transcription:

Inf 431 Cours 12 Sémaphores Appliquettes jeanjacqueslevy.net secrétariat de l enseignement: Catherine Bensoussan cb@lix.polytechnique.fr Aile 00, LIX, 01 69 33 34 67 www.enseignement.polytechnique.fr/informatique/if

Plan 1. Algorithme de Peterson 2. Sémaphores booléennes 3. Sémaphores généralisées 4. Producteur Consommateur 5. Les 5 philosophes 6. Appliquettes Java 7. Synchronisation par envois de messages 8. Modèle client/serveur Bibliographie Mordechai Ben-Ari, Principles of Concurrent Programming, Prentice Hall, 1982. J. Misra and K. M. Chandy, Parallel Program Design : A Foundation, Addison-Wesley, 1988.

Algorithme de Peterson (1/5) class Peterson extends Thread { static int tour = 0; static boolean[ ] actif = {false, false; int i, j; Peterson (int x) { i = x; j = 1 - x; public void run() { while (true) { actif[i] = true; tour = j; while (actif[j] && tour == j) ; // section critique actif[i] = false; public static void main (String[ ] args) { Thread t0 = new Peterson(0), t1 = new Peterson(1); t0.start(); t1.start();

Algorithme de Peterson (2/5) Preuve de sureté. (safety ) Si t 0 et t 1 sont tous les deux dans leur section critique. Alors actif [0] = actif [1] = true. Impossible car les deux tests auraient été franchis en même temps alors que tour favorise l un deux. Donc un seul est entré. Disons t 0. Cela veut dire que t 1 n a pu trouver le tour à 1 et n est pas entré en section critique. Preuve de vivacité. (lifeness) Supposons t 0 bloqué dans le while. Cas 1 : t 1 non intéressé à rentrer dans la section critique. Alors actif [1] = false. Et donc t 0 ne peut être bloqué par le while. Cas 2 : t 1 est aussi bloqué dans le while. Impossible car selon la valeur de tour, l un de t 0 ou t 1 ne peut rester dans le while.

Algorithme de Peterson (3/5) avec des assertions où on fait intervenir la ligne des programmes c 0 et c 1 (compteur ordinal) exécutée par t 0 et t 1. public void run() {. while (true) { { actif [i] c i 2 1 actif[i] = true; {actif [i] c i = 2 2 tour = j; {actif [i] c i 2 3 while (actif[j] && tour == j). ; {actif [i] c i 2 ( actif [j] tour = i c j = 2). // section critique..... // fin de section critique 5 actif[i] = false; { actif [i] c i 2 6 Thread.yield();.

Algorithme de Peterson (4/5) Preuve de sureté : Preuve par énumération des cas (model checking) Si t 0 et t 1 sur la ligne 5, on a : actif [0] c 0 2 ( actif [1] tour = 0 c 1 = 2) actif [1] c 1 2 ( actif [0] tour = 1 c 0 = 2) équivaut à équivaut à implique actif [0] c 0 2 tour = 1 actif [1] c 1 2 tour = 0 tour = 0 tour = 1 P tour = 0 tour 0 P false impossible.

Algorithme de Peterson (5/5) Preuve de vivacité. Si t 0 et t 1 dans la boucle while : actif [1] tour = 1 actif [0] tour = 0 tour = 0 tour = 1 P false Si t 0 en dehors de la boucle while et t 1 dedans, la preuve se complique car faisant intervenir l évolution dans le temps (logique temporelle ou modale). Par exemple : équivaut à actif [0] tour = 0 actif [0] c 0 = 2 actif [0] tour = 0 c 0 = 2 alors le programme évolue vers tour = 1 et le tout devient faux. On quitte donc la boucle while. Exercice 1 Généraliser l algorithme de Peterson à n processus.

Sémaphores (1/5) L algorithme de Peterson n a qu un intérêt théorique (idem pour l algorithme de Dekker). Comme primitives de bas niveau, la littérature de la concurrence considère la notion de sémaphore [Dijkstra 65]. un sémaphore est une variable s booléenne avec deux opérations : P (s), prendre Proberen le sémaphore : Si s est true, on le met à false de manière atomique ; sinon l instruction attend sur s. V (s), libérer Verhogen le sémaphore : Si un processus attend sur s, on le réveille sans changer la valeur de s ; sinon on met s à true.

Sémaphores (2/5) A la différence des variables de condition, les sémaphores ne sont pas attachés à un verrou, mais ont une mémoire. En fait, ce sont les opérations effectuées à l entrée ou à la sortie d une section critique (synchronized en Java). static Semaphore s; while (true) { P(s); section critique V(s); Exercice 2 (difficile) Programmer les variables de condition de Java avec des sémaphores. Exercice 3 (très difficile) Programmer les variables de condition des Posix Threads avec les primitives de Java et des sémaphores.

Sémaphores (2/5) La classe Semaphore est fournie en Java 1.5. On peut la programmer très facilement avec des synchronized et wait, notify. public class Semaphore { private boolean libre; public Semaphore(boolean x) { libre = x; public synchronized void P() throws InterruptedException { while (!libre ) wait(); libre = false; public synchronized void V() { libre = true; notify();

Sémaphores (3/5) Avec les sémaphores, on peut programmer la file d attente concurrente de longueur 1. Au début s_vide = true, s_plein = false. static void ajouter (int x, FIFO f) { P(s_vide); f.contenu = x; f.pleine = true; V(s_plein); static int supprimer (FIFO f) { int res; P(s_plein); res = f.contenu; f.pleine = false; V(s_vide); return res;

Sémaphores (4/5) Pour programmer la file de longueur n, il est plus simple de se servir de la notion de sémaphore généralisé. Un sémaphore généralisé a une valeur entière positive ou nulle avec deux opérations : (prendre la sémaphore) P (s) teste s > 0. Si oui, on décrémente s. Sinon l instruction attend sur s. (libérer le sémaphore) V (s) réveille un processus en attente sur s s il existe un tel processus. Sinon on incrémente s. En première approximation, un sémaphore booléen est un sémaphore initialisé à 1. Exercice 4 Montrer que la remarque précédente n est pas tout à fait exacte.

Sémaphores (5/5) Soit n la taille de la file. Au début, s libres = n et s occupes = 0. static void ajouter (int x, FIFO f) { P(s_libres); synchronized (f) { f.contenu[f.fin] = x; f.fin = (f.fin + 1) % f.contenu.length; f.vide = false; f.pleine = f.fin == f.debut; V(s_occupes); static int supprimer (FIFO f) { P(s_occupes); synchronized (f) { int res = f.contenu[f.debut]; f.debut = (f.debut + 1) % f.contenu.length; f.vide = f.fin == f.debut; f.pleine = false; V(s_libres); return res; Problème dit du producteur - consommateur.

Les 5 philosophes (1/7) Problème de [Dijkstra] pour tester les primitives concurrentes : verrous, conditions, sémaphores, sémaphores généralisés, etc. 5 moines philosophes Φ i pensent et mangent. Pour manger, ils vont dans la salle commune, où ils dégustent un plat de spaghettis. il faut deux fourchettes pour manger les spaghettis. Mais, le monastère ne dispose que de 5 fourchettes. Comment arriver à ce qu aucun moine ne meure de faim?

Les 5 philosophes (2/7) class Philosophe extends Thread { // Première solution static Semaphore[ ] s = new Semaphore[5]; Philosophe (int x) { i = x; int i; public void run() { while (true) { // penser Semaphore.P(s[i]); Semaphore.P(s[(i+1)%5]); // manger Semaphore.V(s[i]); Semaphore.V(s[(i+1)%5]); public static void main (String[ ] args) { for (int i = 0; i < s.length; ++i) { Philosophe phi = new Philosophe(i); phi.start(); Sureté, mais interblocage.

Les 5 philosophes (3/7) class Philosophe1 extends Thread { // Deuxième solution static int[ ] f = {2, 2, 2, 2, 2; static ConditionPosix[ ] manger = new ConditionPosix[5]; int i; Philosophe1 (int x) { i = x;... public static void main (String[ ] args) { for (int i = 0; i < f.length; ++i) { Philosophe1 phi = new Philosophe1(i); phi.start(); f[i] est le nombre de fourchettes disponibles pour Φ i

Les 5 philosophes (4/7) static synchronized void prendrefourchettes(int i) { while (f[i]!= 2) waitposix (manger[i]); -- f[(i-1) % 5]; -- f[(i+1) % 5]; static synchronized void relacherfourchettes(int i) { int g = (i-1) % 5, d = (i+1) % 5; ++ f[g]; ++ f[d]; if (f[d] == 2) notifyposix (manger[d]); if (f[g] == 2) notifyposix (manger[g]); public void run() { while (true) { // penser prendrefourchettes(i); // manger relacherfourchettes(i);

Les 5 philosophes (5/7) L invariant suivant est vérifié 4X f[i] = 10 2 mangeurs i=0 interblocage mangeurs = 0 f[i] = 2 pour tout i (0 i < 5) pas d interblocage pour le dernier à demander à manger. famine, si, par exemple, les philosophes 1 et 3 complotent contre le philosophe 2, qui mourra de faim.

Les 5 philosophes (6/7) On reprend la première solution + sémaphore généralisé salle Au début salle = 4 Pour manger, les philosophes rentrent dans la salle ; il y a au plus 4 philosophes dans la salle ; ils sortent de la salle après le repas ; et retournent penser dans leur cellule. public void run() { // Troisième solution while (true) { // penser SemaphoreGen.P(salle) ; // début zone critique Semaphore.P(s[i]); Semaphore.P(s[(i+1)%5]); // manger Semaphore.V(s[i]); Semaphore.V(s[(i+1)%5]); SemaphoreGen.V(salle) ; // fin zone critique

Les 5 philosophes (7/7) 4 philosophes au plus dans la salle pas d interblocage. l invariant suivant est vérifié room + nombre de processus dans la zone critique = 4 Si Φ i exécute P(s[i]), alors il finira cette instruction. Si Φ i attend indéfiniment sur P(s[(i+1)%5]), alors Φ i+1 attend indéfiniment sur P(s[(i+2)%5]). Si Φ i exécute P(s[(i+1)%5]), alors il finira cette instruction. Pas de famine. Exercice 5 Programmer cette solution des 5 philosophes en Java, avec les seuls wait, notify et notifyall. (Indication : faire une classe Fourchette avec les deux méthodes synchronisées prendre et relacher)

Appliquettes (1/4) Une appliquette (Applet) = sous-classe des panneaux (Panel) sous-classe des conteneurs (Container ) de AWT. Une appliquette est exécutée par appletviewer ou appelée par un navigateur grâce à des instructions spéciales en HTML : <applet code=clock.class width=250 height=40></applet> Ses méthodes principales sont : init() appelée au chargement de l appliquette. start() appelée quand l appliquette devient visible sur l écran. stop() appelée quand l appliquette devient invisible sur l écran. destroy() appelée quand l appliquette devient inutilisable.

Appliquettes (2/4) import java.applet.*; import java.awt.*; import java.util.*; public class Clock extends Applet implements Runnable { private Thread t; private boolean threadsuspended; final int updateinterval = 1000;... public void init() { t = new Thread (this); t.start(); public void start() { if (threadsuspended) { synchronized (this) { threadsuspended = false; notify();

Appliquettes (3/4) public void run() { while (true) { try { Thread.sleep(updateInterval); synchronized (this) { while (threadsuspended) wait(); catch (InterruptedException e) { repaint(); public void stop() { threadsuspended = true; public void destroy() { public void paint (Graphics g) { g.setfont(new Font("Helvetica", Font.BOLD, 14)); g.drawstring (new Date().toString(), 10, 25);

Appliquettes (4/4) on crée un processus pour ne pas bloquer la JVM du navigateur ; start de Applet start de Thread ne pas utiliser Thread.suspend et Thread.resume (obsolètes) utiliser wait et notify en faisant du polling dans le programme principal de l appliquette ; (comme pour les interruptions) utiliser repaint() lorsqu il y a plusieurs processus update() paint() tester l appliquette avec appletviewer qui prend en argument un fichier HTML. (On voit les messages d erreur + on isole le problème) Exercice 6 Faire une appliquette illustrant le problème des 5 philosophes.

Synchronisation par messages (1/5) le modèle de la mémoire partagée est peu structuré il ne marche pas pour les processus coopérants à distance envoi de messages avec accusés de réception, ou totalement asynchrones Exemples : tous les serveurs dans un système d exploitation pour fichiers, courrier, pages web, fenêtres, imprimantes, shell, calcul, noms, visages, etc. Modèle du client/serveur : un serveur a plusieurs clients les clients envoient des demandes de service au serveur le serveur sert ces demandes dans l ordre des messages. pas de synchronisation car le serveur est centralisé plusieurs serveurs programmation concurrente univers symétriques sans serveurs : Peer to Peer

Synchronisation par messages (2/5) un premier exemple est NFS (network file system), le service de fichier à distance d Unix. [Joy, 83] les clients montent une partition de fichiers à distance sur la hiérarchie locale. messages pour demandes de lectures/écritures la cohérence des requêtes concurrentes est assurée par le serveur qui traitent séquentiellement les diverses requêtes modèle pauvre de la concurrence d autres systèmes sont plus concurrents avec plusieurs serveurs, qui gèrent entre eux leur cohérence. Aucun système opérationnel pour le moment. plus généralement, la cohérence des bases de données concurrente est un problème important, et résolu (?).

Synchronisation par messages (3/5) un autre exemple est le serveur de fenêtres X-window [Gettys, Scheifler, 86] le serveur de fenêtres est en dehors du noyau système sureté de fonctionnement. le mode de connexion est cohérent avec le réseau (merci Unix BSD) le serveur peut ne pas être sur la même machine que les clients! les émulateurs terminaux sont indépendants des applications [Pike, Locanthi, 84], [Gosling, Rosenthal, 85], une application comme sort, java, javac croit parler à un terminal alpha-numérique standard. le serveur de fenêtres gère les événements clavier-souris et les dispatche vers l application propriétaire du curseur. si le serveur de fenêtre ne sait pas dessiner un bout de fenêtre cachée, il le redemande à l application propriétaire.

Synchronisation par messages (4/5) Utilisateur 1 Utilisateur 2 Ecran Serveur de fenetres Emulateur terminal Application Clavier Souris X xterm sort java javac Driver d evenements Socket Pseudo-tty Systeme d exploitation 1 Systeme d exploitation 2 Machine 1 Reseau Machine 2 cf. Cours systèmes d exploitation et réseaux en majeure 2

Synchronisation par messages (5/5) théorie de la communication par rendez-vous très belle théorie : CSP [Hoare, 78], CCS, π-calcul [Milner, 80]. Pleins de travaux sur 20 ans. logiques temporelles analyseurs statiques de programme (cf. cours 14) la mise au point des programmes concurrents est un domaine actif de recherche.