Mise à jour (enfin!) du dernier semestre de cours
This commit is contained in:
107
cours/A61/20091202-Seance1
Normal file
107
cours/A61/20091202-Seance1
Normal file
@ -0,0 +1,107 @@
|
||||
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.
|
||||
|
||||
|
Reference in New Issue
Block a user