Ecole Nationale des Sciences de l’Informatique A. U. : 2011/2012
Devoir Surveillé
Systèmes Répartis et Applications
Groupes : II2-RSR&SLE Date : 13/03/2012
Durée : 2h00 Documents : Non autorisés
Responsables : N. Ben Azzouna & F. Najjar Nb. Pages : 2
Prière de lire attentivement l’énoncé et de respecter les notations du texte. On demande des réponses brèves mais claires et précises.
Exercice1 : Questions diverses (7 points –2(4\0,5)+1+1,5+0,5+2\1)
1. Dire (en 1-2 phrase(s)) quelle est la différence fondamentale entre les termes de chacune des paires suivantes :
1. un noyau monolithique et un micronoyau?
2. API et IDL ?
3. RPC et RMI ?
4. Passage par copie et passage par référence ?
2. Citez au moins deux formes de transparence, pour les systèmes répartis?
3. A quoi sert un serveur de noms ? en donnez deux exemples significatifs.
4. A quoi sert la version d’un programme RPC ?
5. A quoi sert la fonction CLIENT \* clnt\_create(server , PROG, VERS, path)?.
6. Que fait la commande
$ rpcinfo –u localhost 53687093
Exercice 2 : Programmation micro-RPC (6 points— 2+2,5+1,5)
On souhaite développer un serveur composé des trois services suivants :
- service1 : retourne un entier égal au double de celui passé en argument ;
- service2 : retourne une chaîne de caractères qui est la concaténation de deux chaînes passées en argument ;
- service3 : incrémente un compteur local au serveur.
1. Décrire la spécification du service en RPCL
2. Développez en C le fichier serveur.c.
3. Afin de profiter des appels de ces procédures distantes, dire comment un client peut se connecter au serveur ; et puis dire comment il fait appel à l’une des fonctions développées en 2) et enfin donnez l’appel de fonction de déconnexion.
Exercice 3 : Application Banque en RMI (7 points— 1+1+2+1,5+1,5)
On considère une application client/serveur de gestion de comptes bancaires (voir figure ci-dessous). Le service Banquier offre l’opération creeCompte qui crée un Compte correspondant à une Personne passée en paramètre, l’ajoute à la liste des comptes et le renvoie en retour.

1. Ecrire l’interface correspondant à ce service (qui sera invoqué à distance) appelée Banquier.
2. L’objet Personne sera implémenté côté client (TerminalBancaire) et passé par copie lors de l’invocation de creeCompte(Personne p). Quelle(s) condition(s) doit (doivent) être satisfaite(s) par Personne ? De quels fichiers class le serveur a-t-il besoin pour pouvoir exécuter cette méthode ?
3. L’objet Compte sera implémenté côté serveur et invoqué à distance par le client. Il offre les services suivants :
- verse: qui permet de verser un montant d’argent (de type flottant) dans le Compte.
- getSolde: qui permet de retourner le solde (de type flottant) correspondant à ce Compte.
Chaque Compte est détenu par une Personne.
Ecrire l’implémentation de l’interface Compte : CompteImpl.
1. Le code ci-dessous représente l’implémentation du client.
De quel côté (JVM client ou serveur) s’exécute co.verse(12)? Justifier.
Dans la méthode creeCompte(Personne p), on fait appel à une méthode de Personne, getNom(). Cette méthode est exécutée par la JVM client ou serveur ? Justifier.

