Jeudi 12 février 2009
A61
Pierre.Gancarski@lsirt.u-strasbg.fr
Pôle API
C334

Dernier cours = examen

====== Cours  sur RPC ======

Ne jamais dit ON !!!

Il ne faut pas dire le programme boucle, mais dire : ce processus tourne ici, boucle, fait ceci, cela, etc.

On doit être définissable en terme de processus.

Calcul = suite d'instruction

Procédure est comme calcul aussi. C'est mieux que de dire "service".

Pour s'occuper de mettre en relation deux machines (ou plusieurs), il faut : 
  * réseau
  * identifiant
  * un langage commun
  * un mécanisme pour renvoyer la réponse

Cet ensemble de techniques existent depuis un bout de temps, années 80, et se nomme RPC : 

RPC = Remote Procedure Call

===== Problème =====

Comment "permettre" à une personne sur une machine de demander l'exécution d'une procédure sur une autre machine ?

==== Rappel ====

Dans un programme : 

<code java>
int a, b;
a = 0; b = 12;
a=f(b);
</code>

<code java>
int f(int x) {
    return x++;
}
</code>

  * Le MC (?mémoire centrale?) va allouer de l'espace mémoire à A, puis à B.
  * Puis la pile va mémoriser l'adresse de retour de la fonction.
  * La pile va empiler les paramètres de la fonction (il empile la valeur : 12)
  * Il va crée X puis va mettre dedans la valeur du paramètre (12)
  * Puis il prend la fonction et fait 12 + 1 = 13 => il remplace X par 13
  * Puis il va remplacer A par 13 dans la mémoire centrale

à un appel de fonction correspond un saut. Pour réaliser ce saut il faut empiler les paramètres, c'est à dire créer autant de case que de paramètres. Recopier la valeur des paramètres dans les variables de la fonction et ensuite exécuter la fonction.

La fin de la fonction stocke le résultat, vide la pile, prend l'adresse de retour pour terminer la fonction, et faire ce qu'il faut avec le résultat.

MC = Le tas !!!

----

Si on en venait à mettre la fonction sur une machine M2, le code Java étant sur M1, il nous faudrait : 
  * Contacter M2
  * Demander le numéro de processus dans lequel trouver F
  * Prendre F
  * Donner les paramètres que la fonction F a besoin

Ceci reviendrait à remplacer a = f(b) par  :
<code java>
a = callprc(M2, f, 12);
</code>

Sur la machine M2, on doit avoir une fonction qui attend qu'on lui donne des choses : 
<code java>
main {
    registerrpc(f);
    svc_run();
}
</code>

Où *svc_run* correspond à : 
<code java>
    (nom, prénom, machine_retour) = attendre();
    if (nom == f) {
         a= f(paramètre);
    }
</code>

Nom = f
prénom = 12

Maintenant que svc_run permet d'appeler la fonction, il doit renvoyer le résultat.

==== Registerrpc ====

A besoin de  :
  * N° de programme
  * N° de version
  * N° de fonction

Ceci pourrait se comparer à des numéros de téléphone au sein d'une machine, bien que la machine n'ait qu'une et une seule adresse mais plusieurs codes pour les fonctions.


