Cours: INF4402
Projet: 2
Nom de
famille: Pieraut, Prénom: Francis, Matricule: 60104
Nom
de famille: AZIZI, Prénom: Oussama, Matricule: 1006964
Corba est née du besoin d’interopérabilité entre le nombre toujours grandissant de différents produit logiciel et matériels. Il a été fondé par L'Object Management Group (OMG) qui est un consortium international (fondé en 1989) regroupant actuellement environ 600 membres. L'OMG vise à promouvoir les technologies orientées objets pour la conception d'applications informatiques distribuées, interopérables et ouvertes. L'OMG a ainsi défini dans l'Object Management Architecture Guide (OMA) son modèle d'objets distribués et inter opérables. Ce modèle est supporté par l'architecture CORBA (Common Object Request Broker Architecture). CORBA définit un ensemble de composants : le langage IDL, les projections, l'ORB, l'Interface Repository, la DII, le BOA. L'interface fonctionnelle de ces objets est décrite grâce au langage IDL (Interface Description Language). L'IDL est un langage de description d'interfaces totalement indépendant du langage de programmation. La projection (ou mapping) permet de générer du code pour exploiter le type d'objet a partir d'un langage de programmation. Ce mécanisme est dépendant du langage cible. Avec Corba, les utilisateurs ont accès à l’information de façon transparente, sans se soucier du logiciel ou du matériel.
L'Object Management Group propose une solution globale pour la construction d'applications distribuées résolvant les problèmes de communication, d'hétérogénéité, d'intégration et d'interopérabilité.
Orbit est le système que nous allons utiliser pour faire ce travaille pratique. Orbit est une implementation respectant les spécifications de CORBA 2.2 Object Request Broker (ORB).
Dans ce travail pratique nous avons programmé un client et un serveur qui utilise Corba pour communiquer. Le serveur est un serveur de fichier qui limite l'accès à un repertoire spécifique. Le client fait des requêtes à ce serveur afin d'aller récuperer un fichier qui se trouve dans le répertoire spécifique du server. Le mécanime implanté permet aussi d'aller chercher de l'information sur le fichier demandé tel sa taille et sa date de dernière modification. Une fois ces mécanismes implantés, nous avons fait des analyses de performance en évaluant le temps requis pour faire des appels simples, des appels à travers CORBA sur un même ordinateur et des appels CORBA à travers le réseau. Par la suite nous avons évaluer le temps requis pour faire des lectures d'un document en local, par réseau avec NFS, à travers CORBA en local, et à travers CORBA par le réseau.
Côté serveur:
Afin de simplifier les analyses à faire, nous avons ajouté l'option -s au serveur afin de faire les appels Corba simples. Donc dans le code du serveur nous retrouvons le code suivant :
if(appel_simple)
{
time(&t_before);
for(i = 0 ; i < nb ; i++)
{
do_getServerInfo(server,
version, &info, &date, &ev);
...
}
Le serveur fait une vérification des accès du client en vérifiant la présence de ".." dans le nom du fichier demandé. Ceci est fait de la facon suivante dans la fonction do_openfile(..):
if(strstr(nomFichier,"..") != NULL)
{
sprintf(message_erreur,"Ce fichier %s fait reference a un repertoire
parent\n",nomFichier);
(*erreur) =
CORBA_string_dup((CORBA_char *) strdup(message_erreur));
return ERROR;
}
La validité du repertoire spécifier du coté serveur à été vérifier de la facon suivante:
//Verification de la validite du repertoire
if
(repertoire_requetes!=NULL)
{
if (stat
(repertoire_requetes, &stat_repertoire) < 0 || S_ISDIR
(stat_repertoire.st_mode)== 0)
{
printf("Le repertoire entre
n'existe pas \n");
return
ERROR;
}
}
Afin de réaliser les fonctions désirées, nous avons défini l'interface IDL suivante:
typedef sequence<octet> ByteSequence;
typedef char
Version[12];
interface DocumentServer
{
void getServerInfo(out
Version version, out ByteSequence info,
out string date);
long
openFile(in string nomFichier, out long taille, out string derniereModification,
out string erreur);
short closeFile(in long pFILE);
short getDocument(in
long pFILE, out ByteSequence byteSeq);
};
Côté client et serveur:
Nous avons ajouté l'option -o afin de spécifier le nombre d'ouverture du
fichier.
Mode d'utilisation de notre client et serveur:
Usage: httpclient -n nom du fichier ds lequel placer l'adresse (par defaut
doc.ior)
-p nom du repertoire a partir duquel servir les
requetes
-o nombre d'ouverture locale du
fichier
-s nombre d'appel a la fct getServerInfo
Usage: httpServer -n nom du fichier dans lequel placer l'adresse (par defaut
doc.ior)
-p nom du repertoire a partir duquel servir les
requetes
-o nombre d'ouverture locale du fichier
DocumentServer.idl
-s nombre d'appels simple a la fct getServerInfo
... (liens vers les fichiers source) DocumentServer-client.c DocumentServer-server.c et DocumentServer.idl
Les tests ont été fait dans le laboratoire CASI (centre d'analyse des systèmes informatique). C'est un réseau LINUX de plusieurs PC. Nous avons effectué nos tests à partir de deux des machines de ce réseau, soit Phenergan et Mario (2 PIII/500mhz)
Voici les résultats des appels à la fonction GetServerInfo
Appels Corba simples | Appels Corba Locaux | Applels Corba réseau | ||||
10 000 | 100 000 | 10 000 | 100 000 | 10 000 | 100 000 | |
Phenergan | 2 sec. | 19 sec. | 3 sec. | 34 sec. | 7 sec. | 68 sec. |
Mario | 2 sec. | 21 sec. | 34 sec. | 35 sec. | 7 sec. | 68 sec. |
Voici les résultats des appels à la lecture du fichier DocumentServer.idl sur la partition locale et sur la partition NFS
Appels Corba simples | Appels Corba Locaux | Appels Corba réseau | ||||
1 000 | 10 000 | 1 000 | 10 000 | 1 000 | 10 000 | |
Mario (local) | 1 sec. | 9 sec. | 1 sec. | 15 sec. | 3 sec. | 29 sec. |
Mario (NFS) | 1 sec. | 10 sec. | 1 sec. | 12 sec. | 2 sec. | 27 sec. |
Les résultats donnent les mêmes proportion que l'analyuse précédente.
Les conclusions que nous pouvons tirer de ces résultats et que NFS est vraiment performant car on ne distingue pas de différence entre la lecture d'un fichier local ou sur NFS ou soit le fichier accédés et le nombre de fois qu'il ait été accédé est insuffisant pour percevoir une différence. La deuxième hypothèse est celle qui nous parrait la plus plausible.
Discussion des résultats
Notre implnatation du serveur de fichier et d'un client fonctionne parfaitement. L'analyse de performance nous à permis d'avoir une idée des performances des appels corba réseaux en les comparant avec des appels locaux ainsi que des appels simples. Il prend en moyenne 3 fois plus de temps faire un appel réseau d'un appel Corba simple et 2 fois plus de temps qu' un appel Corba local.
Difficultés rencontrées
Les seules difficultés que nous avons rencontrées sont de trouver ou il fallait placer les noms de nos fonctions afin qu'elles puissent etre utilisées ainsi que des problèmes de débuggage avec les paramètres Corba des fonctions du serveur.
Avantages et inconvénients de l'utilisation de CORBA pour les services répartis
Programmer en Corba est bien plus pratique que de programmer directement sur la couche TCP tel que fait durant le TP1. La couche TCP est transparente et cela permet de programmer des systèmes distribués bien plus facilement. Corba ne permet pas d'envoyé des objets en paramètre et cela peut-être ennuyeux par la programmation objet. L'utilisation de type Corba ajoute une petite complexité à son l'utilisation et oblige des modifications de structures lorsqu'on veut l'intégrer à un projet.