Feuille de TD 4
Feuille de TD 4
Feuille de TD 4
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Université <strong>de</strong> Provence<br />
MASTER INFORMATIQUE<br />
Programmation Parallèle<br />
et Distribuée<br />
2011-2012<br />
Java RMI<br />
1 RMI<br />
1. Donner toutes les manières possibles d’obtenir un objet distant. Pour chacune d’entre elles,<br />
proposer un exemple illustratif.<br />
2. Un objet distant peut-il être considéré comme une variable partagée entre différents clients<br />
RMI Si oui, comment doit-on gérer les accès concurrent <br />
3. Qu’est-ce qu’un ramasse-miette En quoi un ramasse-miette distribué <strong>de</strong>vrait être différent<br />
d’un ramasse-miette local.<br />
2 Calcul Parallèle<br />
Etant donnée la formule <strong>de</strong> Leibniz :<br />
π = 4 arctan(1) = 4<br />
∞∑<br />
n=0<br />
(−1) n<br />
2n + 1<br />
Il s’agit ici <strong>de</strong> distribuer le calcul en sous-sommes <strong>de</strong> i à j ( ∑ j (−1) n<br />
n=i 2n+1<br />
). Le client <strong>de</strong>vra distribue<br />
le calcul parmi un certain nombre <strong>de</strong> serveurs.<br />
1. Quel est le problème avec le co<strong>de</strong> ci-après Comment peut-on résoudre le problème <br />
Calcul.java<br />
import java . rmi . ∗ ;<br />
import java . math . ∗ ;<br />
public i n t e r f a c e Calcul extends Remote {<br />
/ / metho<strong>de</strong> c a l c u l a n t l a somme <strong>de</strong> i a j<br />
public BigDecimal c a l c u l e r ( i n t <strong>de</strong>but , i n t f i n )<br />
throws RemoteException ;<br />
}<br />
CalculImpl.java<br />
import java . rmi . ∗ ;<br />
import java . rmi . server . ∗ ;<br />
import java . math . ∗ ;<br />
public c l a s s CalculImpl extends UnicastRemoteObject implements Calcul {<br />
public CalculImpl ( ) throws RemoteException {<br />
super ( ) ;<br />
}<br />
}<br />
public BigDecimal c a l c u l e r ( i n t <strong>de</strong>but , i n t f i n ) {<br />
BigDecimal somme = BigDecimal .ZERO;<br />
for ( i n t j =<strong>de</strong>but ; j < f i n ; j ++){<br />
i n t c o e f f = ( j %2==0)1: −1;<br />
BigDecimal terme = new BigDecimal ( c o e f f / ( 2 . 0 ∗ j + 1 . 0 ) ) ;<br />
somme = somme . add ( terme ) ;<br />
}<br />
somme=somme . multiply (new BigDecimal ( 4 ) ) ;<br />
return somme ;<br />
}<br />
1
CalculServer.java<br />
import java . math . ∗ ;<br />
import java . rmi . ∗ ;<br />
public c l a s s CalculServer {<br />
public s t a t i c void main ( S t r i n g args [ ] ) {<br />
i f ( args . length ! = 1 ) {<br />
System . out . p r i n t l n ( " Syntaxe : java CalculServer port " ) ;<br />
}<br />
t r y { / / C r e a t i o n <strong>de</strong> l ’OD<br />
CalculImpl od = new CalculImpl ( ) ;<br />
/ / E n r e g i s t r e m e n t <strong>de</strong> l ’OD dans RMI<br />
Naming . rebind ( "// l o c a l h o s t : "+args [ 0 ] + "/ c a l c u l " , od ) ;<br />
System . out . p r i n t l n ( " Enregistrement termine . . . " ) ;<br />
}<br />
catch ( Exception e ) {<br />
System . out . p r i n t l n ( "L ’ enregistrement a echoue . . . \ n"+e ) ;<br />
}<br />
}<br />
}<br />
CalculClient.java<br />
import java . rmi . ∗ ;<br />
import java . rmi . r e g i s t r y . ∗ ;<br />
import java . net . ∗ ; / / pour l e s u r l<br />
import java . math . ∗ ;<br />
public c l a s s C a l c u l C l i e n t {<br />
public s t a t i c void main ( S t r i n g args [ ] ) {<br />
i n t nbServeur= args . length /2;<br />
i n t n ;<br />
BigDecimal t o t a l = BigDecimal .ZERO;<br />
Calcul [ ] od=new Calcul [ nbServeur ] ;<br />
i f ( args . length %2!=1) {<br />
System . out . p r i n t l n ( " Syntaxe : java C a l c u l C l i e n t n serveur1 port1 serveur2 port2 . . . " ) ;<br />
}<br />
e lse {<br />
n= I n t e g e r . p a r s e I n t ( args [ 0 ] ) ;<br />
for ( i n t j =0; j