Académique Documents
Professionnel Documents
Culture Documents
http://sardes.inrialpes.fr/people/krakowia
L’effet doit être identique dans les deux cas, vu de p Dans la pratique, ce
n’est pas vrai en toute rigueur
© 2003-2004, S. Krakowiak 2
! Limitations de taille
" Exemple : entiers sur 64 bits vs 32 bits
appelant appelé
! Passage par référence (adresse) procedure double_incr (x, y)
" Impossible puisque espaces distincts x := x+1 Quel est l’effet de :
y := y+1 a:= 0; double_incr (a, a) ?
! Palliatifs possibles V
" Interdire l’appel par référence
" Utiliser l’appel par copie-restauration
# Équivalent le plus souvent … x +1 x 0 0
y copie
# … mais pas dans tous les cas (aliasing) y +1 0 0
" Programmer à la main les procédures d’emballage-déballage +1
a 0 a 0 initial traitement
pour les structures complexes initial +1
" Nouveaux modèles de communication (mémoire virtuelle référence x 1 1
répartie) : revient à un espace commun a 2 final y restauration
1 1
a 1 final
A B C A B C
E D E D
! Congestion du réseau ou du serveur
" Panne transitoire (ne nécessite pas d’action)
! Panne du serveur après émission de l!’appel
" Détection : expiration du délai de garde A ou D
" Plusieurs moments possibles
" Reprise (délai de garde A)
# Avant B, entre C et D, entre fin traitement et D
# Le talon client (A) réémet l!’appel (même identificateur) sans
intervention de l!’application # Traitement : pas fait, partiel, total
# Le service d’exécution (C) détecte que c’est une réémission " Détection : expiration du délai de garde A
$ Appel en cours : aucun effet
$ Retour déjà effectué : réémission du résultat
" Reprise
" Reprise (délai de garde D) : réémission du résultat # Le client réémet l’appel dès que le serveur redémarre
" Sémantique # Sémantique : au moins une fois
# Si défaillance transitoire : exactement une fois $ Le client ne connaît pas l’endroit de la panne
# Si défaillance permanente : détection, exception vers application # On peut faire mieux avec un service transactionnel
$ Mémorise identificateur de requête et état avant exécution
A B C
E D
! Principe
! Panne du client après émission de l’appel " La structure des talons est bien définie et ils peuvent être
" L’appel est correctement traité créés automatiquement
# Changement d’état du serveur " Renseignements nécessaires
# Le processus exécutant courant est déclaré “orphelin”
# Dépendants de l’environnement local : procédures de
" Détection : expiration du délai de garde D, n réémissions conversion, protocole de communication
infructueuses
# Dépendants de l’application : formats des paramètres et
# Action du serveur : élimination des orphelins résultats (pour !emballage-déballage)!; c!’est l’interface
$ Consomment des ressources
de la procédure
" Reprise (après redémarrage du client)
# L’application cliente réémet l’appel (id. différent) ! Mise en œuvre
$ Sémantique : au moins une fois
" Les informations nécessaires dépendantes de l’application
$ Le serveur ne peut pas détecter qu!’il s!’agit d’une répétition
% Pas d!’incidence si idempotent sont décrites dans un langage de définition d’interfaces (IDL)
$ On peut faire mieux, si le client a un service de transactions
gcc exécutable C S
application client
client ! Interface = “contrat” entre client et serveur
proc_client.c I
talon client " Définition commune abstraite
proc_clnt.c
# Indépendante d’un langage particulier (adaptée à des
langages multiples)
description # Indépendante de la représentation des types
conversion définitions
d’interface rpcgen proc_xdr.c proc.h bibliothèques # Indépendante de la machine (hétérogénéité)
proc.x
" Contenu minimal
# Identification des procédures (nom, version)
talon serveur
proc_svc.c # Définition des types des paramètres, résultats, exceptions
application # Définition du mode de passage (IN, OUT, IN-OUT)
serveur
proc_server.c exécutable " Extensions possibles
gcc serveur
# Procédures de conversion pour types complexes
fourni par programmeur
# Propriétés non-fonctionnelles (qualité de service), non
outils et services standard)
engendré automatiquement
…
main(argc, argv)
int argc ; char * argv ;
{
CLIENT *clnt ;
char * host
…
if (argc <2) {
printf(“usage: %s server_host\n“, argv[0]) ;
exit(1)
{
host = argv[1] ;
© 2003-2004, S. Krakowiak 29