108 lines
2.8 KiB
Plaintext
108 lines
2.8 KiB
Plaintext
|
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.
|
||
|
|
||
|
|