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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |