1.1 Remote Procedure Call (RPC)
Transcription
1.1 Remote Procedure Call (RPC)
Copyright (C) 1997-2007. JM Rodriguez. Tous droits réservés. Reproduction interdite par tous moyens sauf à des fins de citation. 1.1 Remote Procedure Call (RPC) Le modèle Client-Serveur est un modèle simple à utiliser pour la structuration des systèmes répartis. Mais ce modèle s’appuie sur des communications de type entrée/sortie (SEND / RECEIVE). Ce n’est pas le modèle plus efficace pour les systèmes répartis car son but est de rendre le comportement des systèmes répartis identique à celui des systèmes centralisés. 1.1.1 Fonctionnement d’un appel à procédure (machine unique) Count = read ( fd, buf, nbytes) ; • fd = entier. • Buf = Tableau de caractères. • Nbytes = entier. 1. Lorsque le programme principal appelle la procédure read il place les paramètres dans la pile. 2. Lorsque la procédure read a terminé son traitement, elle : • Place le résultat dans un registre. • Efface l’adresse de retour. • Rend la main à l’appelant. 3. L’appelant enlève les paramètres de la pile pour retourner à son état original. Les paramètres peuvent être passés : • Par valeur. • Par référence. • Par Copy / restore. 1.1.2 Fonctionnement du RPC On veut que l’appel à une procédure distante se fasse comme si l’appel était local. Même si cela doit être transparent pour l’utilisateur, il est nécessaire que le mécanisme RPC mette en place des versions différentes pour l’appel d’une procédure selon qu’elle soit locale ou distante. On va donc avoir une souche client (client stub) et une souche serveur (server stub). Souche Client : • La version cliente de la procédure est constituée d’une souche cliente (« client stub ») qui est placée dans la librairie locale. • L’appel se fait ensuite comme avec une procédure locale (la pile est gérée localement) et l’exécution est prise en charge par le noyau. • Par contre, les paramètres ne sont pas stockés dans les registres et aucune donnée n’est demandée au noyau. Jean-Michel Rodriguez Systèmes et applications répartis 2002-2007 Copyright (C) 1997-2007. JM Rodriguez. Tous droits réservés. Reproduction interdite par tous moyens sauf à des fins de citation. • • Les paramètres sont stockés dans un message construit par le noyau et envoyé au serveur distant qui contient la partie serveur de la procédure. Le client attend ensuite que le serveur lui réponde. Souche Serveur : • La version serveur de la procédure est constituée d’une souche serveur et de la procédure. • Lorsque le message parvient au serveur, le noyau passe le message à la souche correspondante (qui est en attente de messages). • La souche extrait les paramètres du message, renseigne la pile et appelle la procédure qui pense être appelée par un client local. • Lorsque la procédure a terminé son traitement, elle renseigne la pile et rend la main à la souche (voir schéma suivant). La création des souches (stubs) est de la responsabilité du compilateur. À la compilation les stubs sont créés et le compilateur peut s’aider d’un langage de définition d’interfaces (IDL) 1.1.3 Le passage de paramètres Le passage de paramètres dans le cadre des RPCS n’est pas forcément quelque chose de simple. Dans les systèmes répartis, les machines peuvent être différentes. Des problèmes de conversion peuvent apparaître. La problématique va donc être de connaître le format du message et la plateforme cliente : • Le premier octet (Byte) du message détermine le format utilisé par le client. • Le serveur compare cet octet avec le sien : Si c’est le même aucune transformation n’est nécessaire, sinon il effectue la transformation. Jean-Michel Rodriguez Systèmes et applications répartis 2/8 2002-2007 Copyright (C) 1997-2007. JM Rodriguez. Tous droits réservés. Reproduction interdite par tous moyens sauf à des fins de citation. 1.1.3.1 Passage de pointeurs en paramètres Le pointeur (adresse) n’est connu que dans l’espace d’adressage du processus qui le crée. Cette adresse n’est valide que dans la machine où s’exécute le processus. La souche client qui récupère un pointeur, copie le contenu de la zone adressée dans le message. Au retour elle place le résultat dans la zone. 1.1.4 Localisation du serveur La localisation d’un serveur peut se faire de différentes manières : • Statique : Codée en dur l’adresse du serveur dans le client. En cas de changement de l’adresse, le client doit être recompilé (les programmes qui accèdent au serveur). • Dynamique : lien dynamique (dynamic binding). Ce lien permet de faire dynamiquement connaître les clients et les serveurs. 1.1.4.1 Le lien dynamique La construction du lien dynamique s’effectue en plusieurs étapes. Définition de la spécification du serveur qui servira à la génération des souches. À l’initialisation, le serveur exporte son interface. Il l’envoie à un binder (relieur) pour signaler son existence. C’est la phase d’enregistrement. Le serveur envoie ses informations : • nom ; • version identifiant (unique sur 32 bits en principe) ; • handle (adresse IP, protocoles, etc.). Lorsqu’un Client appelle une procédure pour la première fois : • Il constate qu’il n’est pas relié à un serveur. • Il envoie un message au relieur pour importer la version de la procédure qu’il désire invoquer. • Le relieur lui renvoie l’identifiant unique (ID) et le handle. Avantage : • Cette méthode d’importation et exportation des interfaces est très flexible. • Les serveurs peuvent s’enregistrer ou se désenregistrer. • Le client fournit le nom de la procédure et la version et il reçoit un ID unique et handle. 1.1.5 Les problèmes liés aux RPCs dans les systèmes répartis. 1. 2. 3. Le client ne peut pas localiser le serveur. L’appel du client n’arrive pas au serveur. La réponse du serveur n’arrive pas au client. Le serveur est en panne : Jean-Michel Rodriguez Systèmes et applications répartis 3/8 2002-2007 Copyright (C) 1997-2007. JM Rodriguez. Tous droits réservés. Reproduction interdite par tous moyens sauf à des fins de citation. • Il faut dissocier la panne avant l’exécution de la requête ou après l’exécution. Trois écoles pour résoudre ce problème : 1. Attendre que le serveur redémarre et relancer le traitement. « Au moins un traitement est réussi. » (peut-être plus). 2. Abandon du client et rapport de l’erreur. « Au plus un traitement est réussi. » (peut-être aucun). 3. Ne rien dire au client (aucune garantie) Seuls avantages : Facile à gérer et à implémenter. En règle générale, crash du serveur = crash du client. Le client est en panne : Lorsqu’un client tombe en panne alors qu’il a demandé un traitement à un serveur, on dit que l’échange devient orphelin. Cela a pour effet de gaspiller du temps CPU, de bloquer des ressources, lorsqu’il redémarre, il peut recevoir des messages antérieurs à la panne (problème de confusion). Quatre solutions peuvent être envisagées : 1. L’extermination : Le client enregistre les appels dans une log. Au redémarrage l’orphelin est détruit. Beaucoup d’écritures disque à chaque RPC. 2. La réincarnation : Le client tient compte du temps. Lorsqu’il redémarre, il annule les échanges ente deux époques et reprend les échanges orphelins. 3. La réincarnation à l’amiable : Comme précédemment, avec en plus la vérification avec le serveur concerné des échanges orphelins. 4. Expiration du délai : Un compteur de temps détermine quand un échange devient orphelin. Les orphelins sont détruits. Un temps T déterminé identique pour tous est donné à 1 RPC. Difficile de choisir un temps T (les RPCs sont sur des réseaux différents). 1.1.6 Les protocoles RPC Pour le protocole RPC un certain nombre de choix sont à faire. 1.1.6.1 Avec ou sans connexion. Avec connexion Avantages : • Simple à utiliser. • Pas d’ACK nécessaire. • Pas de perte de paquets. Désavantages : • Trop difficile à mettre en place sur un WAN. • Très pénalisant sur un LAN (performance pas bonne). Note : Les systèmes répartis utilisent des protocoles sans connexion. Jean-Michel Rodriguez Systèmes et applications répartis 4/8 2002-2007 Copyright (C) 1997-2007. JM Rodriguez. Tous droits réservés. Reproduction interdite par tous moyens sauf à des fins de citation. 1.1.6.2 Utilisation d’un protocole standard ou d’un protocole propriétaire. Protocole propriétaire = protocole conçu pour les RPCs. Protocole standard (IP, TCP, UDP) Avantages : • Déjà construit. • Implémentation effectuée et disponible. • Utilisable par tous les systèmes (UNIX, Windows, etc.). • Supporté par la majorité des réseaux. Désavantages : • Protocoles peu performants. • Conçus pour des connexions TCP. Protocole propriétaires Avantages : • Evite les checksums. • Longueur de paquets variables. • Adapté au système (spécialisé). Désavantages : • Beaucoup de travail de développement. • Difficile à faire adopter par les autres (nouveau protocole). 1.1.7 Accusé de réception Si une RPC doit être découpée en plusieurs petits paquets. 4Ko de données à envoyer. 0 1 2 3 Choisir entre un accusé de réception par paquet. Attente accusé avant envoi suivant. CLIENT SERVEUR 0 ACK 0 1 ACK 0 2 ACK 0 3 Jean-Michel Rodriguez Systèmes et applications répartis 5/8 2002-2007 Copyright (C) 1997-2007. JM Rodriguez. Tous droits réservés. Reproduction interdite par tous moyens sauf à des fins de citation. ACK 0 Si un problème est rencontré sur un paquet le client le renvoie. Ou seul accusé de réception à la fin de l’envoi. Envoi aussi vite qu’il peut. CLIENT SERVEUR 0 1 2 3 ACK 0, 1, 2, 3 Si un problème est rencontré sur un paquet le serveur le redemande. 1.1.8 Le chemin critique Le code de la RPC est crucial pour les performances du système. La séquence d’instructions exécutées pour chaque RPC est appelée chemin critique. C’est le temps nécessaire et rajouté par la RPC vs si le traitement était effectué en local. Ce chemin critique démarre quand le client appelle la souche client et se termine lorsque le résultat est renvoyé par le serveur. CLIENT Appel de la souche Client SERVEUR Exécution de la tâche. Serveur Prépare la mémoire tampon pour le message (Buffer). Groupe les paramètres dans le tampon. Renseigne les entêtes du message. Appel au noyau Souche Client Appelle la procédure serveur. Prépare les paramètres dans la pile. Dégroupe les paramètres. Souche Passage au contexte noyau. Copier le message dans la zone Passage au contexte de la souche. Copie le message dans la mémoire de Serveur Jean-Michel Rodriguez Systèmes et applications répartis 6/8 2002-2007 Copyright (C) 1997-2007. JM Rodriguez. Tous droits réservés. Reproduction interdite par tous moyens sauf à des fins de citation. mémoire noyau. Détermine l’adresse destination. Place l’adresse dans l’entête du message. Initialise l’interface réseau. Démarre le timer. Noyau la souche. Verif que la souche est en réception. Choisir la souche concernée. Contrôle la validité du paquet. Interruption. Noyau Note : La question intéressante ensuite est : Quelle est lapartie du chemmin critique où l’on passe le plus de temps. La réponse permet de savoir où l’effort d’optmisation doiy être fait. Voir graphes page 91 (sec2.4) du D.0.S Tanenbaum. 1.1.9 Gestion du temps (timer) Tous les protocoles sont basés sur des échanges de messages sur les moyens de communication. Les messages peuvent être perdus et créer de graves problèmes d’intégrité dans le système. Un des moyens de pallier ce problème est la mise en place d’un timer (gestion du temps). Qui va associer un horodatage à chacun des messages et définir une durée de vie (délai d’expiration). Si le temps imparti pour la durée de vie d’un message est écoulé, le message sera renvoyé. Le nombre de renvois est défini dans le protocole. Deux méthodes peuvent être envisagés : 1. Mise en place d’une structure spécifique. 2. Insertion d’un champ dans la table des processus. 1.1.9.1 Mise en place d’une structure spécifique Une structure va être construite : • Spécification de l’expiration. • Quelles sont les actions à prendre en cas d’expiration. • La structure sera insérée dans une liste existante (qui contient d’autres structures). La liste doit être surveillée. La liste est triée par temps. Lorsqu’un message est envoyé la liste est mise à jour. Lorsqu’un accusé de réception ou une réponse revient,l’entrée est retirée de la table. Note : Parce que la plupart du temps les timers n’ont pas le temps d’expirer, on perd beaucoup de temps à insérer puis effacer les entrées non expirées. Donc une autre approche peut être envisageé. 1.1.9.2 Insertion d’un champ dans la table des processus. L’idée est de rajouter une entrée « expiration » dans la table des processus. Jean-Michel Rodriguez Systèmes et applications répartis 7/8 2002-2007 Copyright (C) 1997-2007. JM Rodriguez. Tous droits réservés. Reproduction interdite par tous moyens sauf à des fins de citation. La mise à jour des timers devient quelques instructions en langage machine. A intervalles réguliers (toutes les secondes) le noyau parcourt la table et compare les timers avec le temps courant. 1.1.10 Quelques problèmes liés aux RPCs Principe de transparence L’introduction d’un mécanisme RPC dans un système mono-processeur ne doit pas : • Générer un nouvel ensemble de règles qui empêche la construction d’objets qui était possible avant. • Impliquer l’utilisation obligatoire d’objets optionnels auparavant. Problème des variables globales : • Comment peut-on accéder à des variables globales à partir de procédures distantes ? • Les accès doivent être construits. Le principe de transparence est donc violé. Problème des paramètres variables : Comment le passage de paramètres dont on ne connaît pas la taille à priori peut se faire ? (Par exemple les tableaux en langage C). Idée : On peut coder les longueurs en dur mais : • Si taille des données < maxi : perte d’espace. • Si taille des données > maxi : erreur. Comment gérer le passage de pointeur sur un graphe complexe ? Jean-Michel Rodriguez Systèmes et applications répartis 8/8 2002-2007