CM Thread TCP UDP RMI
CM Thread TCP UDP RMI
40 41
Groupe de threads (Exemple) Partage d’information
Deux façons pour partager des données entre les threads:
public class ThreadGroupTest implements Runnable{ Les variables statiques: variable de classe partagée par toutes les instances d’une
public void run() {
classe.
[Link]([Link]().getName()); Exemple: static volatile int compteur = 0 ;
} volatile oblige la JVM à rafraichir son contenu à chaque utilisation.
public static void main(String[] args) {
ThreadGroupTest runnable = new ThreadGroupTest(); Constructeur Thread(Runnable): Créer plusieurs threads à travers (constructeur de
ThreadGroup gp= new ThreadGroup("Parent la classe Thread) un même objet runnable.
ThreadGroup");
Thread t1 = new Thread(gp, runnable,"one");
Exemple: public static void main(String[] args){
[Link](); MyRunnable r = new MyRunnable();
Thread t2 = new Thread(gp, runnable,"two");
[Link]();
Thread t1= new Thread(r,”t1”);
Thread t3 = new Thread(gp, runnable,"three"); Thread t2= new Thread(r,”t2”);
[Link](); // l’objet r est partagé entre les
[Link]("Thread Group Name: thread t1 et t2
"+[Link]());
[Link](); [Link]();
} [Link]();
} }
42 43
Opération non
1. Load charger a atomique
Ecrire un programme qui crée trois threads incrémentant une 2. Add incrémenter a
même variable Interférence 1. Load charger a
2. Add incrémenter a
3. Store remettre la somme
dans a
3. Store remettre la somme
dans a
44 45
Exclusion mutuelle et section critique Accès concurrent
L’exécution d’une suite d’instructions (non atomique) peut engendrer des incohérences
L'exclusion mutuelle est une méthode qui permet de s'assurer que si Problème Comment être sur que la portion du code (variable partagée) sera exécuter
un thread utilise une ressource partagée, les autres processus seront par un seul thread à tout moment?
excluent de la même activité.
Solution Utiliser un mécanisme d’exclusion mutuelle pour contrôler l’accès à une
Section critique: portion du programme à partir de laquelle on ressource partagée.
accède à une ressource partagée. En Java, chaque objet possède un verrou implicite (moniteur) gérée par la JVM
Pour éviter les problèmes d'accès concurrent, il faut empêcher que Synchronisation d’un bloc d’instructions
deux threads se retrouvent simultanément dans une section critique. Verrou appliqué sur obj
synchronized (objet){ lorsqu’on invoque
// Aucun autre thread ne obj.m() (m() méthode sync)
// peut accéder à objet
ou bien le bloc sync
}
(synchronized (objet) {})
Synchronisation d’une méthode
Le verrou est libéré :
synchronized void m(){
// Aucun autre thread ne en quittant la partie
// peut accéder à l’objet synchronisée
// pour lequel est appelé la en appelant la méthode wait
méthode m
}
46 47
}
48 49
Synchronisation statique Producteur / consommateur
Une méthode de classe (static) synchronisée (synchronized) applique un Producteurs ont pour mission de déposer des items dans la file
verrou sur toute la classe: Les consommateur les retirent de la file d’attente
Quand la ressource partagée appartient à toute les instances d’une classe
Si la file est vide le consommateur doit attendre
Si la file est pleine le producteur doit attendre
EM entre t1 et t2
50 51
Thread1 Thread2
Requière
détient
détient
Objet Objet
1 2
56 57
Exemple Pool d’exécution des Thread
Les threads sont mappés aux threads au niveau du système (ressources du
public class Deadlock { OS).
Object m1 = new Object(); Créer des threads de manière incontrôlable => manquer rapidement de
Object m2 = new Object(); ressources.
Obtenir un résultat de l'exécution d'un thread
attendre la fin d'un ensemble de threads
public void ping() { public void pong() {
synchronized (m1) { synchronized (m2) { Solution: Le pattern Thread Pool
Économiser des ressources dans une application multithread et de contenir le
synchronized synchronized
parallélisme dans certaines limites prédéfinies.
(m2) { (m1) { planifier l'exécution des tâches et de conserver les tâches entrantes dans une file
// Code synchronisé sur // Code synchronisé sur d'attente.
// les deux moniteurs // les deux moniteurs
} } Séparation entre la tâche et le contexte d’exécution
Ecrire le code concurrent sous la forme de tâches parallèles et les soumettre
} }
pour exécution à une instance d'un pool de threads.
} } L’instance contrôle plusieurs threads réutilisés pour l'exécution de ces tâches.
58 59
Introduction
Un S.D. est un ensemble de nœuds sur un réseau qui communiquent entre
eux en échangeant des messages pour coordonner leurs actions afin
d'effectuer un ensemble de tâches.
Communication
Vision Matérielle:
Machines multi-processeurs avec mémoire partagée
connectées entre eux (liaison filaire ou sans fil)
via réseau
Via un réseau (typologie (LAN, MAN, WAN), topologie (Bus, Etoile, anneau, etc.))
CHAPITRE 3
64 65
Introduction Rappel sur les réseaux
Vision logicielle: Système ouvert: système désirant échanger des données avec un autre
Ensemble d’entités logiciels s’exécutant indépendamment et en parallèle sur des
Norme OSI (Open System Interconnection) de l'ISO : architecture en 7
machines
On parlera de processus (programme en cours d’exécution) plutôt que de logiciel. couches Dialogue
Ces processus communiquent entre eux via des canaux de communication Programme A Programme B
Processus Processus
A B
CANAL
66 67
Réseau : construction des paquets, trouver les routes à travers un réseau pour atteindre la
machine destinataire (IP adresse)
Liaison : assemblage des blocs de données (trames) et gestion d'accès au support physique,
assure que les données envoyées sur le support physique sont bien reçues par le destinataire
68 69
Rappel sur les réseaux Architecture Client / Serveur (Rappel)
réponse
4. Client: reçoit la réponse du serveur 2.2 3.2
Architecture P2P???? 4
3.3
70 71
72 73
Adresse d’une application Les Sockets
Une socket (Prise) est le point de communication par lequel un processus peut
émettre/recevoir des données à travers le réseau.
A chaque socket est associé un port local
Permet la communication avec une application distante (port distant sur une machine
distante)
Canal de communication
74 75
Flux d’entrée/sortie
L'adresse du serveur (@IP et port) est connue du client
Dissymétrie de la communication/connexion
Le client initie la connexion ou la communication
Canal de communication
76 77
Flux d’entrée/Sortie Flux de caractères
Un Processus (Programme en cours d’exécution) a besoin d'échanger des données: Java gèrent les caractères avec le format Unicode (2 octets)
Recevoir des données d'une source
Deux classes de base (abstraites) Reader ou Writer.
Envoyer des données vers un destinataire
De nombreuses sous-classes pour traiter les flux de caractères
En java, les entrées sorties sont gérés par des objets de Flux permettant d'encapsuler les
processus d'envoi et de réception (package [Link])
Préfixe représenter des flux ou bien des filtres:
les flux peuvent être divisés en deux catégories :
Flux: le préfixe contient la source ou la
les flux manipulant des caractères (reader/writer)
Flux (E/S) destination du flux
Les flux manipulant d'octets (in/out) Filtres: le préfixe contient le type de traitement
qu'il effectue
Flux de Préfixe Buffered: Améliorer les performances avec
Flux d’octets la mise en tampon des données (lues ou écrites)
caractères
BufferedReader fichier =
new BufferedReader(
new FileReader(“[Link]"));
InputStream OutputStream Reader Writer
78 79
80 81
Flux de caractères (Classe Writer) Exemple flux de caractères (Ecriture)
public class TestPrintWriter {
private String destination;
public TestPrintWriter(String destination) {
Méthodes Rôles [Link] = destination;
ecriture();
close() Ferme le flux et libère les ressources qui lui étaient associées }
public static void main(String args[]) {
write(int) Ecrire le caractère en paramètre dans le flux. new TestPrintWriter("[Link]");
}
write(char[]) Ecrire le tableau de caractères en paramètre dans le flux. private void ecriture() {
try {
String ligne ;
write(char[], int, int) Ecrire plusieurs caractères. Elle attend en paramètres : un tableau de
caractères, l'indice du premier caractère et le nombre de caractères à String data = "systemes distribués";
écrire. PrintWriter fichier = new PrintWriter(new
FileWriter(destination));
write(String) Ecrire la chaîne de caractères en paramètre dans le flux [Link]("bonjour tout le monde");
[Link]("Nous sommes le "+ new
write(String, int, int) Ecrire une portion d'une chaîne de caractères. Elle attend en paramètre : Date());
une chaîne de caractères, l'indice du premier caractère et le nombre de [Link]("intitulé du module est:
caractères à écrire. " + data);
[Link]();
} catch (Exception e) {
[Link]();
}
}
}
82 83
Les classes qui gèrent les flux d'octets héritent d'une des deux classes
abstraites InputStream ou OutputStream.
Méthodes Rôles
Il existe de nombreuses sous-classes pour traiter les flux d'octets
close() Ferme le flux et libère les ressources qui lui étaient associées
84 85
flux d'octets (Lecture sur un fichier) Exemple flux d’octets (L/E sur fichier)
public class FileUtilitiesFichier {
public static void copierfichierOctets(String source, String dest)throws
IOException{
FileInputStream in = null;
FileOutputStream out = null;
Méthodes Rôles
try {
in = new FileInputStream(source);
close() Ferme le flux et libère les ressources qui lui étaient out = new FileOutputStream(dest);
associées int c; //byte buffer[] = new byte[1024];
int read() envoie la valeur de l'octet lu ou -1 si la fin du flux est while ((c = [Link]()) != -1) //(c = [Link](buffer)) !=
atteinte. -1
[Link](c); //[Link](buffer, 0, c);
int read(byte[], lit plusieurs octets. En paramètre : un tableau }
int, int) d'octets qui contiendra les octets lus, l'indice qui finally {
recevra le premier octet et le nombre d'octets à lire if (in != null) [Link]();
if (out != null) [Link]();
int available() retourne une estimation du nombre d'octets qu'il }
est encore possible de lire dans le flux }
Principe de fonctionnement
TCP fonctionne en mode connecté (point à point):
1)Le Serveur enregistre son Service sur un port et se met sous écoute à l’aide d’une Socket Serveur
2)Le client crée une socket (port dynamique) puis demande d’ouvrir une connexion avec le serveur
(@IP:port) sur sa socket Serveur d'écoute
3)Du coté du serveur, le service d'attente de connexion retourne une socket de service (Par client)
Sockets TCP
4)le client et le serveur communiquent en envoyant et recevant des données via leurs sockets (I/O)
Client Serveur @IP:[Link]
Création SocketServeur sur un port précis (7654)
Attente d’une connexion réserve
Création de la socket
Un port local est dynamiquement
assigné Demande de connexion un port temporaire
automatiquement local
(4545) à chaque client
Création d’une socket de service (client)
(19529)
Entrée Sortie
Communication avec le client via cette socket
Communication avec le serveur
Sortie Entrée
88 89
Sockets TCP en Java InetAdress Exemple
public class InetAdressDemo{
Classes du package [Link] utilisées pour communication via TCP
public static void main(String[] args){
InetAddress adr;
Socket ServerSocket InetAdress try {
Socket(String host, int port) ServerSocket(int port) InetAddress getByName(String host) adr = [Link]("[Link]");
InetAddress getLocalHost()
Static
• Socket accept()
InputStream getInputStream() [Link]("Host Name: "+[Link]());
renvoie la socket et String getHostName()
OutputStream getOutputStream() établit une connexion
renvoie le nom d'hôte de l'adresse [Link]("IP Address: "+[Link]());
Retourne le flux d’entrée/sortie (C/S).
attaché à cette socket IP.
• void close() String getHostAddress() } catch (UnknownHostException e) {
void close() Ferme la socket serveur
Ferme la socket client renvoie l’adresse IP du hôte. [Link]();
}
ServerSocket ss=new }
ServerSocket(7654);
Socket s=[Link]();
90 91
Problèmes
Socket s = [Link]();
Le serveur et le client seront bloqués si les
donnée à partir de la socket ne sont pas
disponibles(lecture/écriture)
String line = [Link]();
96 97
Socket Côté Serveur (MultiThread)
1. Créer une socket serveur // port d’écoute port_id
ServerSocket server = new ServerSocket(port_id);
2. Répéter
i. Attendre une connexion avec un client public class ClientJob extends Thread {
Socket s_com_client = [Link](); private Socket socket;
public ClientJob(Socket socket) {
[Link] = socket;
ii. Traitement sur la connexion
Socket UDP
}
100 101
Socket UDP en Java Socket Côté client
Java intègre nativement les fonctionnalités de communication réseau :Package [Link]
1. Encapsuler l’adresse du serveur dans un objet InetAddress
Classes utilisées pour communication via UDP
InetAddress : codage des adresses IP InetAddress adr = [Link]("[Link]");
DatagramSocket : socket mode non connecté (UDP)
2. Spécifier les données à envoyer
DatagramPacket : paquet de données envoyé via une socket sans connexion (UDP) byte[] sendData = (new String(“message envoyé au serveur")).getBytes();
3. Créer un paquet avec les données et en précisant l'adresse du serveur
DatagramPacket DatagramSocket
InetAdress DatagramPacket packet = new DatagramPacket(sendData, [Link], adr, 7676);
DatagramPacket(byte[] buf, int length, InetAddress address, DatagramSocket(int port)
int port)
DatagramSocket() InetAddress getByName(String host) 4. Créer d'une socket sans la lier à un port particulier (allocation dynamique)
DatagramPacket(byte[] buf, int length) InetAddress getLocalHost() Static
socket = new DatagramSocket();
• void send(DatagramPacket p) Processus Client
InetAddress getAddress() Si paquet à envoyer : String getHostName()
Envoie le paquet au destinataire 5. Envoyer le paquet via la socket
adresse du destinataire renvoie le nom d'hôte de
spécifié dedans (@IP/port) .
Si paquet reçu : adresse de l’émetteur • void receive(DatagramPacket p) l'adresse IP. [Link](packet);
send
int getPort() Retourne le port enregistré dans le Reçoit un paquet. Les données String getHostAddress()
paquet(Emetteur ou destinataire) reçues seront placées dans P (data, receive
renvoie l’adresse IP du hôte. 6. Fermer la socket
byte[] getData() Données contenues dans le paquet adresse émetteur)
• int getLocalPort() Retourne le port [Link]()
Int getLength() retourne la longueur des données local de lié à la socket
(envoyées/reçues) • void close() Ferme la socket
LES SETTERS AUSSI!!!
102 103
[Link](packet); [Link]([Link]());
Processus Serveur
6. Récupérer (et afficher) les données [Link]([Link]());
7676 send Envoyer le paquet au client
String s = new String([Link](), 0, [Link]());
[Link](" Message reçu du client: "+s); receive [Link](packet);
104 105
Résumé
Socket UDP
Simple à programmer
Pas fiable
Ne permet d'envoyer que des tableaux de byte
Multicast UDP/IP
les Langages de programmation de haut niveau manipulent des objets
106 107
Introduction Multicast
Adresse IP multicast
Communiquer des applications 1 à 1 via des sockets UDP ou TCP Classe d'adresse IP entre [Link] et [Link]
Comment réaliser une communication 1 à plusieurs? Classe D
Adresses entre [Link] et [Link] sont utilisables par un programme quelconque
UDP offre un autre mode de communication : multicast Les autres sont réservées
Plusieurs récepteurs pour une seule émission d'un paquet Une adresse IP multicast n'identifie pas une machine sur un réseau mais un groupe multicast
Broadcast, multicast
Broadcast (diffusion) : envoi de données à tous les éléments d'un réseau
Multicast : envoi de données à un sous-groupe de tous les éléments d'un réseau
Multicast IP
Envoi d'un datagramme sur une adresse IP particulière
Plusieurs éléments lisent à cette adresse IP
108 109
Multicast Multicast
Adresse IP multicast
Classe d'adresse IP entre [Link] et [Link] Utilités du multicast UDP/IP
Classe D Évite d'avoir à créer X connexions et/ou d'envoyer X fois la même
Adresses entre [Link] et [Link] sont utilisables par un
programme quelconque
donnée à X machines différentes
Les autres sont réservées Utilisé pour diffuser des informations
Une adresse IP multicast n'identifie pas une machine sur un
réseau mais un groupe multicast
Diffusion de flux vidéos à plusieurs récepteurs
Chaîne de télévision, diffusion d'une conférence
Socket UDP multicast
Le même flux est envoyé à tous au même moment
Avant envoi de paquet : on doit rejoindre un groupe
Identifié par un couple : @IP multicast/numéro port Pour récupérer des informations sur le réseau
Un paquet envoyé par un membre du groupe est reçu par tous les membres
[Link] : pour localiser un serveur DHCP
de ce groupe
Limites
Non fiable et non connecté (comme UDP)
110 111
Constructeurs : identiques à ceux de DatagramSocket socket UDP multicast pour communiquer avec groupe [Link]:4000
[Link](group);
112 113
Introduction
Sur une même machine
Interaction entre composants software: Un composant pourra demandé un service d’un
autre composant.
Appel à une fonction/ procédure. En local
En POO appel à une méthode:
RMI
[Link](); methode()
Communication bas niveau qu'appel de fonction
Comment réaliser un tel appel pour une méthode qui se trouve à distance???
CHAPITRE 3 (SUITE)
Machine A Machine B
« use » b : Classe B
a : Classe A Public void
[Link](); methode()
115
114
Objectif Middleware
Idée générale:
Invoquer une méthode d’un objet distant de façon simple voire identique à un appel local.
Middleware (intergiciel en fr) : couche logiciel
Principes
On différencie le coté appelant (client) du coté appelé (serveur) Situer entre le système d'exploitation/réseau et les éléments de l'application
Le serveur offre la possibilité à des éléments distants d'appeler une ou plusieurs distribuée
méthodes qu’il hébérge. Offre un ou plusieurs services de communication entre les éléments formant
Le côté client appelle localement la fonction sur un élément spécial (Talon) qui relayera la l'application ou le système distribué
demande d'appel de fonction coté serveur
Dans le Côté serveur, un élément spécial (Squelette) appellera la fonction et renverra le Services de plus haut niveau que les communications via sockets TCP/UDP,
résultat au client augmentation du niveau d'abstraction
Middleware!!!!!
116 117
Familles de Middleware Familles de middlewares
Plusieurs Solutions caractéristiques générales
Mémoire partagée Permet une plus forte dynamicité : ajout (et départ) d'éléments connectés au middleware faciliter par les faibles
interactions et l'anonymat
Accès à une mémoire commune distribuée Mode 1 à plusieurs
JavaSpace de Java Diffusion de messages à plusieurs éléments en même temps
Accès aux informations de la mémoire par plusieurs éléments
118 119
120 121
RMI Principe générale
Package [Link] : classes/interfaces à utiliser pour établir des communications via RMI
Solution java intégré au JDK (depuis la version 1.1) Règles principales à suivre
Une version "orientée objet" de RPC Une interface de méthodes appelables à distance doit spécialiser l'interface [Link]
Transparent : Permet aux Objets Java Distants de communiquer sans écrire une ligne de Toute méthode de cette interface doit préciser dans sa signature qu'elle peut lever l'exception
code réseau RemoteException
Simple: Lorsque les objets communicants sont implémentés en Java, la communication est Le serveur implémente une (ou plusieurs) interface(s) spécialisant Remote et doit spécialiser (ou utiliser
plus simple que d’autres solutions (CORBA par exemple). des services de) UnicastRemoteObject
Caractéristiques de RMI Les classes des données en paramètres ou retour des méthodes doivent implémenter Serializable
Communication basée sur les sockets
Codage des échanges via un protocole propriétaire
RMP (Remote Method Protocol) Côté Client Côté Serveur
L’accès aux méthodes distantes se fait via cet interface
« interface » Remote
IRemote
« interface »IRemote
Objet getOperation1( params) throws RemoteExeception
« use » Objet getOperation2( params) throws RemoteExeception UnicastRemoteObject
Client
Iremote r;
r.getOperation1(para
ImpInterfaceRemote
m),
122 123
124 125
Registre de noms (Démarrage) Registre de noms
Ligne de commande Classe [Link] offre des méthodes statiques pour enregistrer des objets et
récupérer leurs références
Unix/Linux : $ rmiregistry [port]
void bind(String name, Remote obj)
Windows : > start rmiregistry [port]
Enregistre un objet sous le nom name (erreur si déjà un objet avec ce nom)
Le port d’écoute par défaut est 1099
void rebind(String name, Remote obj)
Objet Java qui peut lancer un registry Enregistre un objet sous le nom name, en écrasant la précédente liaison objet/nom si elle existait
La classe [Link] est utilisée pour faire fonctionner un void unbind(String name)
registre sur le hôte local. Supprime du registry la référence vers l'objet nommé name
public static Registry createRegistry(int port) throws RemoteException String[] list(String name)
Exemple: [Link](1099); Retourne l'ensemble des noms des objets enregistrés sur le registry
N.B l’attribut name dans les 5 méthodes est sous la forme URL de type RMI
(rmi://hote:port/nomObj )
126 127
128 } 129
}
Stub et Skeleton Gestion de sécurité
Générer les classes stub et skeleton à base du fichier de l'objet distant A chaque fois qu’un programme charge du code à partir d’une autre machine
sur le réseau, le problème de la sécurité se pose
JDK 1.2 (ligne de commande)
rmic –v1.2 BanqueRemote utiliser un gestionnaire de sécurité dans les applications clientes RMI
Deux fichiers sont générés [Link]
Fichier stub [Link](RMISecurityManager)
BanqueRemote_Skel.class
Par défaut, RMISecurityManager empêche tout le code dans le
programme d'établir des connexions réseau.
Skelet
Stub on Nécessité d’avoir une permission pour atteindre le RMI Registry, les objets
distants, etc.
JDK 5.0:
Toutes les classes stub sont générées automatiquement
Solution: Mise en place d’une politique de sécurité (client ou serveur) via «policy
file»: [Link]
La classe skeleton n’est plus nécessaire à partir de JDK1.2
grant{
permission [Link] "localhost:1099",
"connect, resolve, accept, listen";
}
Documentation en ligne
130 131
grant{
permission [Link]
"*:1024-", "connect, accept, listen";
Exemple(côté serveur) }
Exemple (côté client)
Accéder à distance à des données relatives aux comptes d’une banques Les parties client se connectent au serveur pour accéder aux données
public class MainServer { public class MainClient {
public static void main(String[] args) {
try { public static void main(String[] args) {
// TODO Auto-generated method stub
[Link]("[Link]","[Link]
");
try {
[Link](new
SecurityManager()); [Link]("[Link]","[Link]");
[Link](new
RemoteBanque b= new RemoteBanque();
// ajouter des comptes… SecurityManager());
// démarrer le registre de noms RMI IRemoteBanque
sur le port 1099 banque=(IRemoteBanque)[Link]("rmi://localhost:1099/ba
[Link](1099); Autorise l’application à écouter,
nque");
// Enregistre l’objet b sous le nom banque, en accepter et établir des connections
écrasant //la précédente liaison b/banque si réseau sur un port supérieur à 1024 String s=[Link](0);
Autorise l’application à établir des
elle existait sur le l’hôte local. [Link](" le nom du client est:"+s);
connections réseau au port 1099 sur
[Link]("rmi://localhost:1099/banque", [Link]("le solde actuel l’hôte local (machine contenant le
b);
[Link](" le serveur est pret à est :"+[Link](0)); registry).
grant{
recevoir des demandes..."); } catch (Exception e) {
} catch (Exception e) {
permission [Link] "localhost:1099",
132 // TODO "connect";
Auto-generated catch block 133
[Link]();
}
[Link]();
}
}
Résumé
Dans un programme Java
Obj
Les Objets possèdent des références les uns sur les autres Obj
2
1
Ils peuvent appeler des méthodes sur les objets dont ils ont les références
Les paramètres et valeur de retour des méthodes peuvent être des références Obj
d'objet 3
JVM Local
Java RMI
Coordination
Un objet « distribué » accessible à distance
Le but est détendre le concept de référence d'objet à des objets physiquement
distants (dans une autre JVM)
Pouvoir appeler les méthodes de l’objet distant comme en local
Obj
CHAPITRE 4
Obj
Obj D
2
1
Obj
3
JVM Distant
JVM Local
134 135
Algorithmes de
synchronisation
Problèmes spécifique au contexte distribué Dans un contexte distribué, chaque Processus (tournant sur une machine
Temps: qu’on est ce qu’une action doit être lancée?? distante) possède sa propre horloge
Comment garantir l’exclusion mutuelle dans un contexte distribué? Comment définir un temps global cohérent et « identique » (ou presque)
Election pour tous les processus
Consensus
Tolérance aux pannes
136 137
138