Distribuée
Programmation concurrente
Programmation réseaux
Programmation distribuée
Part 1
PROGRAMMATION CONCURRENTE
THREADS
1
Introduction
Programme vs Processus
2
Parallélisme
Programmation concurrente
3
Exemples d’applications
Utilités / Problèmes
Utilités :
Optimiser l’utilisation des ressources (CPU ...)
Faciliter l’équité
Serveur multi-utilisateurs
Station mono-utilisateur : système plus réactif
Satisfaire des contraintes temporelles
Programmation Temps Réel
Problèmes :
Difficulté à écrire un programme concurrent et à le déboguer
Problème de prédictibilité et de reproductibilité
Dans un programme concurrent, l'ordre d'exécution des instructions
varie d'une exécution à l'autre pour les mêmes paramètres en entrée
4
Processus (Rappel)
Processus
5
Systèmes Multi-processeurs
Système avec plusieurs processeurs
parallèle
vrai multitache
doit assurer qu'il y a l'éxecution d'autant de processus que
processeurs en meme temps
6
Notion de préemption
Ordonnanceur et répartiteur
Nouveaux
7
Politiques d'ordonnancement
8
Algorithme : Premier Arrivé Premier
9
Politiques d'ordonnancement
Premier arrivé, premier servi
pr tp
10
Algorithme : avec priorités
Politiques d'ordonnancement
11
Algorithme : tourniquet
12
Classe Runtime
Méthodes:
Connaître l’environnement d’exécution :
total/free/maxMemory(), availableProcessors()
Contrôle du processus : gc(), exit(), halt()
Création d’autres processus : exec()
Classe Process
Méthodes :
waitFor() : attends la fin de l’exécution du fils
exitValue() : valeur renvoyée lors de la fin du fils (par exit(n))
destroy() : tue le fils
getInputStream(), getOutputStream(), getErrorStream()
permettent de contrôler les E/S standard du processus
13
Classe Process (suite)
Exemples :
Runtime.getRuntime().exec(″javac Toto.java″);
Runtime.getRuntime().exec(new String[]{″javac″,″Toto.java″});
utilise un tableau pour la commande et ces arguments
Runtime.getRuntime().exec(″prog″, new String[] {″var=val″}, new
File(″/tmp/″));
exécute prog avec pour répertoire courant /tmp en ayant positionné
auparavant la variable d’environnement var à la valeur val
Prof. Asmaa El Hannani ISIC/S3 34
Thread
14
Qu’est-ce qu’un Thread ?
15
Avantages / Inconvénients des threads
Avantages:
Programmer facilement des applications où des traitements se
résolvent de façon concurrente (applications réseaux, par
exemple)
Améliorer les performances en optimisant l'utilisation des
ressources
Légèreté grâce au partage des données
Inconvénients:
Code plus difficile à comprendre et à débuguer
Thread-processus: en commun
16
Thread-processus: non commun
Les processus ont un espace d’adressage; les threads non
Les processus parents et enfants doivent utiliser les
mécanismes de communication inter-processus; les threads
d’un même processus communiquent en lisant et modifiant les
variables de leur processus
Les processus enfants n’ont aucun contrôle sur les autres
processus enfants; les threads d’un processus sont considérés
comme des pairs, et peuvent exercer un contrôle sur les autres
threads du processus
Les processus enfants ne peuvent pas exercer de contrôle sur le
processus parent; n’importe quel thread peut exercer un
contrôle sur le thread principal, et donc sur le processus entier
Prof. Asmaa El Hannani ISIC/S3 40
17
Le cycle de vie d’un Thread (1/3)
18
Le cycle de vie d’un Thread (3/3)
19
Pourquoi deux manières de faire ?
20
Définir et lancer un thread
en implémentant l’interface Runnable
1. Implémenter l’interface Runnable
2. Définir la méthode run()
class Tache implements Runnable {
...
public void run() {
// Code qui sera exécuté par le thread
...
}
}
21
Exemple
Exemple (1/3)
22
Exemple (2/3)
Exemple (3/3)
23
La classe Thread
Chaque instance de la classe Thread possède:
Un nom, [get/set]Name(), un identifiant
24
Le Thread courant
Les priorités
Principes :
Java permet de modifier les priorités (niveaux absolus) des
Threads par la méthode setPriority()
Par défaut, chaque nouveau Thread a la même priorité que le
Thread qui l’a crée
Rappel: seuls les Threads actifs peuvent être exécutés et donc
accéder au CPU
La JVM choisit d’exécuter le Thread actif qui a la plus haute
priorité : priority-based scheduling
Si plusieurs Threads ont la même priorité, la JVM répartit
équitablement le temps CPU (time slicing) entre tous : round-
robin scheduling
25
Les priorités (suite)
Les méthodes :
setPriority(int) : fixe la priorité du receveur.
le paramètre doit appartenir à :
[MIN_PRIORITY, MAX_PRIORITY]
sinon IllegalArgumentException est levée
NORM_PRIORITY : donne le niveau de priorité "normal"
« Endormir » un thread
Souvent les threads sont utilisés pour effectuer des tâches répétitives
à intervalles réguliers (Exemple : animations dans une interface
graphique)
Donc besoin de suspendre l’exécution du thread pour une durée donnée
26
Attente de la fin d’un thread
Exemple (1/2)
27
Exemple (2/2)
28
Exemple de problème
Exemple
public class Impression1 extends Thread {
static Imprimante imprimante;
String doc; int nbPage;
public Impression1(String doc, int nbPage) {
this.doc = doc; this.nbPage = nbPage;
}
public void run() {
imprimante.imprime(doc,nbPage);
}
static public void main(String args[]) {
imprimante = new Imprimante();
Impression1 a = new Impression1("Premier document", 5);
Impression1 b = new Impression1("Deuxieme Document", 10);
a.start(); b.start();
}
}
public class Imprimante {
public void imprime(String doc, int np) {
for (int i=1; i<=np; i++) {
System.out.println("Page "+i+" du "+doc);
}
}
}
Prof. Asmaa El Hannani ISIC/S3 65
29
Exemple
Nécessité de synchroniser !
30
Définir une section critique
31
Exemple (synchronized instructions)
public class Impression3 extends Thread {
static Imprimante imprimante;
String doc; int nbPage;
public Impression3(String doc, int nbPage) {
this.doc = doc; this.nbPage = nbPage;
}
public void run() {
synchronized (imprimante) {
imprimante.imprime(doc,nbPage);
}
}
static public void main(String args[]) {
imprimante = new Imprimante();
Impression3 a = new Impression3("Premier document", 5);
Impression3 b = new Impression3("Deuxieme Document", 10);
a.start(); b.start();
}
}
public class Imprimante {
public void imprime(String doc, int np) {
for (int i=1; i<=np; i++) {
System.out.println("Page "+i+" du "+doc);
}
}
}
Prof. Asmaa El Hannani ISIC/S3 70
Interblocage
l’objet o2,
le thread t2 possède le verrou de l’objet o2 et il attend le verrou de
l’objet o1.
32
Coordination entre threads
On a parfois besoin de coordonner l’exécution de threads
un thread devant attendre qu’un autre ait effectué une certaine tâche pour
Exemple (1/6)
33
Exemple (2/6)
Exemple (3/6)
34
Exemple (4/6)
Exemple (5/6)
35
Exemple (6/6)
Terminer un Thread
Leur utilisation est déconseillée car ils peuvent laisser des objets
dans un état inconsistant et favorisent les interblocages
36
Interrompre un thread
37
Les groupes de threads
Une arborescence :
La classe ThreadGroup permet de constituer une arborescence de
Threads et de ThreadGroups
Fonctionnement :
La JVM crée au minimum un groupe de threads nommé main
Par défaut, un thread appartient au même groupe que celui qui l’a
crée (son père)
getThreadGroup() : pour connaitre son groupe
38
Création de groupe de threads
39
Types de threads
2 types de threads
les threads utilisateur
les démons
La différence :
la JVM fonctionne tant qu’il reste des threads utilisateurs en exécution
la JVM s’arrête s’il ne reste plus que des démons
Les démons sont là seulement pour rendre service aux threads
utilisateur. Exemple : ramasse-miettes
La méthode void setDaemon(true) de la classe Thread permet
d’indiquer que le thread sera un démon (utilisateur par défaut)
Elle doit être appelée avant le démarrage du thread par l’appel de
start()
Prof. Asmaa El Hannani ISIC/S3 86
Résumé
40