Publicité
1. On souhaite développer le client sans utiliser le mécanisme de chargement dynamique, de quels fichiers class le client a-t-il besoin dans son CLASSPATH pour pouvoir s’exécuter? Justifier.
BON TRAVAIL
Proposition de correction
Systèmes et applications Répartis
Du 13/03/2012
Exercice1 : Questions diverses (7 points –2(4\0,5)+1+1,5+0,5+2\1)
1. Dire (en 1-2 phrase(s)) quelle est la différence fondamentale entre les termes de chacune des paires suivantes :
1. un noyau monolithique et un micronoyau?
🡪Un micronoyau est concerné par l’implantation du noyau dans l’espace mémoire privilégié et user alors qu’un noyau monolithique n’est implanté que dans l’espace mémoire privilégié.
- 1. API et IDL ?
🡪 API –interface programmatique alors que IDL (Interface description language) est une interface de description de langage, qui permet de masquer les divers problèmes liés à l’hétérogénéité.
- 1. RPC et RMI ?
🡪 RMI (remote method invocation) est une RPC à base d’objets.
- 1. Passage par copie et passage par référence ?
🡪 Passage par référence est réalisé pour un objet distant alors que le passage par copie se fait pour les objets locaux (doivent être sérialisables).
1. Citez au moins deux formes de transparence, pour les systèmes répartis?
🡪Transparence d’accès/localisation/migration/…
1. A quoi sert un serveur de noms ? en donnez deux exemples significatifs.
Serveur de noms ou de liaison (ou encore annuaire) sert essent. 1) à publier et 2) à rechercher et localiser un service distant. Exp. Portmapper et rmiregistery
1. A quoi sert la version d’un programme RPC ?
🡪Favoriser l’indépendance de m-à-j de serveur/client.
1. A quoi sert la fonction CLIENT \*clnt\_create(server, PROG, VERS, path)?. 🡪connecter le client au serveur hébergeant le programme PROG de version VERS
2. Que fait la commande
$ rpcinfo –u localhost 53687093
🡪 Appelle la procédure 0 du programme numéro 53687093 sur la machine localhost. Genre de ping afin de vérifier le bon fonctionnement du réseau et que le serveur tourne.
Exercice 2 : Programmation micro-RPC (6 points— 2+2,5+1,5)
1. //specif Micro\_rpc.x
//------------ 0,5 point
struct param{
string c1, c2;
};
Typedef struct param Param ;
/\\\ définition du programme avec les 3 fonctions \/
program MICRO\_RPC { // 0,25 point
version MICRO\_VERS\_1 {
void micro\_NULL(VOID)=0;
int doubler(int) = 1; // 0,25 point
string concat(Param)=2 ; // 0,25 point
Publicité
void increm(void) = 3; // 0,25 point
} = 1; // 0,25 point
} = 0x20000001; // 0,25 point
1. // serveur.c
//Déclarations : 0,5 point
#include<string.h>
#include ’’micro\_rpc.h’’
static int nb=0 ;
//Déclarations : 0,5 point
int \ doubler\_1\_svc(int \argp, struct svc\_req \*rqstp)
{
static in t result;
result = \argp \2;
return &result;
}
string \ concat\_1\_svc(Param \argp, struct svc\_req \*rqstp)
{
string result;
strcpy(result, strcat(argp->c1, argp->c2)) ;
return &result
}
void \ increm\_1\_svc(void \argp, struct svc\_req \*rqstp)
{
Nb++;
Return void\*(Nb);
}
3) /\\\\\\\\\\\\\\\ Client.c \\\\\\\/
// 0,25point
CLIENT \*clnt;
int x;
…
// connexion à la partie serveur: 0,5point
clnt = clnt\_create (host, MICRO\_RPC, MICRO\_VERS\_1, "TCP");
………
//Appel aux fonctions : 0,5point
increm\_1() ;
x=doubler\_1(x)
…
Publicité
//Déconnexion du serveur : 0,5 point
clnt\_destroy(client) ;
}
Exercice 3 : Application Banque en RMI (7 points— 1+1+2+1,5+1,5)
1. Ecrire l’interface correspondant à ce service (qui sera invoqué à distance) appelée Banquier.
import java.rmi.RemoteException;
import java.rmi.Remote;
public interface Banquier extends Remote { //0,5 pt
public Compte creeCompte(Personne p) throws RemoteException; //0,5pt
}
1. L’objet Personne sera implémenté côté client (TerminalBancaire) et passé par copie lors de l’invocation de creeCompte(Personne p). Quelle(s) condition(s) doit (doivent) être satisfaite(s) par Personne ? De quels fichiers class le serveur a-t-il besoin pour pouvoir exécuter cette méthode ?
Personne doit être sérialisable (implémenter java.io.serializable) (0,25 pt)
Le serveur a besoin de Personne.class, PersonneImpl.class (si on considère qu’on sépare l’interface de Personne de son implémentation) et de Compte.class et CompteImpl.class (0,75pt)
NB : J’accepte ne pas mettre PersonneImpl.class
1. L’objet Compte sera implémenté côté serveur et invoqué à distance par le client. Il offre les services suivants :
- verse: qui permet de verser un montant d’argent (de type flottant) dans le Compte.
- getSolde: qui permet de retourner le solde (de type flottant) correspondant à ce Compte.
Chaque Compte est détenu par une Personne.
Ecrire l’implémentation de l’interface Compte : CompteImpl.
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;//extends UnicastRemoteObject : 0,25pt
//implements Compte : 0,25pt
public class CompteImpl extends UnicastRemoteObject implements Compte {//déclaration des attributs 0,5pt
Personne proprio;float solde = 0;// throws RemoteException 0,25pt
//implémentation du constructeur et des 2 méthodes 0,75pt
public CompteImpl(Personne p) throws RemoteException {proprio = p;
}
public void verse(float montant) throws RemoteException {solde += montant;}public float getSolde() throws RemoteException {return solde;}
}
1. Le code ci-dessous représente l’implémentation du client.
De quel côté (JVM client ou serveur) s’exécute co.verse(12)? Justifier.
Dans la méthode creeCompte(Personne p), on fait appel à une méthode de Personne, getNom(). Cette méthode est exécutée par la JVM client ou serveur ? Justifier.
Co.verse s’exécute du côté du serveur parce que Compte est implémenté côté serveur comme étant un objet distant (extends UnicastRemoteObject) donc creeCompte va renvoyer une référence sur le nouveau compte créé qui sera utilisée pour exécuter verse à distance. (0,5+0,5 justification)
Personne est implémentée côté client mais elle est passée par copie au serveur lors de l‘invocation de creeCompte donc getNom() sera exécutée sur la copie de l’instance de l’objet Personne se trouvant côté serveur. (0,25+0,25)
1. On souhaite développer le client sans utiliser le mécanisme de chargement dynamique, de quels fichiers class le client a-t-il besoin dans son CLASSPATH pour pouvoir s’exécuter? Justifier.
Le client a besoin de
- Personne.class (et PersonneImpl.class : optionnel) : pour créer la nouvelle instance de Personne (Laurent) qui sera sérialisée et envoyer au serveur. (0,5pt)
- Compte.class : pour connaître les services offerts par Compte (exp : verse) (0,5pt)
- Banquier.class : pour connaître les services rendus par l’objet Banquier dont la référence est récupérée à partir du registre rmi. (0,5pt)